Implementa una macchina per la verità


148

Una macchina della verità (i crediti vanno a questo ragazzo per averlo inventato) è un programma molto semplice progettato per dimostrare l'I / O e controllare il flusso di una lingua. Ecco cosa fa una macchina della verità:

  • Ottiene un numero (0 o 1) da STDIN.

  • Se quel numero è 0, stampa 0 e termina.

  • Se quel numero è 1, stampa 1 per sempre.

Sfida

Scrivi una macchina della verità come descritto sopra nella tua lingua preferita. La macchina della verità deve essere un programma completo che segue queste regole:

  • accetta input da STDIN o un'alternativa accettabile
    • Se la tua lingua non può ricevere input da STDIN, potrebbe richiedere input da una variabile hardcoded o equivalente equivalente nel programma
  • deve essere inviato a STDOUT o un'alternativa accettabile
    • Se la tua lingua non è in grado di emettere caratteri 0o 1, I / O byte o unari sono accettabili.
  • quando l'input è 1, deve continuamente stampare 1se si ferma solo se il programma viene ucciso o la memoria si esaurisce
  • l'output deve essere solo uno 0seguito da uno o nessun newline o spazio, oppure infiniti 1s con ciascuno 1seguito da uno o nessun newline o spazio. Nessun altro output può essere generato, tranne un output costante dell'interprete della tua lingua che non può essere soppresso (come un saluto, codici colore ANSI o rientro). L'utilizzo di newline o spazi deve essere coerente: ad esempio, se si sceglie di eseguire l'output 1con una newline dopo che tutti 1devono avere una nuova riga dopo di essi.

  • se e solo se la tua lingua non può eventualmente terminare con un suo input 0, è accettabile che il codice entri in un ciclo infinito in cui non viene emesso nulla.

Poiché si tratta di un catalogo, le lingue create dopo questa sfida possono competere. Si noti che deve essere presente un interprete per poter testare l'invio. È permesso (e persino incoraggiato) di scrivere questo interprete per una lingua precedentemente non implementata. A parte questo, tutte le regole standard del devono essere rispettate. Gli invii nella maggior parte delle lingue verranno calcolati in byte con una codifica preesistente appropriata (di solito UTF-8).

Catalogare

Lo snippet di stack nella parte inferiore di questo post genera il catalogo dalle risposte a) come elenco della soluzione più breve per lingua eb) come classifica generale.

Per assicurarti che la tua risposta venga visualizzata, ti preghiamo di iniziare la risposta con un titolo, utilizzando il seguente modello Markdown:

## Language Name, N bytes

dov'è Nla dimensione del tuo invio. Se si migliora il punteggio, è possibile mantenere i vecchi punteggi nel titolo, colpendoli. Per esempio:

## Ruby, <s>104</s> <s>101</s> 96 bytes

Se si desidera includere più numeri nell'intestazione (ad es. Perché il punteggio è la somma di due file o si desidera elencare separatamente le penalità del flag dell'interprete), assicurarsi che il punteggio effettivo sia l' ultimo numero nell'intestazione:

## Perl, 43 + 2 (-p flag) = 45 bytes

Puoi anche rendere il nome della lingua un collegamento che verrà quindi visualizzato nello snippet:

## [><>](http://esolangs.org/wiki/Fish), 121 bytes


Possiamo supporre che il programma si arresti quando il processore termina l'esecuzione del codice scritto, per l'inserimento di un codice macchina?
lirtosiast,

3
Supponendo che qualsiasi comportamento vada bene per tutti gli input non validi?
Cruncher,

3
@Cruncher Sì, gli unici input che dovresti aspettarti sono 0 e 1.
uno spaghetto

4
Il catalogo è aggiornato.
Addison Crump,

2
Il catalogo sembra prendere in considerazione Bfe bfessere lingue diverse.
Mooing Duck,

Risposte:


189

Esagonia , 6 byte

Questo è stato sorprendentemente complicato, e non sono convinto che sia ottimale ...

<.@!$?

Dopo aver riempito e spiegato il codice, questo rappresenta la seguente griglia esadecimale:

inserisci qui la descrizione dell'immagine

Questo utilizza un flusso di controllo simile a quello del mio recente programma cat privo di errori , che si muove lungo anti-diagonali. Per ottenere ciò, iniziamo deviando il puntatore dell'istruzione (IP) a sinistra, dove il percorso viola si avvolge nell'angolo in basso a sinistra.

?legge l'input come numero intero. !lo stampa indietro. .è solo una no-op. Ora l'angolo della griglia funge da ramo:

Se l'input era 0, l'IP continuerà lungo il percorso rosso, che termina semplicemente con il programma @.

Se l'input era 1, l'IP continuerà sul percorso verde. Ancora una volta, .è solo una no-op, ma $è l'equivalente del trampolino di Befunge: salta la prossima istruzione. Dopo il wrapping, l'istruzione successiva sarebbe la ?, ma a causa $dell'esecuzione in realtà continua sul percorso blu, iniziando con la !stampa di un'altra copia del file 1. Questo ciclo che contiene solo !..$ora viene ripetuto indefinitamente.

Uno studio del flusso di controllo in esagonia ...

