brainfuck , 474 176 154 151 149 137 byte
Accetta una stringa di input di otto 0
e 1
incluso il primo0
per il punto decimale.
(come nella seconda colonna della tabella nel post)
Emette cifre da 0 a 9.
,>,>,>,,,>,>,>+[[->]<++<<<<<<]>[>[>[>[->[>++++++<-<]>[--<]<]>>.>>]<[>
>[>->++<<-]>-[+>++++<]>+.>]]>[>>>+<<<-]>[>>+++.>]]>[>>>[>+++<-]>-.>]
Provalo online!
Algoritmo
Osservando lo stato di un particolare segmento possiamo dividere un insieme di possibili cifre in sottoinsiemi più piccoli. Di seguito è riportato l'albero di ricerca binario statico utilizzato nel mio codice. La sottostruttura sinistra corrisponde allo stato del segmento ON, la destra corrisponde allo stato del segmento OFF.
0,1,2,3,4,5,6,7,8,9
|
/-------[A]-------------------------\
0,2,3,5,6,7,8,9 1,4
| |
/-------------[B]----------------\ /----[G]----\
0,2,3,7,8,9 5,6 4 1
| |
/--------[E]--------\ /----[E]----\
0,2,8 3,7,9 6 5
| |
/----[F]----\ /----[F]----\
0,8 2 9 3,7
| |
/----[G]----\ /----[G]----\
8 0 3 7
Alcune osservazioni utili per il golf
- I bit C e D sono ridondanti e possono essere ignorati.
- Lo zero iniziale (bit per il punto decimale) può essere (ab) utilizzato come valore 48, importante sia per l'analisi dell'input che per la preparazione dell'output.
- Quando viene raggiunta la foglia e viene stampata la cifra, dobbiamo solo saltare tutte le ulteriori condizioni. Può essere fatto spostando il puntatore dei dati abbastanza lontano nell'area degli zeri in modo che non possa tornare indietro.
- Per la compatibilità è meglio usare zeri a destra, perché alcune implementazioni di BF non supportano puntatori di dati negativi.
- Quindi è meglio memorizzare il valore di output nella cella più a destra, in modo da poter raggiungere facilmente l'area degli zeri a destra.
- Quindi è meglio controllare i bit da sinistra a destra: A, B, E, F, G in modo da poter raggiungere più facilmente la cella di output.
- Cifre diverse possono condividere il codice di output. Ad esempio, 5 e 6 sono nella stessa sottostruttura. Possiamo fare
+++++
per entrambi i valori e quindi +
solo per sei.
- È possibile ridurre il numero di
+
comandi se si aggiunge in anticipo 2 al valore di output. In tal caso, è necessario diminuirlo per 0
e 1
solo e ottenere vantaggio per altre cifre.