Scrivi un quinto ordine del terzo ordine


17

Questa sfida è un'estensione di " Golf a mutual quine ".

Utilizzando tre lingue a tua scelta, crea un programma Ouroboros di terzo ordine .

Cioè, nella lingua A, scrivere un programma pA che emette il programma pB nella lingua B. Il programma pB dovrebbe generare il programma pC nella lingua C, che a sua volta genera il programma originale pA nella lingua A.

Non ci sono due lingue in A, B e C che possono essere uguali o sottoinsiemi o superset reciproci. Nessuno di pA, pB o pC può essere identico.

Ad esempio, un programma Haskell emette un programma Perl che emette un programma java che emette il programma Haskell originale sarebbe valido.

D'altra parte, un programma C # 4 che emette un programma C # 3 che emette un programma C # 2 non è valido. Perfino una combinazione Perl -> Ruby -> Bash non sarebbe valida se, diciamo, il programma Perl e il programma Ruby fossero identici.

Questo è il golf del codice, quindi vince il programma più breve pA.


Risposte:


21

Python -> Perl -> Ruby, 48 caratteri

Adattamento della mia risposta precedente . In esecuzione

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

con Python genera questo frammento di Perl

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

che genera il seguente codice Ruby

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

che quindi stampa lo snippet originale di 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 caratteri

Volevo rendere in qualche modo significativa la catena di lingue, quindi ho pensato di scrivere uno script PHP che genera una pagina HTML contenente JavaScript. Per la terza lingua ho scelto il Perl, solo perché mi piace il Perl. :)

Alcuni potrebbero considerare queste quattro lingue, ma qui non considero l'HTML come separato da JavaScript: è un linguaggio di markup, non un linguaggio di programmazione. Comunque, ecco le tre versioni:

Perl (105 caratteri):

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

PHP (165 caratteri):

<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 caratteri):

<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. Sì, lo so che avrei potuto rendere il passo PHP quasi-noop, ad esempio semplicemente generare codice HTML + JS in Perl e aggiungerlo <?phpad esso, ma mi è sembrato troppo un imbroglio. In questa soluzione, il codice è in realtà elaborato in PHP invece di essere copiato alla lettera.)


3

Sottocarico → sed → Perl, 23 byte

Probabilmente puoi abbassarlo con una migliore scelta delle lingue. Probabilmente non competitiva perché la regola "i programmi sed possono prendere una riga vuota come argomento" postdatano il concorso.

Il programma Underload:

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

genera il programma sed:

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

che genera il programma Perl:

stampare + q (((stampa + q) Sa (: ^) * AS): ^)


(nota: ci sono due nuove righe finali qui), che genera nuovamente il programma Underload originale:

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

Lo scopo principale qui è trovare le lingue in cui le stringhe sono annidabili (cioè puoi semplicemente citare una stringa racchiudendola in delimitatori, piuttosto che doverla sfuggire); Underload ha (), Perl ha q(), e in sed una stringa continua fino allo spazio (che è implicitamente annidabile se non c'è spazio nel programma). Esiste probabilmente un linguaggio esolang o golf con un'istruzione "stampa il resto della linea attuale, non seguita da nuove righe", che sarebbe l'ideale qui, ma non ho passato tutto il tempo a cercarne uno; in tal caso è possibile salvare 8 byte meno la lunghezza dell'istruzione. (Jelly quasi funziona ma le sue istruzioni non citano se stessa. Inoltre, postdatizza la sfida.)

Puoi ridurlo a 22 byte in questo modo:

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

(con una nuova riga finale, come un normale file di testo, anziché lo zero che normalmente si ottiene nel golf). Tuttavia, ciò richiede un interprete Underload che sia corretto nel trattare Newline come no-op. Provalo online! Sì, ma penso che la sfida sia postdatata.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.