Credo che la soluzione di cui sopra sia ottimale. Ho scritto un bruto forcer, che controlla tutti i programmi Hexagony a 6 byte, che contengono almeno uno ciascuno ?!@(che sono necessari; ho anche controllato :e %al posto di @terminare con un errore di divisione per zero, ma neanche quello ha aiutato). Il controllo stampa tutti i programmi che a) producono un 0input 0e terminano eb) producono almeno due 1s (e nient'altro) e non terminano entro i primi 60 tick del programma (200 tick per soluzioni a 5 byte) . Dubito che qualsiasi soluzione valida richiederebbe più di 200 tick per stampare correttamente la prima 0o la seconda 1su una griglia così piccola, quindi non credo di aver perso nessuna potenziale soluzione.

La ricerca non ha prodotto alcun risultato per 5 byte, ma 57 risultati per 6 byte (utilizzando @; non è necessario terminare con un errore se possiamo risolverlo in modo pulito nella stessa quantità di byte). Di questi 57 solo 6 erano falsi positivi che in realtà stampavano solo due se 1poi entravano in un ciclo infinito senza più stampare. Una soluzione è stata elencata due volte perché conteneva due !comandi. Ciò lascia esattamente 50 soluzioni valide.

Esiste un certo grado di degenerazione tra le soluzioni in cui uno o due personaggi non sono sostanziali, ad esempio perché sono effettivamente inoperabili comunque. Le soluzioni possono essere raggruppate in 23 serie di programmi veramente distinti (in alcuni casi, esiste una sola differenza di carattere tra due serie, ma cambia sostanzialmente il flusso di controllo, quindi le ho contate separatamente). Due dei gruppi usano persino più puntatori di istruzioni in un modo molto inaspettato. Dato che non avrei mai escogitato la maggior parte di questi modi per utilizzare i rami e gli specchi, fanno uno studio molto interessante su quali tipi di flusso di controllo sono possibili in Hexagony e ho sicuramente imparato alcuni nuovi trucchi per i golf futuri.

Il flusso di controllo complessivo è quasi sempre lo stesso: leggi un numero, stampalo. Se 0trova un modo per il @, se non continuare a scorrere il !mentre mantenendo un valore limite di 1. Esistono quattro eccezioni notevoli:

  • Una soluzione (quella con due !) stampa due 1s per iterazione attraverso la griglia, quindi stampa circa due volte più veloce della maggior parte dei programmi. Ho segnato questo con x2sotto.
  • Alcune soluzioni (quelle che contengono una o) sostituiscono la 1con una 111(il codice carattere di o), quindi stampano tre 1 s per iterazione, facendole stampare circa tre volte più velocemente della maggior parte dei programmi. Ho segnato questi con x3sotto.
  • Due soluzioni aggiungono un 1al valore di bordo in ogni iterazione (così 1-> 11-> 111-> ...). Quelli stampano molto velocemente, ma finiranno per esaurire la memoria. Ho segnato questi con OoMsotto.
  • Due soluzioni entrano in un circuito molto stretto che rimbalza semplicemente avanti e indietro su !, stampando su ogni altro segno di spunta (invece di ogni 5 o giù di lì), il che le rende leggermente più veloci (e più ordinate). Ho segnato questi con ><sotto.

Quindi ecco l'intero zoo:

#1                #5                #12                #19
?!/$.@            ?$!>$@            .?!/$@             |!|?$@  # ><
?!/$1@  # OoM     ?$!|$@            =?!/$@
?!/$=@                                                 #20
?!/$\@            #6                #13                $@.?<!
?!/$o@  # x3      ?/!<|@            .?/!$@             $@1?<!  # OoM
?!/$!@  # x2                        =?/!$@             $@=?<!
                  #7                                   $@o?<!  # x3
#2                ?\!<|@            #14
?!>$)@                              \!?__@             #21
?!>$1@            #8                                   _>_!?@
?!>$o@  # x3      ?<!>$@  # ><      #15
?!|$)@                              \_?!$@             #22
?!|$1@            #9                                   <!@.$?
?!|$o@  # x3      ?\$!@$            #16                <!@/$?
                                    \_?!_@             <!@=$?
#3                #10                                  <$@!$?
?!|)$@            ?~#!@)            #17                <.@!$?
?!|1$@            ?~#!@1            $$?\@!             </@!$?
?!|o$@  # x3                                           <=@!$?
                  #11               #18
#4                ?$)\@!            \$?\@!             #23
?_!<@>            ?$1\@!                               <<@]!?
                  ?$o\@!  # x3

Quella che segue è una breve procedura dettagliata per una manciata di gruppi più rappresentativi. In particolare vale la pena dare un'occhiata ai gruppi 10 e 23. Ci sono molti altri percorsi interessanti e talvolta contorti negli altri gruppi, ma penso di averti annoiato abbastanza alla fine di questo. Per chiunque voglia davvero imparare l'esagonia, vale sicuramente la pena indagare su questi, poiché esibiscono usi ancora più possibili degli specchi e $.

Gruppo 1

Questo non è molto più elaborato della mia soluzione originale, ma i percorsi vanno in direzioni diverse. Inoltre, consente il maggior numero di variazioni in una singola cella, in quanto la no-op più a destra può essere sostituita con 5 diversi comandi che lo rendono ancora valido senza modificare la struttura:

inserisci qui la descrizione dell'immagine

Gruppo 2

Questo è piuttosto interessante, perché si muove solo in orizzontale. Dopo aver eseguito il wrapping su >, l'IP si inverte immediatamente, prendendo il ramo nell'angolo. Il diagramma non è del tutto ben visibile, ma nel caso di 1attraversiamo di nuovo la prima fila, ma questa volta al contrario . Questo significa anche che ci imbattiamo di ?nuovo, che ora ritorna 0(EOF). Questo problema è stato risolto con )(incremento) per continuare a stampare 1s. Questo ha anche 5 varianti, come )potrebbe anche essere 1o o, e >potrebbe anche essere |:

inserisci qui la descrizione dell'immagine

Gruppo 3

Questo sembra quasi identico al precedente ma è disordinato da morire. Colpire |e poi attraversare la riga inferiore o superiore è lo stesso. Ma nel caso di un ciclo, l' $ora salta sul ) sul specchio. Quindi seguiamo il percorso turchese a destra, ora colpiamo l'incremento, saltiamo sopra @prima di avvolgere di | nuovo il percorso e poi torniamo al percorso verde in alto.

inserisci qui la descrizione dell'immagine

Gruppo 4

Ho pensato che questo fosse particolarmente elegante:

inserisci qui la descrizione dell'immagine

Lo _specchio nell'angolo in alto a destra è inizialmente un non-op, quindi stampiamo con !e premiamo il <. Il 0percorso ora colpisce lo specchio orizzontale e termina. Tuttavia, il 1percorso assume una traiettoria davvero interessante: devia verso il basso, si avvolge verso il basso !, viene reindirizzato verso l'orizzontale e poi torna indietro verso il ! nuovo . Continua quindi a muoversi in questa forma di rombo, stampando due volte per iterazione (ogni terzo segno di spunta).

Gruppo 8

Questa è una delle due soluzioni con un ciclo di stampa davvero stretto:

inserisci qui la descrizione dell'immagine

I <funge da ramo. Dopo aver avvolto due volte, 0colpisce @. 1d'altra parte, prima salta il ?, quindi lo >invia di $nuovo sul, in modo che salti il @. Quindi l'IP si avvolge nel percorso turchese, dove rimbalza avanti e indietro tra >e <(avvolgendosi attorno al bordo in mezzo).

Gruppo 10

Uno dei due gruppi che usano altri puntatori di istruzioni ed è assolutamente bello. Hexagony ha 6 - ognuno inizia da un angolo diverso lungo il bordo in senso orario, ma solo uno di essi è attivo alla volta.

inserisci qui la descrizione dell'immagine

