Python: Chciałbym być PHP [zamknięte]

8

Jest stara historia o kamieniarzu, który nigdy nie był zadowolony z tego, kim był. Żałował, że nie może stać się słońcem, i tak też było. Zablokowany przez chmury, chciał być - i stał się - chmurą. Kiedy wiał wiatr, chciał być wiatrem. Zatrzymany przez górę, chciał być górą i w ten sposób stał się jednym. Wkrótce jednak został zhakowany przez kamieniarza i chciał zostać kamieniarzem.

Podobnie, Twoim zadaniem jest napisanie programu, który nigdy nie będzie zadowolony z języka, w którym się znajduje. Twój program musi wypisać zestaw zastępczych wyrażeń regularnych, aby zmienić go na inny język. I tak dalej.

Zasady

  1. Napisz program w wybranym języku.
  2. Program powinien wypisać serię co najmniej dwóch segmentów. Segment to wiązka tekstu oddzielona średnikami. Jeśli jednak średnik jest zawarty w wyrażeniu regularnym, tak że jego rozbicie spowoduje niepoprawną składnię, nie rozdziela segmentów. Zobacz przykład.
  3. Pierwszy segment to wzór wyrażenia regularnego do znalezienia, a drugi segment to wzór zastępczy. Trzeci to kolejny wzór „znajdź”, a czwarty to wzór „zamień” i tak dalej.
  4. Zastosuj wzorce wyrażeń regularnych do programu. Zastąp wzór w pierwszym segmencie jednym w drugim; zamień trzeci wzór na czwarty i tak dalej.
  5. Rezultatem powinien być program w innym języku, który sam spełnia zasady 2–4.
  6. Używane języki muszą tworzyć nieskończony, powtarzający się cykl.
    • Na przykład Python -> PHP -> C ++ -> Python -> PHP -> C ++ -> Python -> ...
  7. Twój wynik to okres cyklu. Więzy są zerwane przez najkrótszą początkową długość kodu.
    • W powyższym przykładzie wynik wynosi trzy.
  8. W każdej iteracji cyklu żaden język nie może być używany więcej niż jeden raz.
  9. W przypadku reguł 5 i 7 kompatybilne języki (C i C ++) i różne wersje tego samego języka (Python 2 i Python 3) są uważane za takie same.
  10. Same programy nie muszą się powtarzać.
    • W powyższym przykładzie pierwszy i czwarty program mogą być różne.
  11. Dowolna wersja wyrażenia regularnego jest akceptowalna, ale musi być taka sama dla wszystkich programów.
  12. Całkowita moc wyjściowa dla każdego programu nie może przekraczać 100 znaków.
  13. Każde wyjście musi zawierać instrukcje do faktycznej zmiany programu. Oznacza to, że żadne dwa kolejne programy w cyklu nie mogą być takie same.

Przykład

Python -> Ruby -> Python -> ...

print "uts;Z;rint;uts;Z(?=;Z);rint"

Wyjścia:

uts;Z;rint;uts;Z(?=;Z);rint

Segmenty to:

FIND     ;    REPLACE
uts      ;    Z
rint     ;    uts
Z(?=;Z   ;    rint   (breaking the first segment in two would result in invalid syntax)

Zastosowanie zamienników wyrażenia regularnego daje nam:

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"

Uruchomienie ostatniego wiersza daje nam instrukcje, aby zmienić to z powrotem w kod Pythona.

Ypnypn
źródło
Jeśli używasz rozmiaru kodu jako przerywacza remisu, czy naprawdę potrzebujemy limitu 100 znaków?
Martin Ender
@ MartinBüttner Tak; Dlaczego nie?
Ypnypn
Jasne, ale to postać dłuższa niż \;;)
Martin Ender
C ++ niekoniecznie jest kompatybilny z C.
golfer9338
8
Myślę, że prawdopodobnie chcesz wymagać, aby wszystkie programy w cyklu były inne. Jeśli się mylę, proszę to powiedzieć - i twierdzę, że priorytetem jest oczywiste rozwiązanie.
Peter Taylor

Odpowiedzi:

6

2 języki: Python, Ruby; 33 29 bajtów

Oto inny sposób na zrobienie Pythona i Ruby, który jest nieco krótszy niż ten w wyzwaniu:

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

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

To nie powinno być zbyt trudne, aby dodać do mieszanki PHP.

Martin Ender
źródło
1

2 języki: Python 2 i Befunge-93, 77 bajtów

Po uważnym przeczytaniu zasad tym razem znalazłem prawdziwą odpowiedź. Nie wygra żadnych nagród, ale Befunge jest zbyt zabawne, aby się w nim programować.

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

Ten program Python generuje:

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

Co daje te zamienniki:

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

Co zmienia program w ten program Befunge:

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

Może zobaczę, czy uda mi się zrobić jedną linię. Szczerze mówiąc, jestem trochę zaskoczony, że Befunge w ogóle działa na tego rodzaju problemy.

(Przepraszam, że usunąłem i cofnąłem kilka; panikowałem przez sekundę, ponieważ myślałem, że program może nie działać.)

Kasran
źródło