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.


Якщо ви використовуєте розмір коду в якості вимикача, чи дійсно нам потрібен обмеження 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 взагалі працює на подібні проблеми.

(Вибачте за видалення та скасування відміни купки; я панікував на секунду, тому що думав, що програма може не працювати.)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.