Come al solito, leggiamo con ?. Ora ~è negazione unaria: trasforma la 1in a -1. Successivamente, abbiamo colpito il #. Questo è un modo per passare da un IP all'altro: prende l'attuale valore di bordo modulo 6 e passa all'IP corrispondente (gli IP sono numerati 0in senso orario). Quindi, se l'input è stato 0, allora l'IP rimane semplicemente lo stesso, e viaggia noiosamente dritto in avanti !@. Ma se l'input era 1, allora il valore corrente è -1quale è 5 (mod 6). Quindi passiamo all'IP che inizia sulla stessa cella (il percorso verde). Ora #è una no-op e ?imposta il limite della memoria su 0. )incrementi così !stampa a 1. Ora premiamo di ~nuovo per assicurarlo#è ancora una no-op (al contrario di passare a IP 1 che terminerebbe il programma). È strabiliante quanto bene tutto si combini in questo piccolo programma.

Gruppo 22

Solo per notare, questo è il gruppo in cui si trova la mia soluzione originale. Capita anche di essere il gruppo più grande, perché il no-op può trovarsi in due posti diversi e ci sono diverse scelte per il comando effettivo (no-op effettivo).

Gruppo 23

Questo è l'altro gruppo che utilizza più IP. In realtà questo utilizza 3 IP diversi. L'angolo in alto a destra è un po 'un casino, ma proverò a guidarti attraverso questo:

inserisci qui la descrizione dell'immagine

Quindi, l'inizio che hai visto prima: <devia il Nord-Est, ?legge l'input. Ora ]è un altro modo per passare da un IP all'altro: passa il controllo al successivo IP in senso orario. Quindi passiamo al controllo del percorso turchese che (so che è difficile da vedere) inizia nell'angolo nord-est andando a sud-est. Si riflette immediatamente nel <modo in cui si avvolge nell'angolo sud-est, andando a nord-ovest. E ' anche colpisce il ]modo si passa al successivo IP. Questo è il sentiero grigio che inizia nell'angolo est, in direzione sud-ovest. Stampa l'input, quindi si avvolge nell'angolo nord-est. <devia il percorso in orizzontale, dove viene riflesso dall'altro < . Ora la mano destra<agisce come una diramazione: se l'input era 0, l'IP si sposta a nord-est e si sposta su @. Se l'input era 1, l'IP si sposta su !, si avvolge sul lef-thand <dove si riflette ... ora nell'angolo, si avvolge di nuovo su !, viene deviato da destra <, riflesso da sinistra <e inizia il percorso al di sopra di...

Piuttosto un casino, ma un bel casino. :)


Diagrammi generati con l' incredibile HexagonyColorer di Timwi .


55
whoa. solo whoa.
Conor O'Brien,

6
^ concordato. Così bello ...
El'endia Starman,

28
Stai zitto e prendi il mio voto!
Mego

7
@ThomasOltmann Ammetto che questa risposta presuppone alcune conoscenze di base della lingua. Se in realtà sei interessato a saperne di più, ho passato le basi in questa risposta e in questa risposta , ma non ti biasimerei se non lo sei. ;)
Martin Ender,

5
Sì ... il modello di memoria sembra un po 'doloroso (ma comunque migliore di un nastro 1D, immagino)
John Dvorak

144

Motorola MC14500B Codice macchina, 2 byte

In esadecimale:

58EC

Spiegazione:

5  OR the register with input from the data bus
8  Write the register to the data bus
E  Skip next instruction if register is zero
C  Jump

Motorola MC14500B è un microcontrollore a 1 bit; ha un registro da 1 bit e un bus dati da 1 bit. Dato che gli opcode sono 4 bit ciascuno, ce ne sono solo sedici; la metà esegue un'operazione logica tra il registro e il bit sul bus dati.

L'istruzione di salto imposta una bandiera di salto; quando non viene fornito alcun indirizzo, è comune impostare il contatore del programma su 0. Se il bit di input era zero, il processore non salterà. Se il bit di input era 1, il processore torna all'inizio; dato che stiamo ORinserendo input, non importa quale sia il segnale di input successivo: il registro sarà quindi 1 per sempre.

Come è convenzionale, il registro è inizializzato su 0.

Un elenco dei codici operativi è disponibile nella scheda tecnica o qui .


7
2 byte è sicuramente il minimo per questa sfida.
Conor O'Brien,

23
@ CᴏɴᴏʀO'Bʀɪᴇɴ Ho cercato diverse ore attraverso esolangs ed elenchi di processori a 4 bit per vedere se c'è 1 o 1.5 e non ne ho trovato uno.
lirtosiast

Sicuramente lo strumento giusto per il lavoro.
Hugo Zink,

Link is borked atm ...
TheDoctor

@TheDoctor Entrambi i collegamenti funzionano bene per me
Mego

85

Arnold C, 296 byte

IT'S SHOWTIME
    HEY CHRISTMAS TREE i    
    YOU SET US UP @NO PROBLEMO
    BECAUSE I'M GOING TO SAY PLEASE i
        STICK AROUND i
            TALK TO THE HAND i
        CHILL
    BULLSHIT
        TALK TO THE HAND i
    YOU HAVE NO RESPECT FOR LOGIC
YOU HAVE BEEN TERMINATED

Non proprio competitivo, ma per il gusto di farlo. Non supporta lo stdin, sostituirlo @NO PROBLEMOcon @I LIEDper un valore zero. @No Problemoè 1.

Esegui con (supponendo che il file sia truthmachine.arnoldc):

wget http://lhartikk.github.io/ArnoldC.jar
java -jar ArnoldC.jar truthmachine.arnoldc
java truthmachine

46
Bellissimo. Ho pianto 10/10
uno spaghetto il

10
BECAUSE I'M GOING TO SAY PLEASELOL
Eric Martinez,

8
Sembra che questo if(i){while(i) print(i);} else {print(i);}sicuramente sarebbe più breve da fare print(i);while(i) print(i);?
Lirtosiast

16
Sebbene BULLSHITabbia un grande contributo al valore di intrattenimento del programma, tecnicamente non è necessario. Puoi fattorizzare l'intero BULLSHITramo spostandoti TALK TO THE HAND idopo YOU HAVE NO RESPECT FOR LOGIC.
Gaborsch,

4
@GaborSch C'è solo una risposta adeguata a questo BULLSHIT
:;

65

Minecraft, 18 byte (versione MC 15w45a)

schizzo di Minecraft

Come puoi vedere, c'è una leva diretta nel blocco comandi ripetuto, che contiene il comando say 1. C'è un segnale che inverte la torcia in cima a quello, che dirige l'alimentazione nel blocco di comando a corsa singola con il comando say 0in esso.

