brainfuck , 474 176 154 151 149 137 bytes
Toma una cadena de entrada de ocho 0
e 1
incluye la primera 0
para el punto decimal.
(como en la segunda columna de la tabla en la publicación)
Salida de dígitos de 0 a 9.
,>,>,>,,,>,>,>+[[->]<++<<<<<<]>[>[>[>[->[>++++++<-<]>[--<]<]>>.>>]<[>
>[>->++<<-]>-[+>++++<]>+.>]]>[>>>+<<<-]>[>>+++.>]]>[>>>[>+++<-]>-.>]
Pruébalo en línea!
Algoritmo
Al observar el estado de un segmento particular, podemos dividir un conjunto de posibles dígitos en subconjuntos más pequeños. A continuación se muestra el árbol de búsqueda binario estático utilizado en mi código. El subárbol izquierdo corresponde al estado del segmento ON, el derecho corresponde al estado 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
Algunas observaciones útiles para el golf.
- Los bits C y D son redundantes y pueden ignorarse.
- El cero inicial (bit para el punto decimal) puede (ab) usarse como valor 48, importante tanto para analizar la entrada como para preparar la salida.
- Cuando se alcanza la hoja y se imprime el dígito, solo necesitamos omitir todas las demás condiciones. Se puede hacer moviendo el puntero de datos lo suficientemente lejos del área de ceros para que no pueda volver.
- Para la compatibilidad, es mejor usar ceros a la derecha, porque algunas implementaciones de BF no admiten punteros de datos negativos.
- Por lo tanto, es mejor almacenar el valor de salida en la celda más a la derecha, para que podamos alcanzar fácilmente el área de ceros a la derecha.
- Por lo tanto, es mejor verificar los bits de izquierda a derecha: A, B, E, F, G para que podamos alcanzar la celda de salida más fácilmente.
- Diferentes dígitos pueden compartir el código de salida. Por ejemplo, 5 y 6 están en el mismo subárbol. Podemos hacer
+++++
ambos valores y luego +
solo seis.
- Podemos disminuir el número de
+
comandos si agregamos 2 al valor de salida por adelantado. En ese caso hay que disminuirlo para 0
y 1
única y obtener ventaja para los otros dígitos.