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
- Napisz program w wybranym języku.
- 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.
- 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.
- 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.
- Rezultatem powinien być program w innym języku, który sam spełnia zasady 2–4.
- Używane języki muszą tworzyć nieskończony, powtarzający się cykl.
- Na przykład Python -> PHP -> C ++ -> Python -> PHP -> C ++ -> Python -> ...
- 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.
- W każdej iteracji cyklu żaden język nie może być używany więcej niż jeden raz.
- 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.
- Same programy nie muszą się powtarzać.
- W powyższym przykładzie pierwszy i czwarty program mogą być różne.
- Dowolna wersja wyrażenia regularnego jest akceptowalna, ale musi być taka sama dla wszystkich programów.
- Całkowita moc wyjściowa dla każdego programu nie może przekraczać 100 znaków.
- 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.
\;
;)Odpowiedzi:
2 języki: Python, Ruby;
3329 bajtówOto inny sposób na zrobienie Pythona i Ruby, który jest nieco krótszy niż ten w wyzwaniu:
To nie powinno być zbyt trudne, aby dodać do mieszanki PHP.
źródło
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ć.
Ten program Python generuje:
Co daje te zamienniki:
Co zmienia program w ten program Befunge:
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ć.)
źródło