Catena a quino bidirezionale


9

PPCG non ne ha già abbastanza di quine ...

Sfida:

Il tuo compito è creare un programma "A0". Quando questo programma viene eseguito senza input, non genera nulla. Quando questo programma viene eseguito con input, genera "A1". Quando "A1" viene eseguito senza input, produce "A0". Quando "A1" viene eseguito con l'ingresso, produce "A2". Praticamente, "A (k)" produrrà "A (k-1)" quando viene eseguito senza input e verrà emesso "A (k + 1)" quando viene eseguito con input.

Dettagli

Credo che questa sfida sia abbastanza semplice; non ci sono altre regole davvero. A proposito, ogni programma deve contenere almeno 1 byte. Si può presumere che l'input sarà composto solo da caratteri ASCII e, se lo si desidera, è possibile ignorare gli spazi bianchi, ma non è possibile specificare un input specifico. L'output può essere su STDOUT o STDERR, ma tutti i tuoi programmi devono essere inviati allo stesso. L'altro può contenere anche testo (quindi è possibile eseguire l'output su STDOUT e quindi uscire con un errore). Grazie a @Dennis per averlo sottolineato.

Tutti i programmi devono essere nella stessa lingua e ogni programma deve essere unico rispetto al resto di essi.

Il punteggio è uguale alla lunghezza del programma "A0". Dato che si tratta di una sfida di code-golf, vince il punteggio più basso!


Sono triste nel prevedere che la maggior parte degli invii avrà A (k) e A (k + 1) che differiscono per un singolo carattere che viene aggiunto a una stringa crescente :(
Sparr

@Sparr Sfortunatamente, sarà probabilmente quello che succederà. :( Oh bene, non riesco a capire come fare una chiara regola contro questo.
HyperNeutrino

puoi eseguire l'output su uno dei due che non sono sicuro se lo sto interpretando correttamente. Se stampiamo l'output desiderato su STDOUT, STDERR deve essere vuoto? Perché è consentito uscire manualmente con un errore.
Dennis,

Tutti i programmi devono essere diversi? La domanda non lo dice.

4
Inoltre, posso suggerire un titolo un po 'più espressivo come "Bidirezionale Quine Chain"? "super meta quine" non dice molto oltre i programmi che stampano altri programmi e renderà più difficile la ricerca di questa sfida in futuro.
Martin Ender,

Risposte:


1

Pip , 28 byte

V Y"I#qSti0+i?`V Y`.RPyRtiu"

Provalo online!

Spiegazione

Questa è una versione modificata del più breve noto Pip Quine V Y"`V Y`.RPy". Questo quine funziona definendo una stringa, inserendola nella yvariabile e quindi valutandola. Quando valutata, la stringa prende il repr di y(avvolgendo così il valore tra yvirgolette doppie) e concatena il modello letteralmente `V Y`in primo piano.

La nostra strategia è quella di inserire un 0nel programma, quindi sostituirlo 0con 10se c'è stato input, o sostituire 10con 0se non c'è stato input. (Pertanto, A ( k ) conterrà un numero composto da k 1 seguito da uno 0.) 0e 10sono utili perché ci sono variabili incorporate ( ie t, rispettivamente) con quei valori, quindi possiamo fare riferimento a loro senza usare cifre effettive .

Quindi, invece di RPy, vogliamo RP yRitse ci fosse input e RP yRtise no. Possiamo combinare i due casi scambiando i valori di te ise c'è input ( I#q Sti), quindi facendo RP yRti. (Dobbiamo testare #qla lunghezza dell'input, perché gli input like 0sono falsi.)

Ora non ci resta che ottenere un valore letterale 0nel codice e gestire il caso speciale di A0 che non produce output. Entrambi possono essere risolti testando 0+ie restituendo use è falso:

  • Per qualsiasi k > 0, il numero in A ( k ) sarà diverso da zero e quindi veritiero (ad es 110+i.).
  • Per k = 0, il numero in A ( k ) sarà zero:
    • Se non v'è ingresso, ie tsi invertono ed iè 10. 0+iè ancora truthy.
    • Se non c'è input, iè ancora 0 ed 0+iè false. Invece del quine core, abbiamo output u, che è una variabile incorporata per zero. La stampa zero non produce output.

Buon lavoro! Funziona come un fascino.
HyperNeutrino

1

Python 2, 93 byte

C'è un avanzamento riga finale.

p=1+2*bool(input())-1;s='print"p=%r+2*bool(input())-1;s=%r*(p>0);exec s"%(p,s)'*(p>0);exec s

Provalo con input | Provalo senza input

Questo è stato modificato dalla mia risposta su una domanda simile.

Se c'è input, allora aumenterà p. Così il programma risultante sarà p=2+..., p=3+...ecc


Questo non riconosce 0 come input
fəˈnɛtɪk,

@LliwTelracs L'input deve essere racchiuso tra virgolette (deve essere una puntura). Vedi i collegamenti ipertestuali nella risposta.
mbomb007,

Così com'è, il tuo programma funziona con stringhe e tutti i numeri diversi da 0.
f 28nɛtɪk,

1
@LliwTelracs Beh, allora non provare a usare i numeri. Secondo il consenso, posso usare input()e richiedere che l'input sia racchiuso tra virgolette, piuttosto che usare raw_input(). Se si desidera immettere zero, utilizzare "0".
mbomb007,

Bella soluzione! Mi aspettavo che la maggior parte delle risposte aumentasse in modo infinito (tecnicamente questo lo fa, ma non nello stesso senso). Buon lavoro!
HyperNeutrino
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.