Ogni volta che l'interruttore è diretto verso la verità, il blocco ripetitore utilizza il codice say 1per produrre infiniti 1s. Quando la leva viene reindirizzata su false, viene emesso un singolo 0.

Si noti che questo genera un [@]valore predefinito. Se vuoi davvero solo 1 e zero, questo diventa 34 byte, dove sono i codici nei blocchi di comando tellraw @a [1]e tellraw @a [0]. Questo utilizza il conteggio di byte suggerito da @ Cᴏɴᴏʀ O'Bʀɪᴇɴ per MC, come si può trovare in Meta .


28
Hai usato un videogioco per il golf del codice. +1
RK.

11
@RK. Questa è in realtà una pratica abbastanza standard per sfide semplici. Ci sono almeno altri due utenti che usano MC come linguaggio per giocare a golf con il codice - prova la barra di ricerca con is:answer Minecraft. c:
Addison Crump,

1
@FlagAsSpam lol ben fatto. Inoltre, grazie per quel suggerimento per cercare le risposte MC.
Ashwin Gupta,


38

Ruby, 20 anni

print while/1/||gets

Esegui dalla riga di comando per evitare avvisi, come

ruby -e "print while/1/||gets" <<< 0
ruby -e "print while/1/||gets" <<< 1

Spiegazione:

Meno golfista, questo è

while /1/ || gets
  print
end

Quando un Regexp viene utilizzato in un condizionale, viene valutato come falso a meno che la variabile non $_sia popolata e corrisponda al modello. La prima volta attraverso il ciclo, $_è vuoto, quindi passiamo a gets, che imposta il valore di $_una riga letta da STDIN. printsenza argomenti stampa $_. Ora valutiamo di nuovo il condizionale. Se leggiamo in 1, cortocircuiamo e stampiamo di nuovo 1, e così via per sempre. Altrimenti, cadiamo a gets, ma poiché non esiste una seconda riga di input, getsrestituisce zero, quindi il ciclo termina.


18
È bello quando compiti banali permettono ancora soluzioni pazzesche anche in linguaggi "normali". :)
Martin Ender,

La ||getsparte è bella e tutto, ma non puoi semplicemente fare gets;print while/1/e salvare un byte?
daniero,

No, quindi non stampa affatto lo 0.
istocratico

37

Microscript, 3 byte

