вход
Буквенно-цифровая строка s
.
Выход
Самая короткая строка, которая встречается ровно один раз как (непрерывная) подстрока в s
. Перекрывающиеся события считаются различными. Если есть несколько кандидатов одинаковой длины, вы должны вывести их всех в порядке появления. В этом вызове пустая строка встречается n + 1
раз в строке длины n
.
пример
Рассмотрим строку
"asdfasdfd"
Пустая строка встречается в ней 10 раз, поэтому она не подходит для уникального вхождения. Каждая из букв "a"
, "s"
, "d"
и "f"
происходит , по крайней мере в два раза, так что они не являются кандидатами либо. Подстроки "fa"
и "fd"
встречаются только один раз и в этом порядке, тогда как все остальные подстроки длины 2 встречаются дважды. Таким образом, правильный вывод
["fa","fd"]
правила
И функции, и полные программы разрешены, а стандартные лазейки - нет. Точное форматирование вывода является гибким, в пределах разумного. В частности, создание вывода для пустой строки допустимо, но выдача ошибки - нет. Побеждает самое низкое число байтов.
Контрольные примеры
"" -> [""]
"abcaa" -> ["b","c"]
"rererere" -> ["ererer"]
"asdfasdfd" -> ["fa","fd"]
"ffffhhhhfffffhhhhhfffhhh" -> ["hffff","fffff","hhhhh","hfffh"]
"asdfdfasddfdfaddsasadsasadsddsddfdsasdf" -> ["fas","fad","add","fds"]
Leaderboard
Вот список лидеров по языкам, который я обещал.
Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:
# Language Name, N bytes
где N
размер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:
# Ruby, <s>104</s> <s>101</s> 96 bytes
<script src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js'></script><script>site = 'meta.codegolf',postID = 5314,isAnswer = true,QUESTION_ID = 45056;jQuery(function(){var u='https://api.stackexchange.com/2.2/';if(isAnswer)u+='answers/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJeRCD';else u+='questions/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJO6t)';jQuery.get(u,function(b){function d(s){return jQuery('<textarea>').html(s).text()};function r(l){return new RegExp('<pre class="snippet-code-'+l+'\\b[^>]*><code>([\\s\\S]*?)<\\/code><\/pre>')};b=b.items[0].body;var j=r('js').exec(b),c=r('css').exec(b),h=r('html').exec(b);if(c!==null)jQuery('head').append(jQuery('<style>').text(d(c[1])));if (h!==null)jQuery('body').append(d(h[1]));if(j!==null)jQuery('body').append(jQuery('<script>').text(d(j[1])))})})</script>
Ответы:
Pyth,
2726 байтовПопробуй это здесь.
Обратите внимание, что из-за ошибки в онлайн-компиляторе регистр пустой строки корректно работает только в версии командной строки, которую можно найти здесь.
Вы также можете исправить ошибку, указав новую строку в качестве ввода для онлайн-компилятора.
Объяснение:
источник
z
ни один ввод не дает сбоя в сети, так что это определенно ошибка в интерпретаторе.Python 3,
12412311196 байтИщет такие строки, что первое вхождение слева совпадает с первым вхождением справа. Значение
+1
inrange
предназначено для случая пустой строки.Теперь, если бы только Python имел
.count()
подсчет совпадений , то это было бы немного короче.источник
Mathematica,
959479 байтовStringCases
получает все возможные подстроки,Tally
иCases
отфильтровывает те, которые появляются более одного раза, иMinimalBy
находит самые короткие.источник
&
в конце кода нет ничего лишнего ?GolfScript, 44 байта
Принимает ввод как строку в stdin и выводит в синтаксисе двойного массива: например
[["b"] ["c"]]
. Онлайн деморассечение
Это устроено так, что для пустой строки не требуется особый случай (который я включил в качестве контрольного примера в онлайн-демонстрацию, указанную выше).
источник
CJam,
52 4340 байтВвод строки без кавычек
Пояснение :
Пример:
Выход
Попробуйте онлайн здесь
источник
Скала, 120 байт
Я начал с 140, который по крайней мере уже вписывается в твит.
источник
(_)
работает как личность вместоl=>l
?list.groupBy(_)
то так же, какx => list.groupBy(x)
. Я понятия не имею, почему они реализовали это так.JavaScript (ES6), 109
110Отредактируйте поиск вместо indexOf, так как входная строка буквенно-цифровая. Спасибо @IsmaelMiguel
Рекурсивная функция, ищущая подстроки, начинающиеся с длины 1 и идущие вверх.
Разгромил и объяснил
Тест в консоли FireFox / FireBug
Выход
источник
.search
вместо,.indexOf
и вы сохраните 2 байта.s.indexOf(a)+1
). Хотя это не работает с этими символами, вам не нужно беспокоиться! Цитируя ОП: «Input: An alphanumeric string s.
»Ява, 168
176 233Вот довольно простой пример вложенного цикла.
Или немного более читабельным:
источник
+++
, чтобы показать, поможет ли это+ ++
или++ +
поможет ... И если вы хотите сэкономить еще несколько байтов, может быть способ сделать это путем инициализацииq=1
, заменыq++
наq=t
и заменыl++<t&q<1
чем-то вродеt>l+=q
. Вероятно, требуется настроить одно или два других смещения, чтобы заставить его работать.+++
. Я пытался настроить его (особенноq
, который кажется несколько расточительным), но пока не нашел ничего солидного.+++
всегда разрешается++ +
.Хаскелл,
169162155153151138120115Чтобы использовать это:
Который дает:
Btw. Я ненавижу последнюю строку моего кода (повторениеh y
). Кто-нибудь намекает, чтобы избавиться от этого?источник
g y=q(minimum.(map l)$y)$y
(map l
действительно ли нужны круглые скобки ?), А затемf=g.concat.q 1.group.sort.concatMap inits.tails
?>>=
вместоconcatMap
, т.е.f x=p$concat$q 1$group$sort$(tails x>>=inits)
экономит 2 байта. ПочемуData.Ord
импорт?q
ненужны, так как вы можете написатьfilter$(==)k.l
, как и последний$
и пробелы передy
s вp
. Вы также можете удалить точки с запятой после импорта (Data.Ord
кажется, действительно ненужным).$
последующим пробелом. Он побреет несколько байтов, но есть ли это в спецификации языка?J
61584442403837 байтВот версия, разделенная на отдельные компоненты решения:
x #/. y
вычисляет для каждого отдельного элемента,x
как часто происходит вy
. Если мы используем это какy #/. y
, мы получаем для каждого отдельного элемента вy
его количестве. Например,a #/. a
дляa =. 1 2 2 3 4 4
урожайности1 2 1 2
.1 = y
проверяет, какие элементыy
равны1
. Например,1 = a #/. a
урожайность1 0 1 0
.u~
является рефлексивным монадического глаголаu
. Это такu~ y
же, какy u y
. Таким образом, так#/.~ y
же, как#/.~ y
. При применении к двоичному глагола,u~
является пассивным изu
. Тоx u~ y
есть так же, какy u x
. Они используются во многих других местах, которые я не упоминаю явно.~. y
является гвоздем изy
, вектор с дубликатами удалены. Например,~. a
урожайность1 2 3 4
.x # y
( копия ) выбирает изy
элементов по индексам, гдеx
содержится1
.(1 = y #/. y) # (~. y)
создается вектор тех элементов, изy
которых появляются только один раз. В молчаливом обозначении этот глагол записывается как~. #~ 1 = #/.~
; давайте назовем эту фразуunqs
для остальной части объяснения.x ]\ y
создает массив всех инфиксов вектора длиныx
by . Например, урожайность1 + y - x
y
x
3 ]\ 'asdfasdfd
# y
это число изy
, то есть, количество элементов вy
.u\ y
применяетсяu
к каждому префикса изy
. Между прочим,#\ y
создает вектор целых чисел из1
в#y
.< y
кладетy
в коробку. Это необходимо, потому что массивы нельзя разорвать, и мы вычисляем массив суффиксов различной длины; в штучной упаковке массив считается как скаляр.Таким образом,
(i. # y) <@:unqs@(]\) y
генерируется вектор#y
штучных массивов длины k (для всех 0 ≤ k <#y
) инфиксов y, которые встречаются ровно один раз. Молчаливая форма этого глагола -i.@# <@unqs@(]\) ]
или,i.@# <@(~. #~ 1 = #/.~)@(]\) ]
если мы не используемunqs
имя. Давайте назовем эту фразуallsbsq
для остальной части этого объяснения. Например,allsbsq 'asdfasdfd'
дает:(#@> y) # y
берет из вектора штучных массивовy
те, которые не пусты.{. y
занимает первый элемент вектораy
.> y
удаляет окно сy
.> {. (#@> y) # y
получается неупакованный первый непустой массив из вектора штучных массивовy
. Эта фраза написана>@{.@(#~ #@>)
в негласной записи.Наконец,
[: >@{.@(#~ #@>) allsbsq
собирает предыдущую фразу с,allsbsq
чтобы создать решение проблемы, которую мы имеем. Вот полная фраза с пробелами:источник
Haskell, 135 байт
источник
PHP,
171152134125http://3v4l.org/RaWTN
источник
$j=0
. Впереди у вас естьsubstr($s,$j++,$i)
. Без определения$j
вы можете переписать этоsubstr($s,0+$j++,$i)
и сохранить 2 байта. Почему это? Ну, первый раз,$j
будетnull
. И вы будете эффективно переходитьnull
кsubstr
, что я не думаю, что это будет работать хорошо. Использование0+$j++
преобразуетnull
в0
. Если вы видите, что это не нужно, продолжайте без него и просто удалите$j=0
деталь.$j
не очищается и не инициализируется повторно для каждой итерацииwhile()
цикла. Таким образом , в то время как это нуль (и , следовательно , будет преобразован0
по$j++
вызову) первый раз, на последующих итераций внешнего цикла он оставил на значении это было раньше. Это не столько инициализация, сколько сброс. Спасибо за предложение, хотя :-)function f($s){$l=strlen($s);while(!$a&&++$i<$l)for($j=0;$j<$l;)($b=substr($s,$j++,$i))&(strpos($s,$b)==strrpos($s,$b)&&($a[]=$b));return$a;}
Изменения: Убрал ВСЕ ваши||1
, использовал побитовый&
(AND
) вместо&&
одного места, переместил$j<$l&&[...]
деталь за пределыfor
(сохраняя 2 байта) и удалил некоторые ненужные скобки.function f($s){$l=strlen($s);while(!$a&&++$i<$l)for($j=0;$j<$l;)strpos($s,$b=substr($s,$j++,$i))==strrpos($s,$b)&&($a[]=$b);return$a;}
Изменения, внесенные в предыдущий код: перенесли$b=substr($s,$j++,$i)
вstrpos($s,$b)
созданиеstrpos($s,$b=substr($s,$j++,$i))
, удалили ненужные скобки и удалили ненужные&
.substr($s,$j++,$i)
возвращает,""
когда$j
достигает длины строки, иfalse
после этого, так что присваивание также может служить условным разрывом цикла. Тогда есть только одно использование$l
оставшихся, так что это также можно объединить.Groovy (Java regex для реализации Oracle), 124
Протестировано на Groovy 2.4 + Oracle JRE 1.7. Регулярное выражение должно работать для Java 6 - Java 8, так как ошибка, которая позволяет коду выше работать, не исправлена. Не уверен в предыдущей версии, поскольку в Java 5 есть ошибка, которая была исправлена в Java 6.
Регулярное выражение находит самую короткую строку, которая не имеет повторяющейся подстроки в другом месте, в каждой позиции входной строки. Код снаружи заботится о фильтрации.
(?=...)
.(.*?)
поиск из самой короткой подстроки(?=(.*))
захватывает остальную часть строки, чтобы отметить текущую позицию.(?<=^(?!.*\1(?!\2$)).*)
является эмуляцией поиска переменной длины, которая использует ошибку реализации, которая позволяет(?<=.*)
пройти проверку длины.(?!.*\1(?!\2$))
просто проверяет, что вы не можете найти такую же подстроку в другом месте.(?!\2$)
Отклоняет исходное положение , в котором сопоставляется подстрока.Предел внешней конструкции просмотра не применяется к вложенной конструкции просмотра. Следовательно, вложенный отрицательный упреждения
(?!.*\1(?!\2$))
фактически проверяет всю строку, а не только до правой границы упреждения .источник
Rebol, 136 байтов
Ungolfed:
Пример использования:
NB. Я полагаю, суть кода в том, как работает эта
find
часть. Надеюсь, это поможет объяснить ...источник
Хаскелл, 119
источник
q = length
куда-нибудь и использоватьq
, сбривает несколько байтовБрахилог , 10 байт
Попробуйте онлайн!
Хотя
ᵍ
он не сортируется естественным образом по значению, по которому он группируется, а упорядочивает группы по первому вхождению каждого значения, первые вхождения каждой длины располагаются в порядке убывания. Я не уверен на 100%, что фильтрация уникальности не может испортить это, но я еще не придумал тестовый пример, который пока не проходит.источник
05AB1E , 10 байтов
Ничего не выводит для пустой строки.
Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
Это использует преимущество 05AB1E, имеющего только
1
истинную ценность, а все остальное - ложь. Самая короткая уникальная подстрока всегда гарантированно встречается ровно один раз для всех возможных строк ввода. (Для входной строки, содержащей только те же символы (т. Е.aaaaa
), Сама входная строка как подстрока встречается только один раз, поэтому результат таков["aaaaa"]
. Для входной строки с повторяющимся шаблоном (т. Е."abcabc"
) Все еще существуют уникальные подстроки, которые только произойдет один раз (["abca","abcab","abcabc","bca","bcab","bcabc","ca","cab","cabc"]
), так что это приведет к["ca"]
.)источник
Python 2, 150
источник
""
, но вы ничего не печатаете.Perl 5
-a
,11487 байтПопробуйте онлайн!
Старый метод: 114 байт
источник