Учитывая (в STDIN, как аргументы командной строки или как аргументы функции) две разные непустые строки, найдите и верните самую короткую подстроку первой строки, которая не является подстрокой второй. Если такой подстроки не существует, вы можете вернуть пустую строку, вернуть любую строку, которая не является подстрокой исходной строки, или выдать исключение. Если вы возвращаетесь из функции, вы также можете вернуть null (или undefined, None и т. Д.) В этом случае. Если несколько таких подстрок связаны с самыми короткими, вы можете вернуть любую из них.
Строки могут состоять из любых печатных символов ascii.
Ввод данных в STDIN будет дан с одной строкой в каждой строке. По вашему запросу в конце ввода может быть добавлена одна пустая строка.
Это код гольф, поэтому выигрывает самая короткая действительная программа.
НЕКОТОРЫЕ ИСПЫТАТЕЛЬНЫЕ СЛУЧАИ
ВХОД:
STRING ONE
STRING TWO
ВЫХОД:
E
ВХОД:
A&&C
A&$C
ДЕЙСТВИТЕЛЬНЫЕ ВЫХОДЫ:
&&
&C
ВХОД:
(Две случайно сгенерированные 80-буквенные строки)
QIJYXPYWIWESWBRFWUHEERVQFJROYIXNKPKVDDFFZBUNBRZVUEYKLURBJCZJYMINCZNQEYKRADRYSWMH
HAXUDFLYFSLABUCXUWNHPSGQUXMQUIQYRWVIXGNKJGYUTWMLLPRIZDRLFXWKXOBOOEFESKNCUIFHNLFE
ВСЕ ДЕЙСТВИТЕЛЬНЫЕ ВЫХОДЫ:
AD
BJ
BR
CZ
DD
EE
ER
EY
EY
FF
FJ
FW
FZ
HE
IJ
IN
IW
JC
JR
JY
KL
KP
KR
KV
LU
MH
MI
NB
NQ
OY
PK
PY
QE
QF
QI
RA
RB
RF
RO
RV
RY
RZ
SW
UE
UH
UN
UR
VD
VQ
VU
WB
WE
WI
WU
XN
XP
YI
YK
YK
YM
YS
YW
YX
ZB
ZJ
ZN
ZV
Ответы:
Брахилог , 23 байта
Работает на старом транспортере Java. Ожидает две строки в списке в качестве входных данных, объединяет выходные данные с подстрокой. Если подстрока не найдена, возвращает false.
К сожалению, я еще не кодировал подмножество, встроенное в новый транспортер Prolog.
объяснение
источник
Питон,
11911591Тестовые случаи:
Работаю над тем, чтобы сделать его короче, но это мой мозговой инстинкт. Не очень большой игрок в гольф еще.
Спасибо @ user81655 и @NonlinearFruit за дополнительные байты.
Редактировать :
Dang. Пробовал этот код:
Думал, что это было на несколько байтов короче. Оказывается, это было на 1 байт длиннее, чем было до редактирования.
источник
(r=range)(1,len(a)+1)
тогда использоватьr
?range
чтобыr
в строке выше, он фактически добавляет байт. Хорошая идея, хотя. Вероятно, существует более короткий способ перебора подстрок.range(1,len(a))
иrange(len(a)-1)
должен работать не так ли? Также я думаю, что использование символа табуляции для отступа в два пробела позволит сохранить байт.range(1,len(a))
4-м тестом приведен сбой, потому что он не будет пробовать полную строку; это будет идти только до длины строки - 1. И сrange(len(a)-1)
, 1-й контрольный пример не возвращается,'cd'
а просто'd'
. Там может быть что-то, хотя.range(1,len(a)+1)
иrange(len(a))
.Python,
8786 байтЕсли он существует, он вернет самую левую из всех самых коротких уникальных подстрок.
Если нет уникальной подстроки, возникает ошибка IndexError .
Проверьте это на Ideone .
источник
enumerate
чтобы начатьj
вi+1
.j
сначала, потомi
.'ab'
для ввода'abc','aaa'
.Python, 82 байта
Использование:
f('A&&C', 'A&$C')
-> возвращает'&&'
Вызывает ValueError, если подходящей подстроки нет.
Объяснение:
g=lambda u:{u}|g(u[1:])|g(u[:-1])if u else{''}
рекурсивно создает набор подстрок изu
f=lambda s,t:min(g(s)-g(t),key=len)
принимает самую короткую подстроку из заданной разностиисточник
JavaScript (ES6), 79 байт
Если возврат
false
приемлем, сохраните 2 байта, используя&&s
вместо?s:''
.источник
Pyth, 11 байт
Попробуйте онлайн!
источник
JavaScript (Firefox), 80 байт
Тест работает только в Firefox. Возвращает,
undefined
если нет подстроки.источник
b.includes
вместо этого?includes
.SyntaxError: unexpected token 'for'
Сетчатка , 37 байт
Вывод пуст, если в. Не найдена допустимая подстрока
A
.Попробуйте онлайн! (Немного изменен для одновременного запуска нескольких тестовых наборов. Формат ввода фактически разделен переводом строки, но наборы тестов проще всего написать с одним тестовым набором на строку. Среда тестирования превращает пространство в перевод строки до начала реального кода.)
объяснение
Для каждой возможной начальной позиции в
A
, сопоставьте самую короткую подстроку, которая не появляется вB
. Предназначен&
для перекрывающихся совпадений, так что мы фактически пробуем каждую начальную позицию, даже если совпадение длиннее одного символа. В\G
гарантирует , что мы не пропустить ни одной позиции - в частности, таким образом , мы должны остановиться на перевод строки, так что мы не получаем дополнительные матчи отB
себя. Причина, по которой это не мешает, на самом деле довольно неуловима: потому что если есть начальная позиция, вA
которой мы не можем найти какую-либо допустимую подстроку, то это также ошибка, которая приведет\G
к прекращению проверки любых дальнейших позиций. Однако, если (из текущей начальной позиции) все подстроки появляются вB
то же самое относится и ко всем подстрокам, которые начинаются дальше справа от текущей позиции, поэтому их отбрасывание не является проблемой (и фактически повышает производительность).Из-за
M!
конфигурации все эти совпадения будут возвращены со сцены, объединены с переводами строки.Это сортирует строки предыдущего результата по длине. Это делается путем сопоставления строки с
.+
. потом$
активируется форма «сортировки», так что совпадение заменяется$.&
для определения порядка сортировки.$.&
Сам заменяет матч с его длиной. Наконец,#
опция указывает Retina сортировать численно (в противном случае получающиеся числа будут обрабатываться как строки и сортироваться лексикографически).Наконец, мы просто сохраняем только первую строку, используя этап grep с пустым регулярным выражением (которое всегда совпадает) и пределом
1
.источник
Perl,
8785Это анонимная функция, которая возвращает первую (по позиции) самую короткую подстроку,
$_[0]
которая не встречается$_[1]
, илиundef
если такой подстроки не существует.Тестовая программа со строками, взятыми из ответа @ iAmMortos, протестирована с Perl 5.22.1:
источник
Haskell, 72 байта
Пример использования:
"abcd" # "dabc"
->"cd"
.Простая реализация: создайте все подстроки
a
и сохраните те, которые не отображаются вb
.argmin
возвращает элемент списка , который сводит к минимуму функции по заданной 2 - й аргументу, здесь:length
.источник
argmin
! Это кажется чрезвычайно полезным.Pyth -
96 байтПопробуйте это онлайн здесь .
источник
C #, 152 байта
источник
Рубин, 70 байт
Собирает все подстроки определенной длины из первой строки и, если есть такая, которой нет во второй строке, возвращает ее.
источник
Бурлеск - 26 байтов
Прямо сейчас самый короткий способ, которым я могу придумать, является:
источник
Japt , 14 байт
Попробуйте онлайн!
Возвращает,
undefined
если нет допустимой подстроки . Это отличается от возврата строки "undefined" , хотя разница видна только из-за флага -Q.Объяснение:
источник
Japt
-h
, 11 байтПопытайся
источник