i{p

Il più corto che conosco.

Spiegazione:

i  Takes numeric input and puts it in register 1
{  while register 1 is truthy
  p  Print the contents of register 1

Microscript ha la stampa implicita del registro 1 al termine, motivo per cui un input di 0viene stampato una volta.


@quartata Ti ho abbinato: D
Conor O'Brien,

@ CᴏɴᴏʀO'Bʀɪᴇɴ: O
uno spaghetto il

2
Mi chiedo seriamente se hai scritto prima la domanda o la risposta ...
John Dvorak,

1
La domanda. Volevo solo pubblicare questo dato che era il più breve che mi è venuto in mente mentre scrivevo la domanda. È un catalogo quindi non ci sono veri vincitori.
uno spaghetto l'

36

Codice di Turing Machine, 32 byte

Utilizzando la sintassi della tabella delle regole trovata qui.

0 0 0 * halt
0 1 1 r 1
1 _ 1 r 1

Mi piace molto questo. +1
uno spaghetto il

Sapevo che qualcuno l'avrebbe già pubblicato!
YoYoYonnY,

25

JavaScript, 28 byte

Perché i loop sono spesso più brevi di mentre i loop.

alert(x)restituisce undefined, che è falso, quindi bit per bit o operatore, |lo lancia a 0. Quindi, se lo xè "0", avvisa una volta, altrimenti continua ad eseguire il loop. Utilizza alertper STDOUT come questa risposta .

for(x=prompt();alert(x)|x;);

Spara, mi hai battuto. Stavo per pubblicare esattamente questo! :) GG
Domino,

Wow, è un po 'più intelligente del mio :) Prendi un +1!
ETHproductions

Non è necessario il punto e virgola finale.
Conor O'Brien,

@ CᴏɴᴏʀO'Bʀɪᴇɴ Quale browser hai utilizzato? L'ho provato su Firefox e Chrome e ottengo un SyntaxErrorsenza di esso.
intrepidcoder

@intrepidcoder Oh, scusa, mio ​​cattivo. La mia mente era in modalità "i punti e virgola finali inutili". ^^ "
Conor O'Brien,

24

Python 2, 29 byte

a=input()
while 1:print a;1/a

Questo termina con un errore di divisione attivato 0, che è consentito per impostazione predefinita .


L'output di STDERR va bene. Anche la risposta> <> la usa.
uno spaghetto il

Questo è geniale ^ _ ^
ABcDexter

Mentre una stampa sarebbe un'opera? Scusa, non conosco Python.
Rohan Jhunjhunwala,

1
@RohanJhunjhunwala Per 0, non stampa nulla, ma dovrebbe stamparlo una volta.
xnor

1
@xnor oh, il mio male.
Rohan Jhunjhunwala,

20

Brainfuck, 41 36 31 30 byte

Accorciato stampando una volta subito dopo l'input e con l'aiuto di Ethan e user46915.

,.+++[->>+<-----<]>>---<-[>.<]

Versione precedente: sottrai 48 dall'input e, se non è zero, aggiungi 1 a 48 per stampare ASCII 1per sempre, altrimenti stampa 0.

-[>+<-----]>--->,<[->->+<<]>[>+<]>.<[>.<]

L'ho eseguito qui , ma a causa dell'output bufferizzato, non è possibile visualizzare alcun output poiché il programma non termina mai 1.

Modifica: avevo dimenticato di stampare 0sull'input 0. Riparato ora. Mi piacciono le >.<facce alla fine.


1
@ThomasKwa Suppongo di no, ma non sono sicuro poiché non vedo un algoritmo specifico per il modulo 2. L' algoritmo divmod è un po 'lungo.
mbomb007,

2
Puoi accorciarlo un po 'di più unendo le parti di codice un po' meglio e usando direttamente il tuo registro di input invece di avere un registro "48" separato:,.[>+>+<<-]-[>-<-----]>+++[>.<]
Ethan,

Ho tentato una soluzione con mod 2. Sicuramente sembra che sottrarre 48 sia la strada giusta da percorrere. ,.[->+>+<<]>>[->[>-<[-]]>+[<+>-]<<]>[<<.>>]
cardboard_box

1
@Ray Questo è il valore predefinito ed è generalmente assunto. Se avessi usato un'altra implementazione, lo avrei detto.
mbomb007,

1
Puoi ottenere un altro byte off combinando sottrazione e copia insieme:,.+++[->>+<-----<]>>---<-[>.<]
user46915

19

Piet, 27 18 16 codici

(Codel è un nome di fantasia per pixel usato per evitare confusione quando un'immagine viene allungata per la visualizzazione. Ho contato i codici anziché i byte perché gli script piet vengono salvati come immagini, quindi la dimensione fisica può variare. Penso che un formato di file ideale che salverebbe questo piet nel modo più efficiente possibile richiederebbe 11 byte. In pratica, il mio piccolo file gif è di 62 byte, con dati di tavolozza ottimali. Dimmi se dovrei usare questo come dimensione della mia voce anziché la quantità del codice.)

Immagine originale: versione minuscola

allargata: versione ingrandita

Nel piet, la differenza tra due colori è ciò che determina quale comando viene eseguito, quindi vedere lo stesso colore due volte non significa che fa la stessa azione. L'esecuzione inizia nel codice in alto a sinistra. Quindi si sposta in orizzontale, eseguendo le seguenti operazioni:

  1. Leggi un numero e mettilo in pila
  2. Duplica la parte superiore della pila
  3. Pop e output in cima allo stack
  4. Pop in cima alla pila e ruotare in senso orario quel numero di volte.

Se l'ingresso era 1, il cursore si sposta in basso nel codice lime, che spinge 1 sulla pila. Quindi l'esecuzione continua andando a sinistra. Quando il cursore passa da un colore al bianco e da bianco a un colore, non succede nulla. Poiché anche il nero è considerato come un muro, il cursore finisce per tornare al codice lime sulla riga superiore e ripete tutto dal passaggio 2.

Se, tuttavia, l'ingresso era 0, il cursore non scenderà mai e finirà nella J blu a destra (gioco di parole previsto, ne valeva la pena), se rimarrà intrappolato (perché in alto, a destra, a sinistra e i lati inferiori di questo blocco a forma di J sono accanto ai codici neri o al bordo dell'immagine). Poiché il cursore è intrappolato, l'esecuzione termina.

Valori imprevisti:
se l'utente scrive un altro numero, verrà comunque stampato, quindi il cursore ruoterà più o meno volte in base al valore.

  • Multiplo di 4 o 0: l'esecuzione continua in orizzontale e termina.
  • Multiplo di 3: poiché è impossibile salire, il cursore ruota immediatamente in senso orario e continua in senso orizzontale, quindi termina.
  • Multiplo di 2 e non multiplo di 4: il cursore ruota e inizia a spostarsi verso sinistra. Fortunatamente, tutto ciò che fa è eseguire un mucchio di operazioni che non influiscono sul flusso del programma e finiscono per svuotare lo stack. Quando un'operazione non può essere eseguita perché lo stack è vuoto, viene semplicemente ignorato. Quando colpisce l'angolo in alto a sinistra, il cursore non ha altro posto dove andare se non di nuovo a destra, riavviando efficacemente il programma.
  • Altri valori: il cursore si abbassa come se fosse con 1, il che lo fa stampare 1 per sempre. Se l'ingresso è 5, l'uscita sarà5111111111111...

Qualsiasi valore non intero terminerà il programma. L'esecuzione continuerà normalmente, ma tutte le operazioni verranno ignorate poiché non c'è nulla nello stack. Quindi, in un certo senso, il programma non si arresta mai in modo anomalo: o si arresta normalmente o continua per sempre.


Versione amichevole di PietDev

PietDev (un ID Piet online di base) sembra avere problemi con i codici bianchi, quindi ho creato una nuova versione che ruota manualmente di nuovo invece di fare affidamento sulla rotazione automatica del codice bianco. E non avevo nemmeno bisogno di usare un nuovo colore! Se vuoi provare con esso, assicurati di disegnare un bordo nero attorno al codice perché PietDev non supporta dimensioni di programma personalizzate.

versione minuscola

versione ingrandita


Versioni precedenti

La prima versione non ha spinto indietro 1 nello stack e invece è tornato indietro a un'istruzione di duplicazione precedente. Aveva anche codici decorativi inutili.

Modello minuscolo che in realtà è un codice piet

Versione ingrandita

Poi ho avuto l'idea di spingere 1 in pila per rimuovere la riga vuota. È divertente come l'ho pensato grazie ai miei codici decorativi.

versione minuscola

versione grande

Poi mi sono reso conto di avere un duplex estraneo che non era più necessario e ho ridotto il numero di colori per risparmiare sui dati della tavolozza nell'immagine. Mi sono anche sbarazzato del singolo codice decorativo perché non lo so.


7
Non ho mai visto una risposta Piet segnata in qualcosa di diverso dai codici, ma penso che anche il conteggio dei byte ottimale sia interessante da includere :)
undergroundmonorail

1
Esistono 20 diversi valori di codice, il che significa che dovresti essere in grado di impacchettare tre codici in 13 bit, quindi otto triplette in 13 byte per una densità di archiviazione di 2,6 codici per byte. Ma qualcuno deve prima definire quella lingua. Suggerisco il nome DPPi = piet densamente impaccato.
John Dvorak,

1
@JanDvorak Ho contato 21 valori per aggiungerne uno speciale per l'interruzione di riga e, una volta ottenuta la prima interruzione di riga, il parser può indovinare dove dovrebbero trovarsi gli altri. Ma non sono arrivato al punto di combinare i codici in terzine, il che ha molto più senso che sprecare 5 bit per codice. Intelligente.
Domino,

1
Aggiungi le dimensioni come la prima coppia di byte. Non hai bisogno di un simbolo in più.
John Dvorak,

1
Chiunque voglia provarlo: non provare questa soluzione con PietDev perché PietDev stampa solo un singolo 1 e termina. Ma la soluzione funziona correttamente con npiet.
ML

19

Pyth, 4 3 2

Wp

C'è un no! spazio finale (grazie isaac :)). Lo spazio era richiesto per compilare il ciclo while, ma da allora Pyth è stato aggiornato. Normalmente questo sarebbe squalificato usandolo, ma poiché questo è un catalogo dovrebbe essere valido.

Spiegazione:

Wp        : implicit Q = eval(input)
W         : while
 p        : print and return the value of Q, to be evaluated as the while condition
          : Functions without enough arguments automatically use Q now
          : do nothing in the body of the while loop

5
Sono stato ispirato da questa risposta per aggiungere implicito passa Pyth. Lo spazio ora non è necessario. pyth.herokuapp.com/?code=WpQ&input=0&debug=0
isaacg

