Codegolf: Quine e Antiquine


13

Questa sfida è simile a Can You Meta Quine?

Un quine è un programma che si produce su STDOUT. Questa sfida è quella di produrre un programma A che quando eseguito produce un programma B su STDOUT. Il programma B quando viene eseguito produce il programma A su STDOUT. I programmi A e B devono essere scritti (ed eseguiti) nella stessa lingua. La domanda collegata limitava A! = B. Sembrava troppo facile. Quindi, per questa domanda, insistiamo sul fatto che A e B siano antichità, usando le seguenti regole:

  1. I programmi A e B non possono usare nessuno degli stessi caratteri, salvo spazi bianchi e separatori di istruzioni e caratteri di punteggiatura.
  2. I programmi A e B devono contenere almeno un carattere che non sia né spazi bianchi né un separatore di istruzioni, né un carattere di punteggiatura.
  3. Ai fini delle regole 1 e 2, il termine "spazi bianchi" esclude qualsiasi simbolo o sequenza di simboli che a sua volta è un'istruzione, un operatore o un simbolo interpretato (al contrario di un separatore). Pertanto, nel linguaggio degli spazi bianchi, non esiste uno spazio bianco.
  4. Un separatore di istruzioni è un elemento sintattico usato convenzionalmente nella lingua per separare le istruzioni. Ciò include la nuova riga in python o il punto e virgola in Java, perl o C.
  5. Un carattere di punteggiatura è un carattere ASCII che non è né spazi bianchi né nella classe di caratteri della parola POSIX (ovvero un carattere di sottolineatura non è punteggiatura per questo scopo) - vale a dire ispunct()che restituisce vero, e non lo è _.
  6. Il programma A quando eseguito deve produrre un programma (programma B) sul suo STDOUT, che quando eseguito a sua volta produce il programma A.
  7. I programmi A e B devono essere nello stesso linguaggio di programmazione.
  8. Il linguaggio di programmazione utilizzato deve effettivamente essere un linguaggio di programmazione. A meno che tu non faccia un buon caso, suggerirò che Turing deve essere completo.
  9. Almeno uno di A e B deve eseguire almeno un'istruzione all'interno della lingua.

Questo è il codice golf, quindi vince la risposta più breve, il punteggio è la lunghezza del programma A in byte (cioè la lunghezza del programma B non è rilevante).


Puoi aggiungere "punteggiatura" all'elenco delle eccezioni nella prima clausola? In caso contrario, è impossibile risolvere questo compito in molte lingue (in particolare quelle che richiedono delle parentesi graffe nella funzione principale).
FUZxxl,

correlati ma probabilmente sufficientemente diversi.
Martin Ender,

@FUZxxl Ho permesso i segni di punteggiatura ma ho escluso i trattini bassi.
circa

1
Ai fini qui, sono Ae aconsiderati diversi "personaggi"?
HostileFork dice di non fidarsi di SE

1
Sarebbe meglio se
fornissi

Risposte:


5

GolfScript, 13 byte

1{\~\".~"}.~

L'output è

-2{\~\".~"}.~

che genera il programma iniziale.

Il conteggio dei byte include l'LF finale, poiché l'output dell'output lo conterrà.

Provalo online.

Come funziona

1       # Push 1.
{       # Start code block.
  \~\   # Apply logical NOT to the second topmost element of the stack.
  ".~"  # Push that string.
}       # End code block.
.~      # Duplicate the code block and execute the copy.

GolfScript stampa il contenuto dello stack al termine.


Si prega di leggere nuovamente la dichiarazione del problema -Programs A and B may not use any of the same characters, save for whitespace and statement separators, and punctuation characters.
isaacg,

1
Tutto tranne 1ed 2è punteggiatura.
Dennis,

OK, le regole sono state cambiate dall'ultima volta che le ho lette.
isaacg,

Sì, funziona. Avevo definito le regole per impedire che gli spazi bianchi venissero usati come dichiarazioni, ma avevo dimenticato la stessa scappatoia per la punteggiatura. Quindi scappatoia legalmente sfruttata.
circa

14

Pascal (731 caratteri)

Programma A:

