Задав строку в качестве входных данных, найдите самую длинную непрерывную подстроку, которая не имеет символов дважды или более. Если таких подстрок несколько, вы можете вывести либо. Вы можете предположить, что вход находится в диапазоне ASCII для печати, если хотите.
счет
Сначала ответы будут ранжироваться по длине их самой длинной неповторяющейся подстроки, а затем по их общей длине. Более низкие оценки будут лучше по обоим критериям. В зависимости от языка это, вероятно, будет восприниматься как вызов кода-гольфа с ограничением на источник.
тривиальность
В некоторых языках набрать 1, x (язык) или 2, x (брейк-бла и другие тьюрины) довольно легко, однако есть другие языки, в которых минимизация самой длинной неповторяющейся подстроки является проблемой. Мне было очень весело получить 2 балла в Haskell, поэтому я призываю вас искать языки, где это задание весело.
Контрольные примеры
"Good morning, Green orb!" -> "ing, Gre"
"fffffffffff" -> "f"
"oiiiiioiiii" -> "io", "oi"
"1234567890" -> "1234567890"
"11122324455" -> "324"
Сдача баллов
Вы можете оценить свои программы, используя следующий фрагмент:
источник
11122324455
Джонатан Аллан понял, что моя первая ревизия не справилась с этим правильно.11122
происходит после324
, но дедуплицируется до12
.Ответы:
C, оценка 2,
747720662 байтаРаботает как минимум на 32-битном MinGW (с отключенной оптимизацией). Не использует ни одного ключевого слова.
Работает, видимо, на TIO с gcc и clang: попробуйте онлайн! (Спасибо @Dennis!)
Звоните с:
Выход:
Код с чуть более читаемым форматированием:
И это можно использовать для генерации правильного интервала, чтобы перейти к форматированию со счетом 2: попробуйте онлайн!
C, оценка 3, 309 байт
Попробуйте онлайн!
источник
Haskell , оценка 2,
492...307224212209207 байтПопробуйте онлайн!
Гольф в буквальном смысле слова сотен байтов благодаря WW и Орджану Йохансену !
объяснение
Функция
(??)
принимает символc
и строкуs
и возвращает самый длинный префиксs
, который не содержитc
. Неуправляемый и не оптимизированный для оценки:Функция
ss
использует,(??)
чтобы найти самый длинный префикс уникальных символов данной строки:(##)
это функция, которая принимает две строки и возвращает более длинную. Сравнение длины работает, повторяя строкуx
так часто, какx
long (x>>y
) иy
long (y>>x
), и проверяя, какая из полученных строк лексикографически больше.Наконец,
ff
рекурсивно обрабатывает входную строку, генерирует самый длинный префикс сss
, рекурсивно определяет самую длинную неповторяющуюся подстроку хвоста строки и возвращает длинную из двух с(##)
:источник
@
трюк на самом деле стоит 2 байта, а не просто делает?
два символа: 207Lua, оценка 3, 274 байта
Примечание: требуется Lua 5.2 или Lua 5.3
Использование:
Основная идея: чередовать все с пробелами, вставлять
" "
(два пробела), чтобы разделить длинные идентификаторыUngolfed код:
Актуальная программа (после удаления всех пар пробелов):
Кстати, фрагмент кода JS для подсчета очков не работает в моем коде.
источник
Сетчатка 0.8.2 , 37 байт, оценка 9
Попробуйте онлайн! Прямой перевод этого ответа на Retina 1 экономит байт, используя
N
вместоO#
. Однако, если вы наивно играете в ответ Retina 1 до 28 байт, его результат возрастает до 10! Объяснение:Генерация всех суффиксов ввода.
Для каждого суффикса используйте префикс до первого дублированного символа.
Сортируйте оставшиеся строки в обратном порядке по длине (т.е. сначала по длине).
Возьми самый длинный.
источник
Желе , оценка 2, 14 байт
Спасибо @JonathanAllan за оценку -1, +7 байт и за замечание ошибки.
Попробуйте онлайн!
Как это работает
источник
Чисто , оценка
75, 276 байтПопробуйте онлайн! Спасибо @ Οurous за то, что показали мне, что можно вызывать машинный код ABC прямо из Clean. Это позволяет избавиться от предыдущего узкого места, в
import
котором минимальный балл был равен 7, ноcode
для этого подхода необходимо ключевое слово, которое устанавливает минимальный балл 5.Разгруженную и не оптимизированную по счету версию вышеуказанного кода можно найти здесь: попробуйте онлайн!
Предыдущая версия со счетом 7,
158154130 байтовПопробуйте онлайн!
При этом
import
оценка не может быть ниже 7. Без импорта нужно было бы реализовать равенство в строках или символах без каких-либо библиотечных функций, что,вероятно,невозможно, как видно из новой версии выше.источник
A code block with raw ABC instructions, which can be used for primitive functions like integer addition, for linking with C, bypassing the type system... welcome down the rabbit hole!
( от cloogle ) звучит привлекательно. Я посмотрю завтра, спасибо за предложение!-IL
флаг, поскольку ничего не импортируется.Python 3 , оценка 4, 155 байт
Это определяет функцию
l
.Спасибо @xnor за указание на то, что строки длиной 3 не увеличивают счет, сохраняя 32 байта.
Попробуйте онлайн!
источник
Брахилог , оценка 2, 19 байт
Попробуйте онлайн!
Просто скучный старый ответ "из космоса все вышло". По крайней мере, я узнал, что метапредикаты могут быть удалены от предикатов и все еще работают (а (параметрические) индексы и индексы не могут).
s ᶠ
- найти все подстроки данной строкиl ᵒ
- упорядочить их по длине (по возрастанию по умолчанию)≠ ˢ
- выберите те, которые имеют все отдельные элементыt
- получить хвост (последний элемент) этого - тот, который имеет наибольшую длинуисточник
Pyth , 11 байт, оценка 4
-4 оценка благодаря Денису
Попробуйте онлайн!
источник
Шелуха , оценка 2, 10 байт
Попробуйте онлайн!
объяснение
Программа эквивалентна этому:
Встроенное
Ë
вычисляет≠
все упорядоченные пары своего аргументаx
и возвращает,length(x)+1
если каждый результат верен, в противном случае0
. Когда мы максимизируем это, мы находим самую длинную строку без повторяющихся символов.В представлении я просто вставляю функцию идентификации
I
между каждой функцией, дважды. Так какIË
это то же самоеË
,I≠
то же самое, что≠
и так далее, это не меняет семантику. Единственная опасность состоит в том, что функция более высокого порядка может решить использовать один изI
s в качестве аргумента, но, к счастью, это приводит к ошибке типа в нашей программе, поэтому этого не происходит.источник
Clojure, оценка 4
О боже, это было больно!
N
реализуетnext
,R
естьreduce
,C
естьcount
,J
естьconj
(работает только для векторов) иI
естьiterate
.apply str
есть дважды, потому что в противном случае ввод "aaaa" не вернул бы строку, а вектор[\a]
. К счастью, мне пришлось использовать,apply
иassoc
я не знал, что вы можете связать один индекс с последним элементом вектора: oисточник
Желе , оценка 5, 10 байт
Попробуйте онлайн!
источник
ẆµQQ ⁼ µ Ðf µ Ṫ
(возможно, теперь добавлено слишком много пробелов, но это всего лишь пример. Я оставлю вам оптимизацию подсчета байтов по сравнению с пробелами).Python 3 , оценка 4, 317 байт
Попробуйте онлайн!
Необработанный код:
lambda a
содержитmbda
элемент с 5 баллами, и функция нуждается в том,return
что, очевидно, не может бытьexec
отредактировано (поэтому для него требуется оценка не менее 5eturn
), поэтому была необходима полная программа. Вероятно, можно немного уменьшить размер неиспользованного кода, но я не вижу быстрого и ясного улучшения.источник
Алиса , 40 байт
(Завершающий перевод строки)
Попробуйте онлайн!
Указатель команд перемещается по диагонали в порядковом режиме, поэтому выполняется только каждый второй символ.
источник
Perl 6 , оценка:
15 108, длина:46 5562 байтаПопробуй это
Попробуй это
Попробуй это
Expanded:
источник
Java 8, оценка
9 (384 B)7 (401 B)Первоначальный вариант. Спустимся отсюда. Оценка 9 из-за"ubstring "
, поэтомуsubstring
будет первая часть, чтобы заменить." length"
которого я, вероятно, не смогу снизить дальше .. Я сомневаюсь, что можно отказаться от четырех вариантов использованияlength
. Если это возможно," eturn"
(6) может понизить счет на 1 как окончательное улучшение, но я думаю, что это так (за исключением, может быть, небольшого уменьшения количества байтов ..)Попробуйте онлайн.
источник
Хаскелл , оценка 7
-4 спасибо Лайкони.
Попробуйте онлайн!
источник
f s=snd$maximum[(0<$i,i)|i<-tails=<<inits s,nub i==i]
сохраняет байт и два на счету.Mathematica, score
119Shaving a couple of bytes off of the longest nonrepeating string by obscuring the function's name:
источник
Kotlin, score:
11109 bytes, length:227246245 bytesThe longest is
ubstring
, which is 9 charsIt is called like this:
источник
roupingBy
and{
?roupingBy
(which is 9 chars) buteachCount
(with trailing space).roupingBy
has a trailing space (visible in the markdown, but the renderer seems to strip it)Pyth, score 3 (
1814 bytes)Try it online!
The longest non-repeating substrings is
.:
.источник
e f {I T .:
.05AB1E, 22 bytes | Score: 2
-1 score + 7 bytes thanks to HeebyJeeby
Try it online!
05AB1E, 15 bytes | Score: 3
Try it online!
05AB1E, 8 bytes | Score: 8
Try it online!
05AB1E can actually do something rather cheap... adding whitespace into 05AB1E does nothing.
If there is a rule against this, I can also use
´
and like 7 other chars.источник