52
Quattro incrociate sembrano ancora quattro.
Conor O'Brien,

1
Eh, mi sto solo annoiando a vedere il pyth dominare tutto tutto il tempo :(. LOL.
Ashwin Gupta,

1
@AshwinGupta il mio linguaggio tecnicamente lo ha battuto, quindi non è completamente dominante :)
Cyoce

@Cyoce sì! Buon lavoro! Sono certo che qualcosa può battere Pyth Lol.
Ashwin Gupta,

16

Chip , 6 byte

e*faAs

Chip è un linguaggio 2D che si comporta un po 'come un circuito integrato. Prende l'input, un byte alla volta, e suddivide i bit in singoli elementi di input. L'output ricucisce i valori degli elementi di output in byte.

Analizziamo questo:

*è un segnale sorgente, invierà un valore vero a tutti gli elementi adiacenti. ee fcorrispondono al quinto e al sesto bit dell'output. Quindi, e*fproduce binario 00110000, che è il carattere ASCII "0".

Ora, Aè il primo bit di input ed aè il primo bit di output, quindi aAcopia quel bit da input a output. Quindi, se combinato con e*f, un input di ASCII "0" produce "0" e "1" produce "1". (Non vi è alcuna interazione tra fe a, poiché nessuno dei due produce alcun segnale.)

L' saccensione, quando attivata da un segnale vero, impedirà all'input di avanzare al byte successivo, il che significa che l'intera cosa funzionerà di nuovo con lo stesso input.

Poiché il primo byte di "0" è zero, non attiverà questo elemento e il programma stamperà "0", esaurendo così il suo input, che gli consente di terminare. "1", tuttavia, attiva questo elemento, il che significa che "1" viene emesso, ma non consumato sull'input, consentendo al ciclo di ripetersi indefinitamente.

Se per l'output vengono utilizzati i valori 0x0 e 0x1, anziché ASCII, possiamo eliminare la e*fparte, ottenendo solo 3 byte :

aAs

Se lo zero deve terminare se stesso, anziché aspettarsi la chiusura di stdin, otteniamo quanto segue, che inverte il primo byte con ~e passa il risultato a t, che termina il programma ( 10 byte ):

aA~te*f
 s

