Есть старая история о каменотесе, который никогда не был доволен тем, кем он был. Он хотел бы стать солнцем, и он был таким. Заблокированный облаками, он хотел быть - и стал - облаком. Когда подул ветер, он пожелал, чтобы он был ветром. Остановившись у горы, он хотел быть горой и таким образом стал одним. Вскоре, однако, на него напал каменщик, и он хотел стать каменщиком.
Точно так же ваша задача - написать программу, которая никогда не будет удовлетворена языком, на котором она находится. Ваша программа должна вывести набор замен регулярных выражений, чтобы превратить ее в другой язык. И так далее.
правила
- Написать программу на языке по вашему выбору.
- Программа должна вывести серию не менее двух сегментов. Сегмент - это набор текста, разделенных точками с запятой. Однако, если точка с запятой содержится в регулярном выражении, то есть его разбиение приведет к неверному синтаксису, она не разделяет сегменты. Смотрите пример.
- Первый сегмент является шаблоном регулярных выражений для поиска, а второй сегмент является шаблоном замены. Третий - это другой шаблон «найти», а четвертый - это шаблон «заменить» и так далее.
- Примените шаблоны регулярных выражений к программе. Замените рисунок на первом отрезке на второй; замените третий шаблон на четвертый и т. д.
- Результатом должна стать программа на другом языке, которая сама соответствует правилам 2-4.
- Используемые языки должны образовывать бесконечный повторяющийся цикл.
- Например, Python -> PHP -> C ++ -> Python -> PHP -> C ++ -> Python -> ...
- Ваша оценка - это период цикла. Связи разбиты по кратчайшей начальной длине кода.
- В приведенном выше примере счет три.
- На каждой итерации цикла ни один язык не может использоваться более одного раза.
- Для правил 5 и 7 совместимые языки (C и C ++) и разные версии одного и того же языка (Python 2 и Python 3) считаются одинаковыми.
- Сами программы повторять не нужно.
- В приведенном выше примере первая и четвертая программы могут отличаться.
- Любая версия регулярного выражения является приемлемой, но она должна использоваться для всех программ.
- Общий вывод для каждой программы не может превышать 100 символов.
- Каждый вывод должен содержать инструкции для фактического изменения программы. То есть никакие две последовательные программы в цикле не могут быть одинаковыми.
пример
Python -> Ruby -> Python -> ...
print "uts;Z;rint;uts;Z(?=;Z);rint"
Выходы:
uts;Z;rint;uts;Z(?=;Z);rint
Сегменты:
FIND ; REPLACE
uts ; Z
rint ; uts
Z(?=;Z ; rint (breaking the first segment in two would result in invalid syntax)
Применение регулярных выражений по порядку дает нам:
print "Z;Z;rint;Z;Z(?=;Z);rint" # replace each "uts" with "Z"
puts "Z;Z;uts;Z;Z(?=;Z);uts" # replace each "rint" with "uts"
puts "rint;Z;uts;rint;Z(?=;Z);uts" # replace each "Z" followed by ";Z" with "rint"
Запуск последней строки дает нам инструкции, чтобы превратить это обратно в код Python.
\;
;)Ответы:
2 языка: Python, Ruby;
3329 байтВот еще один способ сделать Python и Ruby, это немного короче, чем тот, который в задаче:
Не должно быть слишком сложно добавить PHP в смесь.
источник
2 языка: Python 2 и Befunge-93, 77 байт
После внимательного прочтения правил на этот раз , я пришел с реальным ответом. Он не выиграет никаких призов, но Befunge слишком интересен для программирования.
Эта программа Python выводит:
Что дает эти замены:
Что превращает программу в эту программу Befunge:
Может быть, я посмотрю, смогу ли я сделать это одной строкой. Честно говоря, я немного удивлен, что Befunge вообще решает подобные проблемы.
(Извините за удаление и удаление группы; я паниковал секунду, потому что я думал, что программа, возможно, не работала.)
источник