ОБНОВЛЕНИЕ : подчинение Исаака Pyth является победителем!
Многие из вас, должно быть, слышали, что в городе есть более прохладная версия JavaScript (см. ES6), в которой есть метод String.prototype.repeat
, позволяющий
"Hello, World!".repeat(3)
и получить
"Hello, World!Hello, World!Hello, World!"
в качестве выхода.
Ваша задача - написать функцию или программу на языке по вашему выбору, который определяет, не была ли строка подвергнута такому преобразованию.
т.е. входная строка может быть представлена как точное n
повторение времен меньшей строки. Вывод (как оператор возврата функции или STDOUT) должен быть правдивым, если строка может быть, или ложным, если строка не может быть представлена как повторение строки меньшего размера.
Некоторые примеры ввода:
"asdfasdfasdf" // true
"asdfasdfa" // false
"ĴĴĴĴĴĴĴĴĴ" // true
"ĴĴĴ123ĴĴĴ123" // true
"abcdefgh" // false
Обратите внимание, что последний ввод ложен, поэтому n
должен быть больше1
Полные правила
- Напишите функцию / программу на любом языке для ввода (через аргумент функции / аргументы командной строки / STDIN) строки
- Возвращает / печатает истинное значение, если данная строка сформирована путем точного повторения меньшей строки, повторяющейся, по крайней мере, дважды.
- Максимальный размер входной строки в идеале бесконечность
- Строка может содержать все возможные символы ASCII
- Это код-гольф, поэтому выигрывает самый маленький код в символах.
Ответы:
Пиф , 9
Или
Оба являются близкими переводами ответа Python @ xnor, за исключением того, что они принимают ввод из STDIN и распечатывают его. Первый эквивалентен:
0 для False, 1 для True.
Вторая строка эквивалентна:
Ложь за ложь, правда за правда.
У официального компилятора Pyth была ошибка, связанная со второй, которую я только что исправил, поэтому первая - это официальное представление.
источник
x
было слишком долго ...Python (24)
Проверяет, является ли строка собственной подстрокой, конкатенированной дважды, удаляя первый и последний символы, чтобы избежать тривиальных совпадений. Если это так, это должна быть нетривиальная циклическая перестановка сама по себе и, следовательно, сумма повторяющихся сегментов.
источник
..+);(;\?)
abcabc
.s+s
превращает это вabcabcabcabc
. на[1:-1]
отбивные двух концах , чтобы датьbcabcabcabcab
. а затемs in ...
пытается найтиabcabc
в качестве подстроки этого. Эта подстрока не может быть найдена ни в одной из исходных половинок, поскольку они оба были сокращены, поэтому она должна охватывать обе половины. В частности, он должен иметь свой собственный конец перед началом, что означает, что он должен состоять из одинаковых (повторяющихся) подстрок.ab
становитсяabab
становитсяba
, поэтому он возвращает ложь, аaa
становитсяaaaa
становитсяaa
, что возвращает истину.qweqweqwe
вweqweqweqweqweqw
томTrue
.Regex (на ECMAScript), 11 байт
Похоже, работа для регулярных выражений!
Проверьте это здесь.
Я выбрал ECMAScript, потому что это единственный вариант (я знаю), который
[^]
соответствует любому символу. Во всех остальных случаях мне понадобится флаг для изменения поведения.
или использование на[\s\S]
три символа длиннее.В зависимости от того, как мы рассчитываем флаг, который мог бы , конечно , быть байт короче. Например, если мы посчитаем pattern + flags (например, игнорируя разделители), эквивалент PCRE / Perl будет
Что составляет 10 байт, игнорируя разделители.
Проверьте это здесь.
Это соответствует только строкам, которые состоят как минимум из двух повторений некоторой подстроки.
Вот полная 26-байтовая функция ES6, но я утверждаю, что регулярные выражения в общем случае допустимы:
источник
^(.+)\1+$
у меня работает, что составляет 9 байт. Это не работает для вас?asd\nasd\nasd\n
. Это работает\
когда я пишу\n
вручнуюCJam, 9
Похоже на идею Кснора.
источник
)
? Я думаю, что разумно иметь -1 означает ЛОЖЬ и> = 0 означает ИСТИНАg
и?
.#
оператора поиска? Конечно, результат этого также "правдив" с точки зрения успеха против неудачи?APL, 11
Пояснение
⍞
берет строковый ввод из экранных присвоенийx←
переменной,x
,⍨
объединяет строку с самимx⍷
поискомx
в результирующей строке. Возвращает массив, состоящий из 1 в начальной позиции совпадения и 0 в другом месте.+/
суммирует2<
проверку массива, если сумма больше 2 (так как будет 2 тривиальных совпадения)источник
CJam, 10 байтов
Я поймал ошибку CJam. Мой первый ответ, так что, вероятно, можно сыграть в гольф еще:
Выходы -1 для FALSE и число> = 0 для TRUE
источник
GolfScript, 10 байт
Еще одна реализация умной идеи xnor.
источник
)
Хотя ваш код отсутствует ; когда нет совпадения, он напечатает-1
. Если вы собираетесь опубликовать это как ответ, я с удовольствием удалю свою.)
незадолго до того, как вы опубликовали свой ответ (я отредактировал комментарий)q__+)@+#)
. Это не работает в GolfScript.Python -
5957источник
Чистый bash, 30 байтов
Простой порт умного ответа @ xnor :
Код выхода 0 для ИСТИНА и 1 для ЛОЖЬ:
Заметка
=~
в[[ ... ]]
это регулярное выражение оператора в Баш . Тем не менее «Любая часть шаблона может быть заключена в кавычки, чтобы заставить его быть сопоставленным как строка» . Поэтому, как часто бывает в случае с bash, очень важно получить правильное цитирование - здесь мы просто хотим проверить соответствие строки, а не совпадение с регулярным выражением.источник
TI-BASIC - 32
Я думал, что попробую токенизированный язык. Выполнить со строкой в Ans, возвращает 0, если false, и длину повторяемой строки, если true.
Удивительно, как это однострочно.
источник
ECMAScript 6 (189)
Конечно, это единственное правильное решение? Например, слово (строка)
nana
не обязательно создается из"na".repeat(2)
источник
"nana"
нет, но вопрос не в том, проверяется,.repeat
использовался ли он или нет. Скорее, является ли строка повторной или нетECMAScript 6 (34
36)Другой ES6 ответ, но без использования
repeat
и с использованием трюка XNOR в :Должен запускаться в консоли браузера с поддержкой ES6, такого как Firefox.
источник
С 85
Оказалось, довольно долго, но внешние функции всегда такие. Мне пришло в голову, что я могу переписать каждую строковую функцию, заменив их циклической или рекурсивной. Но по моему опыту это получится дольше, и, честно говоря, я не хочу испытывать это.
После некоторых исследований я увидел решения по высокой производительности, но не такие умные (и короткие), как у xnor. просто чтобы быть оригинальным ... я переписал ту же идею в с.
объяснение:
источник
ECMAScript 6 (59
626773)Не победитель, но кажется, что в ES6 должен быть хотя бы один ответ на этот вопрос, который фактически использует
repeat
функцию:Должен запускаться в консоли браузера с поддержкой ES6, такого как Firefox.
Это делает много ненужных итераций, но зачем делать это дольше, чтобы избежать этого, верно?
источник
[...i]
вместоi.split('')
0..N
. Благодарность!.slice(0,j)
на один символ короче.substr(0,j)
. Кроме того, преобразование в целое число кажется ненужным,|0
может быть удалено (использование|0
фактически снижает полезность метода, потому что он потерпит неудачу для повторений, которые превышают 2 ^ 31).Желе , 3 байта
Попробуйте онлайн!
То же, что и этот ответ (может быть, более поздний вызов - это обобщение?).
источник
Java 8, 28 байт
Попробуйте онлайн.
Объяснение:
Проверяет, соответствует ли input-String регулярному выражению, где
String#matches
неявно добавляет,^...$
чтобы соответствовать всей String.Объяснение самого регулярного выражения:
Таким образом, он в основном проверяет, повторяется ли подстрока два или более раз (с поддержкой новых строк).
источник