brainfuck , 474 176 154 151 151 149 137 octets
Prend une chaîne d'entrée de huit 0
et 1
incluant la première 0
pour le point décimal.
(comme dans la deuxième colonne du tableau dans le post)
Sorties chiffre de 0 à 9.
,>,>,>,,,>,>,>+[[->]<++<<<<<<]>[>[>[>[->[>++++++<-<]>[--<]<]>>.>>]<[>
>[>->++<<-]>-[+>++++<]>+.>]]>[>>>+<<<-]>[>>+++.>]]>[>>>[>+++<-]>-.>]
Essayez-le en ligne!
Algorithme
En observant l'état d'un segment particulier, nous pouvons diviser un ensemble de chiffres possibles en sous-ensembles plus petits. Voici l'arborescence de recherche binaire statique utilisée dans mon code. La sous-arborescence gauche correspond à l'état ON du segment, la droite correspond à l'état OFF du segment.
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
Quelques observations utiles pour le golf
- Les bits C et D sont redondants et peuvent être ignorés.
- Le zéro initial (bit pour le point décimal) peut être (ab) utilisé comme valeur 48, important à la fois pour l'analyse de l'entrée et la préparation de la sortie.
- Lorsque la feuille est atteinte et que le chiffre est imprimé, nous devons simplement ignorer toutes les autres conditions. Cela peut être fait en déplaçant le pointeur de données suffisamment loin vers la zone des zéros pour qu'il ne puisse pas revenir.
- Pour la compatibilité, il est préférable d'utiliser des zéros à droite, car certaines implémentations BF ne prennent pas en charge les pointeurs de données négatifs.
- Par conséquent, il est préférable de stocker la valeur de sortie dans la cellule la plus à droite, afin que nous puissions facilement atteindre la zone de zéros vers la droite.
- Par conséquent, il est préférable de vérifier les bits de gauche à droite: A, B, E, F, G afin que nous puissions atteindre plus facilement la cellule de sortie.
- Différents chiffres peuvent partager le code de sortie. Par exemple, 5 et 6 sont dans le même sous-arbre. Nous pouvons faire
+++++
pour les deux valeurs, puis +
pour six seulement.
- Nous pouvons diminuer le nombre de
+
commandes si nous ajoutons 2 à la valeur de sortie à l'avance. Dans ce cas, nous devons le diminuer pour 0
et 1
seulement et obtenir un avantage pour les autres chiffres.