Napisz quine trzeciego rzędu


17

Wyzwanie to stanowi rozszerzenie „ Golfa wzajemnego quine ”.

Korzystając z trzech wybranych języków, utwórz program Ouroboros trzeciego rzędu .

Oznacza to, że w języku A napisz program pA, który wypisze program pB w języku B. Program pB powinien wypisać program pC w języku C, który z kolei wyprowadzi oryginalny program pA w języku A.

Żadne dwa języki w A, B i C nie mogą być takie same, ani ich podzbiory, ani nadzbiory. Żadne z pA, pB lub pC może być identyczne.

Na przykład program Haskell wyprowadza program Perl, który wypisuje program Java, który wypisuje oryginalny program Haskell.

Z drugiej strony program C # 4, który wysyła program C # 3, który wyprowadza program C # 2, jest nieprawidłowy. Nawet kombinacja Perla -> Ruby -> Bash byłaby nieprawidłowa, gdyby, powiedzmy, program Perl i program Ruby były identyczne.

To jest golf golfowy, więc wygrywa najkrótszy program pA.


Odpowiedzi:


21

Python -> Perl -> Ruby, 48 znaków

Dostosowanie mojej poprzedniej odpowiedzi . Bieganie

s='print q<puts %%q{s=%r;print s%%s}>';print s%s

z Pythonem generuje ten fragment Perla

print q<puts %q{s='print q<puts %%q{s=%r;print s%%s}>';print s%s}>

który generuje następujący kod Ruby

puts %q{s='print q<puts %%q{s=%r;print s%%s}>';print s%s}

który następnie drukuje oryginalny fragment kodu w języku Python:

diff -s <(ruby <(perl <(python thirdorderquine.py))) thirdorderquine.py 
Files /dev/fd/63 and thirdorderquine.py are identical

13

Perl -> PHP -> HTML + JavaScript, 105 znaków

Chciałem, aby łańcuch języków miał jakikolwiek sens, więc pomyślałem, że napiszę skrypt PHP, który generuje stronę HTML zawierającą JavaScript. Na trzeci język wybrałem Perla, tylko dlatego, że lubię Perla. :)

Niektórzy mogą brać pod uwagę te cztery języki, ale tak naprawdę nie liczę HTML jako oddzielnego od JavaScript - jest to język znaczników, a nie język programowania. Tak czy inaczej, oto trzy wersje:

Perl (105 znaków):

printf+(q(<script>alert(unescape("<?=urlencode(<<<E%sprintf+(q(%s),$/)x2,$/%sE%s)?>"))</script>),$/)x2,$/

PHP (165 znaków):

<script>alert(unescape("<?=urlencode(<<<E
printf+(q(<script>alert(unescape("<?=urlencode(<<<E%sprintf+(q(%s),$/)x2,$/%sE%s)?>"))</script>),$/)x2,$/
E
)?>"))</script>

HTML + JavaScript (235 znaków):

<script>alert(unescape("printf%2B%28q%28%3Cscript%3Ealert%28unescape%28%22%3C%3F%3Durlencode%28%3C%3C%3CE%25sprintf%2B%28q%28%25s%29%2C%24%2F%29x2%2C%24%2F%25sE%25s%29%3F%3E%22%29%29%3C%2Fscript%3E%29%2C%24%2F%29x2%2C%24%2F"))</script>

(Ps. Tak, wiem, że mogłem uczynić krok PHP niemal nieuchronnym, np. Po prostu generowanie kodu HTML + JS w Perlu i dołączanie <?phpdo niego, ale to zbytnio przypominało oszukiwanie. W tym rozwiązaniu kod jest w rzeczywistości przetwarzane w PHP zamiast po prostu kopiowane dosłownie.)


3

Niedociążenie → sed → Perl, 23 bajty

Prawdopodobnie może to obniżyć dzięki lepszemu wyborowi języków. Prawdopodobnie niekonkurencyjny, ponieważ reguła „programy sed mogą przyjmować pusty wiersz jako argument”, oznacza datę konkursu.

Program niedociążenia:

((iprint+q)Sa(:^)*aS):^

generuje program sed:

iprint+q(((iprint+q)Sa(:^)*aS):^)

który generuje program Perl:

print + q (((print + q) Sa (: ^) * aS): ^)


(uwaga: są tu dwie końcowe znaki nowej linii), która ponownie generuje oryginalny program niedociążenia:

((iprint+q)Sa(:^)*aS):^

Głównym celem tutaj jest znalezienie języków, w których łańcuchy są zagnieżdżane (tzn. Możesz po prostu zacytować łańcuch, umieszczając go w ogranicznikach, zamiast konieczności ucieczki); Niedociążenie ma (), Perl ma q(), aw sed ciąg znaków jest kontynuowany aż do białych znaków (które można domyślnie zagnieździć, jeśli w programie nie ma białych znaków). Prawdopodobnie jest tam język esolang lub golfa z instrukcją „wydrukuj resztę bieżącej linii, bez instrukcji nowego wiersza”, która byłaby tutaj idealna, ale nie tyle czasu szukałem; w takim przypadku można zapisać 8 bajtów minus długość instrukcji. (Galaretka prawie działa, ale jej instrukcja się nie zacytowała. Poza tym odsyła wyzwanie.)

Możesz zmniejszyć to do 22 bajtów następujący sposób:

((csay + q) Sa (: ^) * aS): ^

(z jednym końcowym znakiem nowej linii, jak zwykły plik tekstowy, zamiast zera, który zwykle otrzymujesz w golfie). Wymaga to jednak interpretera niedociążenia, który jest w porządku, traktując znak nowej linii jako brak możliwości. Wypróbuj online !, ale wydaje mi się, że stanowi to wyzwanie.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.