( tinoltre non produce alcun segnale, quindi non c'è interazione tra te e.)


2
Bella risposta! Poiché questa è una sfida del catalogo, non è necessario contrassegnarla come non competitiva, quindi ho rimosso quel pezzo per te. Benvenuti in PPCG!
Mego

4
Mi sono preso la libertà di aggiungere Chip a TIO. Provalo online!
Dennis,

@Dennis, domanda per te: come potrei ottenere TIO per aggiornare la sua fonte? La scorsa settimana ho corretto un bug nell'interprete Chip, ma non ha propagato la modifica in TIO. È qualcosa che devo chiedere a qualcuno di fare per me?
Phlarx

Ho tirato Chip. Se hai bisogno di qualcosa di aggiornato, lascia un messaggio in talk.tryitonline.net .
Dennis,


13

LOLCODE, 119 byte

GIMMEH n
n R SUM OF n AN 0
BOTH SAEM n AN 0, O RLY?
YA RLY
 VISIBLE 0
NO WAI
 IM IN UR l
  VISIBLE 1
 IM OUTTA UR l
OIC

Ungolfed:

HAI

BTW, Read n as a string from STDIN and convert to an integer
GIMMEH n
n R SUM OF n AN 0

BTW, Test n for equality with 0
BOTH SAEM n AN 0, O RLY?
YA RLY
    BTW, Write 0 to STDOUT and exit
    VISIBLE 0
NO WAI
    BTW, Loop forever, printing 1
    IM IN YR l
        VISIBLE 1
    IM OUTTA YR l
OIC

KTHXBYE

1. Quale interprete stai usando? 2. Sai MAEK n A NUMBRlanciare? 3. Puoi usare DIFFRINTinvece BOTH SAEMe cambiare i condizionali?
Lirtosiast

@ThomasKwa Stavo usando LOLCOFFEE, quello su repl.it. (Che al momento sembra essere inattivo, quindi testerò i tuoi suggerimenti una volta eseguito il backup.)
Alex A.

Non viene O RLY?lanciato in booleano?
Leaky Nun,

@LeakyNun No ...? O RLY?è come un postfisso if.
Alex A.

12

C, 37 byte

Una diversa opinione su come farlo in C.

main(c){for(gets(&c);putchar(c)&1;);}

cil valore predefinito è un intvalore 1. gets(&c)ottiene una stringa da stdin, qui bloccando il valore di c, in modo hackish poiché cnon è un char*. putchar(c)stampa il valore di ca stdout, e ritorna c. Dato che '0'è 48 ed '1'è 49 in ASCII, possiamo usare l'ultimo bit ( &1) per determinare quale sia. Se lo è '0', il ciclo si interrompe. Altrimenti, va per sempre.

Compila (con un avviso circa gets) e funziona gcc-4.8su Linux.


2
Presumibilmente questo funziona solo su architetture little-endian.
Neil,

@Neil, lo suppongo.
cbojar,

@Neil Endianness influenza solo l'ordine dei byte nei valori multibyte.
LegionMammal978,

1
Per cimpostazione predefinita, @ LegionMammal978 su an int, che è un valore multibyte, e su un'architettura big-endian, getsimposterà il byte errato.
Neil

11

Labirinto , 7 byte

 ?+
@!:

Labyrinth è un linguaggio basato su stack 2D in cui il flusso di controllo dipende dal segno dell'elemento superiore dello stack, controllato dopo ogni istruzione. L'esecuzione inizia a spostarsi a destra dalla prima istruzione valida nella riga superiore, che qui è la ?.

Le istruzioni pertinenti sono:

?      Input integer
+      Add top two elements (Labyrinth's stack has infinite 0s on the bottom)
:      Duplicate top element
!      Output as number
@      Terminate program

Se l'input è 0, l'IP legge l'input con ?, aggiunge i primi due dello stack ( 0 + 0 = 0), quindi duplica :e genera !uno 0. Qui incontriamo l'unica giunzione nel programma e dobbiamo verificare la parte superiore dello stack per determinare dove andare. Poiché la parte superiore è 0, andiamo avanti e terminiamo con @.

D'altra parte, se l'ingresso è 1, eseguiamo le stesse istruzioni di prima (ma emettendo un 1) prima di raggiungere la giunzione in corrispondenza di !. Ora la parte superiore della pila è positiva, facendoci girare a destra in ?. Su EOF Labyrinth spinge 0, quindi lo facciamo 0 + 1 = 1al +duplicato :e all'output !. Ancora una volta abbiamo un 1 in cima allo stack e il loop continua.

Per un bonus, ecco la soluzione a 7 byte di @ MartinBüttner, che funziona in modo simile:

?+!@
1!

Si noti che, a differenza della maggior parte delle lingue, in 1realtà si nstacca dallo stack e spinge n*10 + 1, rendendo facile la creazione di grandi numeri. Tuttavia, poiché la parte superiore della pila è vuota a quel punto, non è diverso dal solo spingere 1.


10

> <> , 7 byte

i2%:n:,

Questo utilizza il fatto che> <> spinge -1 su EOF, che è 1 mod 2. Utilizza anche divide per 0 per la terminazione (che apparentemente va bene poiché il consenso è che l'output STDERR viene ignorato).

Solo per riferimento, uscire in modo pulito senza errori è un byte aggiuntivo:

i2%:n?!;

10

APL, 6 byte

→⎕←⍣⍲⎕

Spiegazione:

     ⎕ Read the input, then
 ⎕←    write it out
   ⍣   repeatedly
    ⍲  until NAND of it with itself becomes true.
→      Branch to zero to avoid printing the result again.

1
Il secondo e l'ultimo personaggio dovrebbero apparire diversi? Perché non fanno per me.
John Dvorak,

@JanDvorak No, sono gli stessi.
Alex A.

1
OK, ora lo sto guardando sul cellulare e tutto tranne le due frecce mi sembra lo stesso MrGreen
John Dvorak

10

Brian e Chuck , 21 byte

,}<-{-?<SOH>_{+?
_>+{?<.p

Qui, <SOH>dovrebbe essere sostituito con il carattere di controllo corrispondente (0x01).

Spiegazione

L'idea di base è sottrarre il codice del carattere dell'input (48 o 49) dalla pfine di Chuck, che darà o ?(che è un comando valido) o @che non è operativo.

,legge il carattere di input nella prima cella di Chuck (contrassegnato con _). Vogliamo ridurre questo valore fino a 0in un ciclo, mentre apportiamo alcune altre modifiche:

}<si sposta su pe lo -diminuisce. Quindi {torna alla cella di input -diminuisce anche quella. Finché questo non è ancora zero, ?dà il controllo a Chuck. Ora >sposta la testina di Brian di una cella a destra (che è inizializzata a 1) e la +incrementa. Quindi ripristiniamo il loop con {?.

Quando la prima cella su Chuck colpisce 0, la <SOH>cella sarà stata incrementata al carattere che abbiamo letto da STDIN e psarà ?per l'input 1o @per l'input 0.

Ora ?non passa più il controllo. Il 0o 1dopo è un no-op, così come il null-byte (rappresentato da _). {torna alla prima cella di Chuck e +incrementa per assicurarsi che sia positivo, in modo tale che le ?mani controllino su Chuck.

Questa volta >+aumenta la cella dopo la fine del nastro iniziale di Brian. Quella cella è spazzatura ma non la useremo mai. Ora {non esegue la scansione fino alla parte anteriore del nastro di Brian, ma solo su _. Quindi ?è un no-op perché la cella corrente è zero. Quindi si <.sposta di uno a sinistra (la copia del carattere inserito) e lo stampa.

Infine, incontriamo il ?o @. Se l'input era 0e questa cella è @una no-op e il programma termina. Ma se l'input è stato 1e questa cella è, ?passiamo a Brian, il quale {+?ripristinerà il loop su Chuck, e ora stiamo stampando 1per sempre (fino a quando l'intero nella cella alla fine del nastro di Brian non si adatta alla memoria di più, suppongo ...).

indennità

Sp3000 e io abbiamo giocato a golf per diversi giorni. Abbiamo iniziato circa 40 byte e siamo arrivati ​​a due soluzioni completamente diverse, ma legate a 26 byte. Solo quando ho iniziato a scrivere la mia spiegazione, mi è venuta in mente la soluzione a 21 byte sopra. Mille grazie a Sp per aver lanciato idee e aver insegnato a vicenda alcuni trucchi per giocare a golf in B&C. :)

Questa è la sua soluzione a 26 byte:

>,----{?{>1?0
#I<?_}<.<<<?

E questo è mio:

,{>-<-?_0+?_1{<?
_®{?_{>.?

Dov'è ®un byte con valore 174 (ad es. Basta salvare il file come ISO 8859-1).

Al centro la miniera funziona in modo simile alla soluzione a 21 byte, in quanto ®diventa }per l'input 1e ~(no-op) per l'input 0, ma l'esecuzione è molto meno elegante.

La sua soluzione è abbastanza chiara in quanto il codice sorgente è solo ASCII e non richiede un ciclo per elaborare l'input. Invece, ----si trasforma 1in -e 0in ,(una no-op per Chuck). Ciò -cambierà quindi il primo ?sul nastro di Brian in a >, creando così un flusso di controllo diverso per il 1case.


10

Tag ciclico bit a bit, 3 bit o <1 byte

Bitwise Cyclic Tag è una delle lingue più semplici e complete di Turing. Funziona con due stringhe di bit, il programma e i dati . I bit del programma vengono letti ciclicamente e interpretati come segue:

  • 0: Elimina il primo bit di dati (e lo emette, nelle implementazioni che hanno l'output).
  • 1x: Se il primo bit di dati è 1, aggiungere x(che rappresenta uno 0o 1) alla fine dei dati. (Se il primo bit di dati è 0, non fare nulla.)

Il programma viene eseguito fino a quando la stringa di dati è vuota.

Verità-machine

110

Quando la stringa di dati è impostata su 0:

  • 11non aggiunge nulla perché il primo bit di dati non lo è 1.
  • 0cancella / uscite 0.
  • La stringa di dati è ora vuota e il programma si arresta.

Quando la stringa di dati è impostata su 1:

  • 11aggiunge a 1.
  • 0cancella / uscite 1.
  • La stringa di dati è tornata a un singolo 1e il programma è tornato al punto di partenza, quindi eseguiamo il loop per sempre.

9

GNU sed, 10

:;/1/{p;b}

Spiegazione

  • : definire un'etichetta senza nome
  • /1/Se l'input corrisponde alla regex 1, allora
  • p stampa lo spazio del motivo (es. 1)
  • b e torna all'etichetta senza nome (per sempre)
  • Se l'ingresso non era 1 (ovvero 0), lo spazio del motivo viene stampato non modificato e il programma termina.

Elimina 1 carattere usando :;p;/1/be il flag n , per un totale di 9 byte. Poiché sed -fviene comunque utilizzato per eseguire il file di script, l'aggiunta di quel flag aggiuntivo non richiede 2 byte.
seshoumara,

9

Scherzi a parte , 4 3 byte

Crossed-out 4 è ancora 4 :(

,W■

,legge un valore da STDIN. Wavvia un ciclo che viene eseguito mentre il valore in cima alla pila è veritiero, con il corpo . stampa l'elemento superiore della pila senza fare scoppiare. Il ciclo è implicitamente chiuso a EOF.

All'ingresso di 0, il ciclo non viene mai eseguito (poiché 0è falso) e il programma termina su EOF, saltando e stampando automaticamente tutti i valori nello stack. Sull'ingresso di 1(o qualsiasi valore che non è 0, ""o []), il ciclo viene eseguito all'infinito.

In In realtà , il comando ,non è necessario (grazie all'input implicito), portando il punteggio a 2 byte.


8

Quindi, 34 byte

1::=12
2::=~1
0::=~0
@::=:::
::=
@

Spiegazione:

1::=12 Le istanze della sottostringa "1" possono diventare "12"

2::=~1 Le istanze della sottostringa "2" possono essere rimosse, stampando "1"

0::=~0 Le istanze della sottostringa "0" possono essere rimosse, stampando "0"

@::=::: Le istanze della sottostringa "@" possono essere sostituite con stringhe dall'input

::= Elenco finale delle regole di sostituzione

@ La stringa iniziale è "@"


8

Arnold C, 134 byte

IT'S SHOWTIME
HEY CHRISTMAS TREE i
YOU SET US UP 0         //or 1
STICK AROUND i
TALK TO THE HAND 1
CHILL
TALK TO THE HAND 0
YOU HAVE BEEN TERMINATED

Mentre questo non è divertente come l'altra risposta ArnoldC , è golf. Ad esempio, il rientro non è necessario, così come le macro @NO PROBLEMOe @I LIED.

Testato con questa versione della lingua , che non può accettare input.


8

Cubix , 5 6 byte

Cubix è il nuovo linguaggio bidimensionale di @ETHproductions in cui i comandi sono avvolti attorno alle facce di un cubo. Interprete online Grazie a @ETHproductions per il risparmio.

!I\@O

Questo finisce per espandersi nel cubo

  !
I \ @ O
  .

Questo inizia con il Icomando. Inserisci un numero intero nello stack.
\, reindirizza il puntatore dell'istruzione verso il basso sopra il no op.
O, genera il valore numerico della parte superiore dello stack.
!, salta il comando successivo ( @) se la parte superiore dello stack è vera. Questo salterà il \reindirizzamento se 1
\, reindirizza il puntatore dell'istruzione al @programma di uscita.

Questo sfrutta il fatto che lo stack non viene visualizzato dai O ? !comandi.


Bello. Sono davvero felice di vedere qualcun altro che usa la mia lingua :) Ho un'altra soluzione a 6 byte che utilizza solo 5 istruzioni (più una no-op), quindi forse la posterò.
ETHproductions

@ETHproductions lo pubblicano sicuramente. Penso che tu abbia una lingua promettente qui :)
MickyT

È possibile salvare un byte rimuovendo ?e semplicemente usando !:!I\@O
ETHproductions

@ETHproductions very nice
MickyT

1
Ho scritto una bruta forcer per questo (attenzione: si blocca il browser per un minuto o due), che si presenta con esattamente cinque soluzioni 5-byte: @IOw!, @I?Ov, @!IOw, !IOW@,!I\@O
ETHproductions

7

Foo , 6 byte

&1($i)

L'input è codificato come secondo carattere, poiché Foo non ha input STDIN. Non siamo d'accordo sul fatto che Foo sia fantastico adesso? :)

Spiegazione

&1          Set current cell to 1
  (  )      Do-while loop (or, at least according to the interpreter)
   $i       Print current cell as int

2
Mi è sempre piaciuto Foo.
uno spaghetto il

7

Perl, 18 + 1 = 19 13 + 1 = 14 byte

print while$_

Esegui in questo modo:

echo -n NUM | perl -p truth.pl

Grazie a ThisSuitIsBlackNot (che è molto meglio del golf Perl di me) per il golf di cinque byte.


2
I modificatori delle dichiarazioni sono tuoi amici! Inoltre, se si assicura che l'input non abbia una nuova riga finale, è possibile eliminare +0: echo -n 0 | perl -pe'print while$_'(13 byte + 1 per -p). perl -M5.010 -pe'say while$_'sarebbe ancora più breve, ma ciò si
tradurrebbe

@ThisSuitIsBlackNot Ah-ha! Ho provato a stampare mentre $ _ ma non sono riuscito a capire perché non ha funzionato. Non mi ero reso conto che non potevi avere la nuova riga finale sull'input.
uno spaghetto il

Sì, la stringa 0è falsa ma 0+ newline è vera. Vedere perldoc perlsyn.
ThisSuitIsBlackNon

2
sayè più breve, anche se si considera -Eun byte aggiuntivo.
Dennis,

2
@Dennis ... che ho appena realizzato può essere risolto con -l: perl -lpE 'say while$_'(11 byte + 2 per -lp).
ThisSuitIsBlackNon

7

> <> , 6 byte

::n?!;

Spinge l'input nello stack per iniziare

:        copy top element on stack
 :       copy top element on stack again
  n      pop and outputs top element
   ?     condition trampoline - pops top element, if it is zero skips next instruction
    !    trampoline skips next instruction
     ;   finish execution

1
Noi di PPCG adoriamo le nostre spiegazioni. +1
uno spaghetto il

3
Sono abbastanza sicuro che questo funziona solo con input letterali 0 e 1, quando dovrebbe funzionare con 48 ( '0') e 49 ( '1'). Mi sbaglio?
undergroundmonorail,

@quartata Se fossi in me direi che, per essere onesti con le risposte che usano metodi più tradizionali per ottenere input, dovresti mettere 48 o 49 in pila. È comunque la tua sfida e comunque non è un grosso problema quindi ¯ \ _ (ツ) _ / ¯
undergroundmonorail

2
C'è un altro problema con questo: se lo stack è precompilato, devi aggiungere 3 byte per il -vflag.
El'endia Starman,

1
@Aaron: Per quello che vale, anch'io ho pensato che fosse 2 byte per -v, quindi sono stato corretto. Quindi non sei l'unico. :)
El'endia Starman il
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.