По заданным строкам X и Y определите, является ли X подпоследовательностью Y. Пустая строка рассматривается как подпоследовательность каждой строки. (Например, ''
и 'anna'
являются подпоследовательности 'banana'
.)
вход
- X, возможно пустая чувствительная к регистру буквенно-цифровая строка
- Y, возможно пустая буквенно-цифровая строка с учетом регистра
Выход
- True или False (или эквиваленты), правильно указывающие, является ли X подпоследовательностью Y.
Примеры ввода / вывода
X Y output
'' 'z00' True
'z00' 'z00' True
'z00' '00z0' False
'aa' 'anna' True
'anna' 'banana' True
'Anna' 'banana' False
критерии
- Самая короткая программа выигрывает, что определяется количеством байтов исходного кода.
Примеры программ
- Несколько программ, которые могут быть адаптированы, находятся в этой публикации .
anna
это подпоследовательность (но не подстрока)banana
. Строка X является подпоследовательностью строки Y, только если X можно получить из Y, удалив ноль или более элементов из Y; например, удалениеb
и второйa
изbanana
даетanna
.Ответы:
Perl 5 , 17 байт (+1?), Полная программа
Попробуйте онлайн!
Вызвать с
p
флагом для интерпретатора Perl, как вperl -pe 's//.*/g;$_=<>=~$_'
. В соответствии с установленными правилами оценки, когда этот вызов был первоначально опубликован , этот флаг стоит один дополнительный байт. По более новым правилам , AFAICT, это может быть бесплатно.В любом случае, входные строки должны предоставляться в отдельных строках с новой строкой в stdin. Вывод (в stdout) будет,
1
если первая входная строка является подстрокой второй, или вообще ничего, если это не так.Обратите внимание, что обе строки ввода должны иметь новую строку в конце, иначе программа не будет работать правильно. В качестве альтернативы, вы можете добавить
l
флаг командной строки к вызову, чтобы Perl удалял символы новой строки; в зависимости от действующих правил оценки это может стоить или не стоить одного дополнительного байта. Обратите внимание, что использование этого флага также добавит новую строку к выводу.Оригинальная версия (фрагмент, 18 байт / символов)
Входные данные даны в переменных
$x
и$y
, результатом является значение выражения (в скалярном контексте). Обратите внимание, что$x
изменяется в процессе. (Да, я знаю, что использование$_
вместо$x
позволит мне сохранить четыре символа, но делает это в фрагменте кода, который кажется мне слишком глупым.)Как это работает?
Первая часть,
$x=~s//.*/g
вставляет строку.*
между каждым символом в$x
. Вторая часть,$y=~$x
рассматривается$x
как регулярное выражение и сопоставляется$y
с ним. В регулярных выражениях Perl.*
совпадает ноль или более произвольных символов, в то время как все буквенно-цифровые символы удобно совпадают.источник
Рубин, 32 символа
Это решение возвращает,
nil
еслиx
не является подпоследовательностьюy
и числом в противном случае (т. Е. Рубиновые эквивалентыfalse
иtrue
). Примеры:источник
y=~/#{[*x.chars]*".*"}/
(23 символа). ура!y=~/#{x.split("")*".*"}/
(21 символ) :)y=~
с этим возиться в irb ...Haskell,
5137Спасибо Хаммару за существенное улучшение. Теперь это инфиксная функция, но, похоже, нет причин, по которым она не должна этого делать.
Демонстрация:
источник
s x y=x<=y
. Кроме того, вы можете сэкономить еще немного, сделав его оператором и используя@
-pattern вместо(f:l)
. Это сокращает до 37 символов:h@(f:l)%(g:m)=f==g&&l%m||h%m;x%y=x<=y
Python (48 символов)
Тот же подход, что и у Рубарда. Жаль, что в Python нет необходимости импортировать пакет регулярных выражений и его «подробный»
lambda
. :-)источник
Python, 59 символов
Я подумал, что мой ответ будет лучше выражен в Python.
Изменить: Добавлены предложения Res.
источник
x="a"
иy="ab"
вы бы выйти из циклаy=="b"
и вернутьсяfalse
?x
и перепуталy
. В моих функцияхy
должна быть подпоследовательностьx
. Я думаю, что лучше поменять их, чтобы избежать путаницы.def s(x,y): for c in y: if x:x=x[c==x[0]:] return x==""
. Он не отображается правильно в комментарии, но я думаю, вы понимаете, о чем я. (Кроме того, для увеличения уровня отступа достаточно одного дополнительного пробела.)''
и сохранить несколько символов, написавx=x[c==x[0:1]:]
GolfScript (22 символа)
Предполагается, что ввод берется как две предопределенные переменные
X
иY
, хотя это довольно необычно в GolfScript. Оставляет в стеке значение1
true или0
false.источник
С (52 символа)
Контрольные примеры
источник
s(char*x,char*y){x=!*x||*y&&s(x+(*x==*y),y+1);}
Бурлеск (6 символов)
6 символов в бурлеск:
R@\/~[
(при условии, что x и y находятся в стеке. Смотрите здесь в действии.)источник
С, 23:
результат в * х
http://ideone.com/BpITZ
источник
PHP, 90 символов
источник
if
утверждение и упростить до$x=substr($x,$y[$a++]==$x[0])
: ideone.com/Ch9vKScala 106:
источник
CoffeeScript
1121009589Моя первая попытка в гольф-коде ... надеюсь, я не позорю свою семью!
редактировать : оказывается, Coffeescript более прощающий, чем я думал с пробелами.
Спасибо res и Peter Taylor за несколько советов, как сделать его немного изящнее
источник
z=(x,y)-> a=x.length return 1if a==0 b=y.indexOf x[0] return 0if b<0 z x[1..a],y[b+1..y.length]
. (В некоторых браузерах, например, Chrome, код комментария можно правильно отобразить, щелкнув правой кнопкой мыши, затем «Проверить элемент».)a.length
никогда не будет отрицательным, поэтому вы можете сохранить еще один символ, заменив егоif a==0
наif a<1
. Я не знаю, как работает токенизация CoffeeScript, но если он используетif0
два токена, вы можете сохранить еще два, поменяв оба условия (то естьif1>a
).if1>a
не действителен, ноif!a
есть и является символом короче! Я также понял , что я мог бы сбрить дополнительный характер преобразованиеb+1
вb
и приращении его на предыдущей строке, также делает тот жеif
трюк , возможно , так как она имеет дело с 0 / не-0 ситуацией.C #,
7011310790 символовисточник
static bool S(string x,string y){if(x!=""&&y=="")return false;return x==""||S(y[0]==x[0]?x.Remove(0,1):x,y.Remove(0,1));}
x==""||y!=""&&S(...)
, но он все же дольше, чем обновленная версия Linq. Хорошее использованиеAny
!Mathematica
19 1727LongestCommonSequence
возвращает самую длинную несмежную подпоследовательность из двух строк. (Не путать сLongestCommonSubsequence
, который возвращает самую длинную непрерывную подпоследовательность.Далее проверяется, является ли самая длинная непрерывная подпоследовательность первой из двух строк. (Таким образом, вы должны ввести более короткую строку, за которой следует более крупная строка.)
Примеры
Истинно верно верно ложно
Критическое испытание - третье, потому что «анна» содержится не непрерывно в «банане».
источник
Python 3.8 (предварительная версия) , 42 байта
Попробуйте онлайн!
Python 3.8 (предварительная версия) , 48 байт
Попробуйте онлайн!
Python 2 , 48 байт
Попробуйте онлайн!
Скопировано из этого ответа Линн . Значение
>0
может быть опущено, если вывод truey / falsey в порядке.Python 2 , 50 байт
Попробуйте онлайн!
Python 2 , 50 байт
Попробуйте онлайн!
источник
C -
74 7164Это не побеждает решение Питера Тейлора, но я думаю, что это довольно весело
(плюс, это полноценная рабочая программа, а не просто функция)И безглым
Чтобы проверить это, вы можете сделать что-то вроде:
источник
!=0
в состоянии немного многословно ... Программа против функции - это то, что вопрос должен четко указывать, а здесь это не так, поэтому ответы имеют разные варианты.!='\0'
это плохая (хорошая?) Привычка писать код не для гольфа, я позволил этому проникнуть в мои последние два раунда игры в гольф, и в будущем я должен быть более осторожным. Что касается программирования против функции, да, вы абсолютно правы.Python,
66625958 символовВид забавного решения, определенно аккуратная проблема.
источник
Руби
323028Это вернет
MatchData
экземпляр, еслиa
является подпоследовательностьюb
илиnil
иным образом.Старая версия, которая находит подстроку вместо подпоследовательности
Рубин 15
Используя
String#[](str)
метод, который возвращаетstr
ifstr
является подстрокойself
и!!
возвращает,Boolean
если возвращаемое значение может быть использовано как логическое (и не должно бытьtrue
илиfalse
), тогда это может быть только 13 символов:Он вернется,
nil
еслиa
не является подстрокойb
.источник
SWI-Пролог, SICStus
Встроенный предикат sublist / 2 SICStus проверяет, все ли элементы первого списка также отображаются во втором списке. Этот предикат также доступен в SWI-Prolog через библиотеку совместимости, которая может быть загружена запросом
[library(dialect/sicstus/lists)].
.Образец прогона:
Число байтов технически может быть 0, поскольку все, что мы здесь делаем, это запросы, очень похожие на то, как мы запускаем программу и вводим в нее входные данные.
источник
PHP, 41 байт
печатает 1 за правду и ничего за ложь
Если сделаны только вставки из слова 1 в слово 2, то счетчик равен нулю для истинных случаев
Левенштейн
Попробуйте онлайн!
PHP, 57 байт
печатает 1 для истинного и 0 для ложного
Создает регулярное выражение
Попробуйте онлайн!
источник
.*
не требуется. -2 байт: don't правопреемник$argv
в$a
. +24 байта: нужныarray_map(preg_quote())
специальные символы (используйте скобки в качестве разделителей, чтобы избежать второгоpreg_quote
параметра.)preg_match
не будет жаловаться на пустое регулярное выражение, пока есть разделители. Это будет просто соответствовать чему-либо. Но preg_quote все +22 байт, а не +24:array_map(preg_quote,str_split(...))
..*
.Брахилог , 2 байта
Попробуйте онлайн!
Как и с этим ответом,
⊆
это встроенный предикат, который объявляет отношения между входными и выходными переменными, иᵈ
является мета-предикатом, который изменяет его, чтобы вместо этого объявить те же отношения между первым и вторым элементами входной переменной (и унифицировать выходная переменная со вторым элементом, но так как это проблема решения, которая здесь не имеет значения).X⊆Y
утверждение о том, что X является подпоследовательностью Y, поэтому так и есть[X,Y]⊆ᵈ
.Этот предикат (который, конечно, выводит через успех или неудачу, который печатает
true.
илиfalse.
когда он запускается как программа) принимает входные данные как список из двух строк. Если ввод немного более гибкий ...Брахилог , 1 байт
Попробуйте онлайн!
Принимает строку X в качестве входной переменной и строку Y в качестве выходной переменной. Выходит через успех или неудачу, как и раньше.При запуске в качестве полной программы X вводится как ввод, а Y - как первый аргумент командной строки.
источник
CoffeeScript 73
Вот альтернативный ответ CoffeeScript, использующий регулярные выражения вместо рекурсии:
Если стог сена соответствует очень жадному регулярному выражению, построенному из иглы, он будет заменен пустой строкой. Если стог сена короче, чем он начался, игла была подпоследовательностью.
Возвращает ложь, когда
x
иy
оба являются пустыми строками. Думаю, нам нужен философ, чтобы сказать нам, является ли пустая строка подпоследовательностью самого себя!(Опубликовано в качестве отдельного ответа от моего предыдущего, потому что это чувствует себя достаточно по-другому, чтобы оправдать это).
источник
PowerShell, 38
Конечно, любое такое решение на основе регулярных выражений или сопоставления с образцом имеет серьезные проблемы с производительностью с более длинными строками. Но поскольку краткость является критерием ...
источник
Своего рода анти-решение, генерирующее все подпоследовательности Y:
Python 93
источник
APL (31)
В APL немного не хватает обработки строк.
использование:
источник
Python 132
Похож на Даниеро. Не самое простое решение, но попробовать было весело. Я новичок в Python, поэтому я уверен, что я мог бы сделать его короче, если бы я знал немного больше.
источник
Python - 72
источник
Питон (
7552)Простое рекурсивное решение. В первый раз игра в гольф, так что любые советы о том, как свести это на нет, очень ценятся :)
Проверено со следующим:
Спасибо @lirtosiast за некоторые хитрые логические трюки.
источник
s=lambda a,b:a==''or b>''and s(a[a[0]==b[0]:],b[1:])
PHP,
756564 байтпринимает входные данные из аргументов командной строки; печатает
1
для true, пустая строка для false. Беги с-r
.объяснение:
strpos
возвращается,false
если игла$c
не находится в стоге сена$argv[2]
(после положения$p
),вызывая разрыв цикла.
strpos
также возвращаетсяfalse
за пустой иглой, разрывая петлю в конце$argv[1]
.$argv[1]
это подпоследовательность$argv[2]
,$c
будет пустым, когда цикл прерывается.strpos
Необходимо@
подавитьEmpty needle
предупреждение.источник
+$p
вместо$p+1
этого нет необходимости подчеркивать+1
необходим для продвижения в стоге сена; и подчеркивание избегает$p=-1
инициализации. Но ... я могу избежатьfalse!==
.Свифт, 27
источник