Иногда бывает так, что, набирая предложение, я отвлекаюсь и в итоге набираю одну и ту же пару слов, дважды пару слов дважды подряд.
Чтобы убедиться, что других людей это не беспокоит, ваша задача - написать программу, которая решит эту проблему!
задача
Если задана строка ввода (если это имеет значение для вашего языка, вы можете предполагать ввод только для ASCII, который не содержит перевода строки.) str
, Который содержит где-то посередине подстроку, которая встречается дважды подряд, вернуть строку с одним экземпляром этого подстрока удалена.
В случае множественных возможностей, верните самый короткий из возможных ответов (то есть выберите самую длинную последовательную повторяющуюся подстроку и удалите ее).
В случае нескольких одинаково длинных последовательных повторяющихся подстрок удалите первую (то есть первую, встречающуюся при чтении строки спереди назад).
Вы можете предположить, что ввод правильный (т. Е. Всегда содержит последовательную повторяющуюся подстроку), что может помочь в этом.
Примеры
- Вход:
hello hello world
-> Вывод:hello world
. - Вход:
foofoo
-> Вывод:foo
. (Итак: Да, строка может состоять только из повторяющейся части дважды). - Input:
aaaaa
-> Output: здесьaaa
находится самая длинная повторяющаяся последовательная подстрокаaa
. - Input:
Slartibartfast
-> Это недопустимый ввод, так как он не содержит последовательно повторяющейся подстроки, поэтому вам не нужно обрабатывать этот случай. - Ввод:
the few the bar
-> Это еще один неверный ввод, так как повторяющаяся часть должна следовать сразу же за исходной частью. В этом случаеthe
иthe
разделяются чем-то еще между ними, поэтому этот ввод недействителен. - Вход:
ababcbc
-> Вывод:abcbc
. Две возможные самые длинные последовательные повторяющиеся подстроки - этоab
иbc
. Какab
встречалось ранее в строке, это правильный ответ. - Вход:
Buffalo buffalo Buffalo buffalo buffalo buffalo Buffalo buffalo
. Выход:Buffalo buffalo buffalo buffalo Buffalo buffalo
. (Произведенная замена должна быть чувствительной к регистру). - Вход:
Sometimes it happens that while typing a sentence, I am distracted and I end up typing the same couple of words twice couple of words twice in succession.
-> Вывод:Sometimes it happens that while typing a sentence, I am distracted and I end up typing the same couple of words twice in succession.
. Только самая длинная последовательная повторяющаяся подстрока удаляется.
Ваш код должен быть как можно короче, поскольку это код-гольф , поэтому выигрывает самый короткий ответ в байтах. Удачи!
Sometimes it happens that while typing a sentence, I am distracted and I end up typing the same couple of words twice couple of words twice in succession.
как ввод, вывод должен бытьSometimes it happens that while typing a sentence, I am distracted and I end up typing the same couple of words twice in succession.
. Только самое длинное найденное дублирование удаляется.p
вhappens
Ответы:
Perl 6 , 40 байт
Попытайся
источник
Retina ,
3533 байтаЧисло байтов предполагает кодировку ISO 8859-1.
Попробуйте онлайн!
объяснение
Так как движки регулярных выражений ищут совпадения слева направо, нетривиально найти самое длинное совпадение независимо от позиции. Это можно сделать с помощью балансировочных групп .NET, но результат довольно неприятный:
Поэтому я решил, что постараюсь избежать этого, используя некоторые другие функции Retina.
Мы начинаем с применения всех возможных подстановок, по одной на каждой строке. Для этого мы сопоставляем позицию перед совпадением (а не само совпадение), чтобы обеспечить совпадение совпадений. Это сделано, помещая реальное регулярное выражение в перспективу. Затем этот запрос захватывает оставшиеся, кроме дубликата, который мы хотим удалить в группе 2. Мы записываем обратно группу 2 (удаление дубликата), перевод строки, а затем весь ввод до совпадения, что дает нам в основном новую строку для быть замененным.
В конце у нас будет по одной строке для каждого совпадения с удалением соответствующего дубликата. В конце также будет полный ввод без каких-либо замен.
Теперь, когда у нас есть все возможные замены, мы хотим самый короткий результат (который соответствует самому длинному удаленному повторению).
Поэтому мы сначала сортируем строки по длине.
И тогда мы оставим только первую строчку.
источник
Желе ,
2219 байт-2 байта благодаря Деннису (избежать перестановки аргумента, удалить слегка избыточное приращение)
Попробуйте онлайн!
Полная программа (была обнаружена ошибка,
ÐṀ
связанная с неправильным действием arity над диадами, которая будет исправлена в ближайшее время; хотя я не уверен, что это может привести к более короткому коду здесь).Как?
Находит первый из самых длинных срезов ввода, так что повторение существует во входе, и удаляет его из ввода.
источник
JavaScript (ES6),
8174 байтаРедактировать: спас 7 байтов, украв
m[r.length]
уловку Арно .источник
PowerShell , 87 байт
Попробуйте онлайн! (все тесты)
объяснение
Начиная с внутренней стороны в основном, мы бежим
Matches
с(.+)\1
регулярным выражением, чтобы вернуть все объекты соответствия для указанной строки. Регулярное выражение соответствует любой последовательности символов, за которой следует сама.Затем полученные объекты
sort
соответствия сортируются по ихLength
свойству (сокращенному до подстановочного знака). Это приводит к массиву совпадений, отсортированных по длине, по возрастанию, поэтому индексируйте,[-1]
чтобы получить последний элемент (самый длинный). Значение этого совпадения - это совпадение, а не группа, поэтому оно включает в себя повторение, поэтому мы извлекаем объект Group (|% Gr*
), а затем значение этого (|% V*
), чтобы получить наибольшую повторяющуюся строку. Дело в том, что объект группы на самом деле является массивом, потому что группа 0 всегда совпадает, но я хочу фактическую группу (1), поэтому результирующее значение на самом деле значение s , следовательно, индексирование для получения второго элемента[1]
. Это значение преобразуется в сам объект регулярного выражения, а затемReplace
метод вызывается для исходной строки, заменяется ничем, и заменяется только первое совпадение (|% Re* $s '' 1
).источник
Haskell , 101 байт
Основная функция
f
, она принимает и возвращаетString
.Попробуйте онлайн!
Когда я начал это, я импортировал
Data.List
и используетсяmaximum
,tails
,inits
иisPrefixOf
. Каким- то образом это превратилось в это. Но мне все же удалось только сбрить 11 байтов ...Заметки
splitAt
/a
разбивает строку по заданному индексу.s
является входной строкой.i
список чисел[0 .. length s - 1]
,-1
который нужно обойти, которыйsplitAt
разделяется в конце, если задан слишком большой индекс.n
этоlength s
минус цель длина повторяющейся части, она выбрана таким образом , чтобы мы не должны использовать два списка номер и / или многословным уменьшая синтаксис списка.p
,r
иt
являются трехсторонним разделениемs
, сr
предполагаемой повторяемой частью.fmap
Там использует ,(,) String
Functor
чтобы избежать переменной для промежуточного разделения.!!0
выбирает первый элемент списка совпадений.источник
Желе ,
2321 байтСпасибо @JonathanAllan за его
Ṭœp
идею, которая сэкономила 2 байта.Попробуйте онлайн!
источник
Mathematica,
636059 байт4 байта сэкономлено благодаря Мартину Эндеру .
Анонимная функция. Принимает строку в качестве ввода и возвращает строку в качестве вывода.
источник
~SortBy~StringLength
сортирует строки по алфавиту, если их длина одинакова ...SortBy
и обернутьStringLength
в список, чтобы получить стабильную сортировку.JavaScript (ES6), 70 байт
Контрольные примеры
Показать фрагмент кода
источник
aaaabaaab
, но приятно использоватьreduce
.Это должен быть комментарий, но у меня недостаточно репутации, чтобы комментировать. Я просто хочу сказать @Neil, что его код может быть уменьшен до 77 байтов. Вам не нужно использовать прямое утверждение в регулярном выражении. Вот уменьшенная версия:
источник
aabab
это самый короткий пример того, где ваше предложение терпит неудачу.C #, 169 байт
объяснение
Это подход грубой силы: пробуйте каждую возможную подстроку, пока мы не найдем самую длинную повторяющуюся подстроку. Несомненно, Regex более эффективен, но работа с Regex в C # имеет тенденцию быть достаточно многословной.
источник
PHP,
8482 байтаПримечание: используется кодировка IBM-850.
Запустите так:
объяснение
Tweaks
источник