В этом задании вы получите строку ввода, содержащую строку из X, Y и Z, например. "XYZZ". X, Y и Z представляют определенный символ. Этот шаблон затем сравнивается со вторым вводом строки. Если шаблон существует как подстрока во втором входе, верните True
, в противном случае верните False
. Как только в слове найден шаблон, программа прекращает поиск и возвращается True
.
Примеры
Выкройка: "XXYY"
succeed ---> True (pattern found: ccee)
success ---> False (pattern not matched)
balloon ---> True (pattern found: lloo)
Выкройка: "XYXYZ"
bananas ---> True (pattern found: nanas)
banana ---> False (pattern not found)
- Примечание: это не фактический ввод. Это пример того, как программа должна работать. Ваша программа должна вывести
True
илиFalse
, или другие значения Truthy / Falsy.
Другая важная / полезная информация
- Шаблон не должен содержать X, Y и Z, он может содержать X и Y или даже (хотя и несколько бессмысленно) только X.
- Шаблон не может быть пустым, но он не будет использоваться в качестве контрольного примера.
- Строка поиска не будет пустой и будет строчной.
- Буквенный порядок X, Y и Z в шаблоне не имеет значения.
- X, Y и Z должны быть уникальными символами.
- Вы можете использовать любую библиотеку, какую пожелаете.
- Оценка определяется размером кода в байтах. Самый низкий балл побеждает.
Удачи!
Ответы:
Perl 5 , 85 байт
Сохранено 40 байтов благодаря предложению Питера Тейлора! (см. мою старую версию ниже, чтобы увидеть различия)
83 байта кода +
-pl
флаг.Попробуйте онлайн!
XYXYZ преобразуется в
((?!\1).)((?!\1)(?!\2).)\1\2((?!\1)(?!\2)(?!\3).)
(да, некоторые тесты не могут быть истинными, но в этом случае они короче), и второй вход затем проверяется на соответствие этому регулярному выражению. (см. объяснения моей старой версии, чтобы понять, как это работает)Моя старая версия:
Спасибо Арно, который указал на ошибку, которую я сделал в моей первой версии.
113 байт кода +
-pl
флаги и-Mre=eval
.Попробуйте онлайн!
На примере XYXYZ: (.) (.) (.) Первое регулярное выражение будет преобразовывать шаблон к \ 1 \ 2, и добавить в конце тест , чтобы проверить , если
$1
,$2
и$3
различны: если да, то$\
будет установлен в единицу. Затем вторым вводом являются тесты против этого регулярного выражения, и$\
он имплицитно печатается в конце.Регулярное выражение генерируется для XYXYZ это
(.)(.)\1\2(.)(?{++$c;$\=1if!grep{$v{$c}{${$_}}++}1..3})^
.(Я добавлю немного больше деталей к объяснениям, когда у меня будет время)
источник
(.)((?!\1).)\1\2((?!\1)(?!\2).)
?Желе , 9 байт
Возвращает количество раз, когда образец был найден, ненулевое значение является правдивым, а нулевое - ложным.
Попробуйте онлайн!
Как это работает
источник
JavaScript (ES6), 94 байта
Работает путем преобразования шаблона в регулярное выражение, например, для
XYXYZ
него генерирует/(.)(?!\1)(.)\1\2(?!\2)(?!\1)(.)/
.Я заметил интересное различие между PCRE и регулярным выражением JavaScript: в PCRE происходит
\<n>
сбой (и, следовательно,(?!\<n>)
успех) до определения группы захвата, в то время как в JavaScript он успешно соответствует пустой строке (и, следовательно, происходит(?!\<n>)
сбой).источник
Python 2 , 70 байт
Попробуйте онлайн!
Проверяет, соответствует ли строка шаблону, используя метод из этого ответа . Использует префикс строки поиска, длина которой равна шаблону. Отбирает первый символ строки строки, пока не будет найдено совпадение, или
False
если оно станет пустым73 байта:
Попробуйте онлайн
Проверяет, соответствует ли строка шаблону, используя метод из этого ответа . Рекурсивно проверяет все подстроки, переходя к удалению первого или последнего символа, пока строка не станет пустой.
источник
Python 3 , 100 байт
Попробуйте онлайн!
источник
05AB1E ,
1916 байтПопробуйте онлайн!
Вернет 1, если истина, ноль, если не истина.
Это может быть 14 байтов, если разрешен возврат возможных значений XYZ:
05AB1E , 14 байтов
Попробуйте онлайн 2!
источник
1
иTrue
(что обычно является недостатком для такого рода вызовов), но если спецификацию задачи можно интерпретировать как позволяющую нам определить истинность / ложь для задачи вторая версия работает как вы говорите.Java 7,
177176173 байтаОбъяснение:
Тестовый код:
Попробуй это здесь.
Выход:
источник
PHP, 89 байт
Подарок от @Christoph и @Titus
PHP, 105 байт
Подарок от @Christoph
PHP, 167 байт
источник
++$p
вместо($p+1)
, хотя я на самом деле не проверял это.[,$a,$b]=$argv;foreach(str_split($a)as$k=>$v)$r.=$k==($p=strpos($a,$v))?"(.)":"\\".++$p;echo preg_match("#$r#",$b);
.[,$a,$b]=$argv;foreach(str_split($a)as$v)$r.=$x[$v]?"\\$x[$v]":'(.)'.!$x[$v]=++$y;echo preg_match("#$r#",$b);
(Обратите внимание, что вы должны сохранить свои старые результаты, используя<strike>
)!
. Это более ценно, чем те моменты, которых я мог бы достичь с вашим хорошим решением.$argv
в$a
и$b
; -6 байт сfor(;a&$v=$argv[1][$i++];)
; -1 байт с более длинными именами переменных ( действительно!: Используйте$vv
вместо$v
,$ii
вместо$i
,$rr
вместо$r
,$yy
вместо,$y
и вы можете использовать$$vv
вместо$x[$v]
)С #
184165155 байтовспасибо aloisdg!
Решение возврата, в качестве бонуса оно работает с шаблоном с любыми персонажами!
источник
var s=l==n.Length;
? Вы используете его только вreturn s?!s:
(где!s
всегдаfalse
), поэтому его можно изменить наreturn l==n.Length?0>1:
. Кроме того , что это:(n[i]!=n[j]||n[i]!=n[j])
. Вы проверяетеn[i]!=n[j]
дважды .. Это всегда будетtrue or true
/false or false
..: Sint l = p.Length,i = 0, j;
i++
иj--
внутри и за петлю. например:for(j=i;j>=0;)if(p[i]==p[j]==(n[i]!=n[j--]))
Рубин,
6361 байтВместо того, чтобы искать шаблон регулярного выражения, просто попробуйте заменить 'X', 'Y' и 'Z' всеми возможными способами и найти буквальное совпадение.
(Фактически та же концепция, что и в ответе carusocomputing на 05AB1E)
источник
JavaScript (ES6),
92898786 байтПринимает вход
p
(шаблон) иs
(строка) в синтаксисе карри(p)(s)
. Возвращает0
/1
.Отформатировано и прокомментировано
Контрольные примеры
источник
Mathematica 18 символов (не считая строки и шаблона)
Примеры:
True
True
источник