В духе этого xkcd
Напишите программу, которая играет в рег-гольф с произвольными парами списков. Программа должна по крайней мере попытаться сделать регулярное выражение коротким, программа, которая только выводит /^(item1|item2|item3|item4)$/
или подобное, не допускается.
Оценка основана на способности генерировать кратчайшее регулярное выражение. Тестовые списки - это списки успешных и неудачных кандидатов в президенты США, найденные здесь (спасибо @Peter). Конечно, программа должна работать для всех непересекающихся списков, поэтому простое возвращение ответа президенту не считается.
regular-expression
metagolf
Manishearth
источник
источник
/^item1|atem2|item3|item4$/
вероятно, имеет непреднамеренный приоритет (строка должна начинаться сitem1
, содержатьatem2
, содержатьitem3
или заканчиватьсяitem4
).Ответы:
Perl (
111110122 персонажа)При этом используется модуль CPAN, вызываемый
Regexp::Assemble
для оптимизации регулярных выражений. Потому что какой язык для регулярных выражений лучше, чем Perl.Также читаемая версия, просто для удовольствия (сделана с помощью
-MO=Deparse
).Пример вывода (я сделал CTRL-D после
item4
).Кроме того, в качестве бонуса я пишу регулярное выражение для каждого слова в вопросе.
Также список президентов (262 байта).
источник
Не мое решение (очевидно, я не Питер Норвиг!), Но вот решение (слегка измененного) вопроса любезно предоставлено им: http://nbviewer.ipython.org/url/norvig.com/ipython/xkcd1313.ipynb
программа, которую он дает, выглядит следующим образом (его работа, а не моя):
где победители и проигравшие - это соответственно списки победителей и проигравших (или, конечно, любые 2 списка), подробные объяснения см. в статье.
источник
Мое решение написано в Факторе :
Это тот же алгоритм, что и у Норвига. Если целью является ухудшение читабельности, то вы, вероятно, можете сыграть в гольф гораздо больше персонажей.
источник
Мой код написан не в полном объёме , но вы можете проверить его на https://github.com/amitayd/regexp-golf-coffeescript/ (или, в частности, алгоритм на src / regexpGolf.coffee).
Он основан на алгоритме Питера Норвига с двумя улучшениями:
(А также кидали в произвольную случайность)
Для наборов победителей / проигравших в этом тесте я нашел регулярное выражение 76 символов, используя его:
Еще несколько подробностей в моем блоге о переносе решателя на coffeescript .
источник