2011-09-07 14 views
6

Come programma debugger/test per il mio Brainf implementazione * ck, ho creato il seguente ciclo di conteggio:Infinite Conteggio Loop in Brainfuck

+[[>+]+] 

Con singolo byte, le cellule confezionamento e con 30K cellule con avvolgente, questo crea un ciclo di conteggio infinito. Imposta ogni cella su 1, quindi ogni cella su 2, ecc.

Il mio problema è che quando arriva a 255, il ciclo interno incrementa la cella a 0, e quindi il ciclo esterno lo incrementa a 1 immediatamente. Questo agisce come un "doppio passo" quando trabocca, invece di un singolo passo. Questo è l'unico modo per far sì che il ciclo continui all'infinito con questo programma serrato.

Il conteggio per ogni cella va 0 -> 1 -> 2 ... 254 -> 255 -> 1 ...

Mentre io vorrei per andare 0 -> 1 -> 2 ... 254 -> 255 -> 0 -> 1 ...

E 'proprio difficile continuare un ciclo quando la cella corrente è pari a zero. Ho suonato con variazioni sullo stesso tema, ma nessuno di loro ha capito bene.

Questo particolare programma è solo un banale programma di conteggio per i test, ma ciò che mi aiuterà veramente con i programmi futuri è sapere come invertire il ciclo condizionale come ho bisogno di fare funzionare questo ciclo di conteggio.

risposta

4

Prova:

+[[>+]>[+>]+]

Dopo il primo ciclo interno sappiamo i dati sono 0 seguito da un gruppo di 255 di. Passa alla cella successiva e incrementali tutti fino a quando non torniamo all'inizio. Quindi incrementa la prima cella e ricomincia da capo.

+1

Purtroppo aggiunge circa il 62% alla lunghezza del programma, ed è molto meno elegante, ma funziona. Non sono convinto che non ci sia un modo più breve, ma questo è probabilmente il più ovvio. – captncraig

1

Un'altra possibilità ho considerato la scorsa notte, anche se è un po 'diverso rispetto le vostre esigenze:

-[[-]>-] 

E' la stessa dimensione dell'originale, ma il conto alla rovescia. Ciclo di ogni cella da 255 a zero, ma modifica solo una cella alla volta. Ho pensato di aggiungerlo perché è un ciclo breve interessante che puoi usare per testare.

Ovviamente è possibile eseguire il conteggio di uno qualsiasi di questi loop esclusivamente usando + o solo -.