Реализуйте функцию шаблона и строки для сопоставления, верните true, если шаблон соответствует всей строке, в противном случае - false.
Наш синтаксис шаблона глобуса:
?
соответствует любому персонажу+
соответствует одному или нескольким символам*
соответствует нулю или более символов\
ускользает
Правила:
- Нет eval, нет преобразования в регулярные выражения, нет вызова системной функции glob.
- Ввод / вывод не требуется: вы можете просто написать функцию
- Кратчайшие победы
Примеры:
glob('abc', 'abc') => true
glob('abc', 'abcdef') => false IMPORTANT!
glob('a??', 'aww') => true
glob('a*b', 'ab') => true
glob('a*b', 'agwijgwbgioeb') => true
glob('a*?', 'a') => false
glob('?*', 'def') => true
glob('5+', '5ggggg') => true
glob('+', '') => false
glob('a\*b', 'a*b') => true
Вот совет, чтобы начать: http://en.wikipedia.org/wiki/Backtracking
code-golf
interpreter
regular-expression
Мин-Tang
источник
источник
Ответы:
Golfscript - 82 символа
Предполагается, что в строках нет новых строк. Возвращает пустой массив для false и непустой массив для true (согласуется с определением гольфа / скрипта true / false).
Это нерекурсивное решение (за исключением последовательных
*
s), которое поддерживает список позиций в строке шаблонаi
, которыйpattern[0..i]
соответствуетstring[0..cur]
.У этого есть потенциал, чтобы бежать в течение очень долгого времени. Вы можете добавить
.&
после,:C%
чтобы предотвратить это.источник
Хаскель, 141 персонажа
Работает для всех входных данных, как шаблонов, так и строк для сравнения. Обрабатывает обратную косую черту в шаблоне как буквальное совпадение (поведение не определено.)
Это можно запустить с помощью следующего тестового драйвера:
Обновление: я написал сообщение в блоге об этом конкретном ответе, поскольку я думаю, что он хорошо показывает, как Haskell так легко кодирует проблему.
d
иm
с операторамиr
вc
+
случае%
, который был обработан&
источник
PHP -
275243 символаUngolfed:
источник
Слишком подробный Python (
384367 символов)Это не самое короткое, но это красиво и функционально. По-видимому, посылка в середине может быть переписана как дизъюнкция по
(h(p) == '?') and (? lambda body)
типу вещей. Определение того, что оператор h стоит мне несколько символов без пользы, но приятно иметь ключевое слово для заголовка.Я хотел бы иметь треск в игре в гольф позже, если позволит время.
edit: убрал ненужную третью ветку в случае '*' после прочтения ruby-ответа user300
источник
Короче Snappier Python 2.6 (272 символа)
golfed:
ungolfed:
с участием:
спасибо пользователю user300 за иллюстрацию, как все упрощается, если вы можете получить какое-то значение терминатора при извлечении заголовка из пустой строки.
Я хотел бы, чтобы распаковка головы / хвоста могла быть выполнена inline во время объявления аргументов m. тогда m может быть лямбда, как и его друзья n и glob. python2 не может этого сделать, и после небольшого чтения, похоже, что python3 тоже не может. горе.
тестирование:
источник
Рубин -
199171Ungolfed:
тесты:
Вдохновленный ответом Робов
источник
lambda s : list(s)+[None]
??
являются буквальными символами,=>
являются разделителями ключ / значение в Ruby Hashes и->
запускают лямбду :-) ({ ?? => ->{...} }
это хеш с ключом"?"
и лямбда в качестве значения.) Но да, способ, которым его совместное использование выглядит как сопоставление с образцом на отдельных символах :-)Функция C - 178 необходимых символов
Скомпилированный с GCC, это не производит никаких предупреждений.
Первая и последняя строки не учитываются при подсчете символов. Они предоставляются только для удобства.
Взорван:
источник
JavaScript - 259 символов
Моя реализация очень рекурсивна, поэтому стек будет переполнен, если используется очень длинный шаблон. Игнорируя знак плюс (который я мог бы оптимизировать, но для простоты я не выбрал), для каждого токена используется один уровень рекурсии.
Функция иногда возвращает число вместо логического. Если это проблема, вы можете использовать его как
!!glob(pattern, str)
.Ungolfed (скорее unminified), чтобы служить полезным ресурсом:
Обратите внимание, что индексирование по символам строки, как и для элементов массива, не является частью более старого (ECMAScript 3) языкового стандарта, поэтому может не работать в старых браузерах.
источник
Python (454 символа)
источник
D: 363 персонажа
Более разборчиво:
источник
golfscript
он состоит из функций, которые принимают два аргумента из стека s и p и выдают единственное логическое возвращаемое значение. есть что-то вроде того, чтобы сделать это совместимым с ленивыми и ленивыми или операторами. я действительно сомневаюсь, что этот подход близок к оптимальному или даже в правильном направлении.
Есть также несколько занимательно глупых моментов, таких как выталкивание
'*'
из шаблона, использование'*'
в сравнении только для того, чтобы понять, что последующая ветвь не совпадает. чтобы перейти вниз по другой ветви, нам нужен шаблон с'*'
передней частью, но мы использовали этот оригинальный шаблон, когда извлекли его'*'
, и мы использовали'*'
, поэтому, чтобы получить шаблон снова, мы загружаем новую блестящую строку постоянный'*'
, и добавьте его на место. это становится еще страшнее, потому что по какой-то причине сопоставление символов должно быть выполнено со значениями ascii, но при добавлении назад к строке нужны строки.меньше гольфа
тесты
источник
C # (251 символ)
Чуть более читабельно:
† Я знаю, я знаю ... за исключением глобусов, содержащих обратную косую черту. Что действительно неудачно. В противном случае это было бы действительно умно. :(
источник