program s;{$h+}uses sysutils;const p='program s;{$h+}uses sysutils;const p=';a='a';aa=''';';aaa='a=''';aaaa='''';aaaaa='begin write(lowercase(p+aaaa+p+aa+aaa+a+aa+a+aaa+aaaa+aa+aa+a+a+aaa+aaa+aaaa+aa+a+a+a+aaa+aaaa+aaaa+aa+a+a+a+a+aaa+stringreplace(stringreplace(stringreplace(stringreplace(aaaaa,aaaa,aaaa+aaaa,[rfreplaceall]),''lower''+''c'',''tm''+''p'',[]),''up''+''c'',''lower''+''c'',[]),''tm''+''p'',''up''+''c'',[])+aa+aaaaa))end.';begin write(upcase(p+aaaa+p+aa+aaa+a+aa+a+aaa+aaaa+aa+aa+a+a+aaa+aaa+aaaa+aa+a+a+a+aaa+aaaa+aaaa+aa+a+a+a+a+aaa+stringreplace(stringreplace(stringreplace(stringreplace(aaaaa,aaaa,aaaa+aaaa,[rfreplaceall]),'lower'+'c','tm'+'p',[]),'up'+'c','lower'+'c',[]),'tm'+'p','up'+'c',[])+aa+aaaaa))end.

Programma uscite B:

PROGRAM S;{$H+}USES SYSUTILS;CONST P='PROGRAM S;{$H+}USES SYSUTILS;CONST P=';A='A';AA=''';';AAA='A=''';AAAA='''';AAAAA='BEGIN WRITE(UPCASE(P+AAAA+P+AA+AAA+A+AA+A+AAA+AAAA+AA+AA+A+A+AAA+AAA+AAAA+AA+A+A+A+AAA+AAAA+AAAA+AA+A+A+A+A+AAA+STRINGREPLACE(STRINGREPLACE(STRINGREPLACE(STRINGREPLACE(AAAAA,AAAA,AAAA+AAAA,[RFREPLACEALL]),''LOWER''+''C'',''TM''+''P'',[]),''UP''+''C'',''LOWER''+''C'',[]),''TM''+''P'',''UP''+''C'',[])+AA+AAAAA))END.';BEGIN WRITE(LOWERCASE(P+AAAA+P+AA+AAA+A+AA+A+AAA+AAAA+AA+AA+A+A+AAA+AAA+AAAA+AA+A+A+A+AAA+AAAA+AAAA+AA+A+A+A+A+AAA+STRINGREPLACE(STRINGREPLACE(STRINGREPLACE(STRINGREPLACE(AAAAA,AAAA,AAAA+AAAA,[RFREPLACEALL]),'LOWER'+'C','TM'+'P',[]),'UP'+'C','LOWER'+'C',[]),'TM'+'P','UP'+'C',[])+AA+AAAAA))END.

Programma uscite A.


3
Mi sto godendo il (cattivo) uso della traduzione del caso.
circa

11

ROT13 ( non più in competizione dopo l'aggiornamento della regola )

Non sono sicuro che questo valga come una lingua, ma di certo non ho compensato la sfida. Solitamente sedvengono accettate anche risposte per determinate utilità come quelle . Tuttavia, è un appello di giudizio, quindi se non conta lo rimuoverò (c'è una meta discussione da qualche parte su ciò che conta come una lingua? Modifica: ora c'è )

A

Cicli tra Ae N:

~>> echo "A" | rot13
N
~>> echo "A" | rot13 | rot13
A

Penso che non funzioni, dato che rot13 sta semplicemente prendendo input STDIN, non eseguendo un programma. Se stai sostenendo che si tratta di un programma di lunghezza zero, questo non riesce a soddisfare la regola 2. Il programma (con sed) è ciò che è passato sed -e. Se questo fosse accettabile, allora catsarebbe un quine, e tacsarebbe un quine e un antiquine. Tuttavia, nulla sta producendo la fonte cat, taco per quella materia rot13.
circa

@abligh Se rot13 è la lingua utilizzata, perché dovrei stampare il codice sorgente per rot13? Inoltre, se eseguo Golfscript, Python o qualsiasi altra cosa, probabilmente gli passerò semplicemente il codice sorgente tramite stdin o file, quindi non c'è davvero alcuna differenza. In questo caso rot13 è l'interprete.
Ingo Bürk,

rot13poiché un linguaggio di programmazione non sembra soddisfare una definizione ragionevole di "linguaggio di programmazione" e non interpreta nulla. Modificherò la domanda per renderlo più chiaro.
circa

Bene con me. Lascerò questa risposta come non più in competizione e inizierò una meta discussione. Bella sfida, comunque. Non vedo l'ora di vedere soluzioni "reali"!
Ingo Bürk,
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.