Python: Я хотел бы быть PHP [закрыт]

8

Есть старая история о каменотесе, который никогда не был доволен тем, кем он был. Он хотел бы стать солнцем, и он был таким. Заблокированный облаками, он хотел быть - и стал - облаком. Когда подул ветер, он пожелал, чтобы он был ветром. Остановившись у горы, он хотел быть горой и таким образом стал одним. Вскоре, однако, на него напал каменщик, и он хотел стать каменщиком.

Точно так же ваша задача - написать программу, которая никогда не будет удовлетворена языком, на котором она находится. Ваша программа должна вывести набор замен регулярных выражений, чтобы превратить ее в другой язык. И так далее.

правила

  1. Написать программу на языке по вашему выбору.
  2. Программа должна вывести серию не менее двух сегментов. Сегмент - это набор текста, разделенных точками с запятой. Однако, если точка с запятой содержится в регулярном выражении, то есть его разбиение приведет к неверному синтаксису, она не разделяет сегменты. Смотрите пример.
  3. Первый сегмент является шаблоном регулярных выражений для поиска, а второй сегмент является шаблоном замены. Третий - это другой шаблон «найти», а четвертый - это шаблон «заменить» и так далее.
  4. Примените шаблоны регулярных выражений к программе. Замените рисунок на первом отрезке на второй; замените третий шаблон на четвертый и т. д.
  5. Результатом должна стать программа на другом языке, которая сама соответствует правилам 2-4.
  6. Используемые языки должны образовывать бесконечный повторяющийся цикл.
    • Например, Python -> PHP -> C ++ -> Python -> PHP -> C ++ -> Python -> ...
  7. Ваша оценка - это период цикла. Связи разбиты по кратчайшей начальной длине кода.
    • В приведенном выше примере счет три.
  8. На каждой итерации цикла ни один язык не может использоваться более одного раза.
  9. Для правил 5 и 7 совместимые языки (C и C ++) и разные версии одного и того же языка (Python 2 и Python 3) считаются одинаковыми.
  10. Сами программы повторять не нужно.
    • В приведенном выше примере первая и четвертая программы могут отличаться.
  11. Любая версия регулярного выражения является приемлемой, но она должна использоваться для всех программ.
  12. Общий вывод для каждой программы не может превышать 100 символов.
  13. Каждый вывод должен содержать инструкции для фактического изменения программы. То есть никакие две последовательные программы в цикле не могут быть одинаковыми.

пример

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.

Ypnypn
источник
Если вы используете размер кода в качестве прерывателя связей, действительно ли нам нужно ограничение в 100 символов?
Мартин Эндер
@ MartinBüttner Да; почему бы нет?
Ypnypn
Конечно, но это персонаж дольше, чем \;;)
Мартин Эндер
C ++ не обязательно совместим с C.
golfer9338
8
Я думаю, что вы, вероятно, хотите требовать, чтобы все программы в цикле были разными. Если я ошибаюсь, пожалуйста, укажите это - и я требую приоритета для очевидного решения.
Питер Тейлор

Ответы:

6

2 языка: Python, Ruby; 33 29 байт

Вот еще один способ сделать Python и Ruby, это немного короче, чем тот, который в задаче:

Python:   print'^;puts"^.*?\\42#\\73"#'
prints:   ^;puts"^.*?\42#\73"#

Ruby:     puts"^.*?\42#\73"#print'^;puts"^.*?\\42#\\73"#'
prints:   ^.*?"#;

Не должно быть слишком сложно добавить PHP в смесь.

Мартин Эндер
источник
1

2 языка: Python 2 и Befunge-93, 77 байт

После внимательного прочтения правил на этот раз , я пришел с реальным ответом. Он не выиграет никаких призов, но Befunge слишком интересен для программирования.

u=u">>>>>:#,_@;Z;print;>>>>>:#,_@;Z(?=;Z);print;<v;Y;u;<v;Y(?=;Y);u"
print u

Эта программа Python выводит:

>>>>>:#,_@;Z;print;>>>>>:#,_@;Z(?=;Z);print;<v;Y;u;<v;Y(?=;Y);u

Что дает эти замены:

FIND         REPLACE
>>>>>:#,_@   Z
print        >>>>>:#,_@
Z(?=;Z)      print
<v           Y
u            <v
Y(?=;Y)      u

Что превращает программу в эту программу Befunge:

<v=<v"print;Z;>>>>>:#,_@;print;Z(?=;Z);>>>>>:#,_@;u;Y;<v;u;Y(?=;Y);<v"
>>>>>:#,_@ <v

Может быть, я посмотрю, смогу ли я сделать это одной строкой. Честно говоря, я немного удивлен, что Befunge вообще решает подобные проблемы.

(Извините за удаление и удаление группы; я паниковал секунду, потому что я думал, что программа, возможно, не работала.)

Kasran
источник