Desafío
Reconocer los números de arte ASCII. Para hacer las cosas interesantes, se pueden voltear tres puntos aleatorios en la imagen. Por ejemplo:
*****
* **
**
**
**
**
Entrada
Un número de arte ASCII 7x7 generado por el siguiente script de Python.
Salida
Un digito.
Script de prueba
Aquí hay un script de Python (2.6+) para generar los casos de prueba:
import random
digits = '''\
***
** **
** **
** **
** **
** **
***
*
***
*
*
*
*
*****
***
* **
*
**
**
**
******
***
* **
*
***
*
* **
***
**
***
* **
* **
******
**
**
*****
**
****
*
*
* *
***
****
**
*****
* *
** **
** *
****
*****
**
**
**
**
**
**
****
** **
** **
****
** **
** **
****
***
** **
** **
** *
****
**
**** '''.split('\n\n')
def speckle(image, num_speckles):
grid = [list(row) for row in image.split('\n')]
for i in range(num_speckles):
row = random.choice(grid)
row[random.randint(0, 6)] = random.choice([' ', '*'])
return '\n'.join([''.join(row) for row in grid])
digit = random.choice(digits)
print(speckle(digit, 3))
code-golf
ascii-art
image-processing
Licuadora
fuente
fuente

Respuestas:
APL (
8785)Explicación:
Cada posible número ASCII está codificado en 48 bits. (El bit 49 siempre es cero de todos modos). La cadena
嵝䍝뫂傁ဣ␋䠁䊫낫䢝䊅넂垵僡ᑨ嘙쐅嘹䜝䪀슪퀪岹亝尵䌧뮢tiene tres caracteres por número ASCII, cada uno de los cuales codifica 16 bits.↓10 3⍴: divide la cadena de datos en 10 grupos de 3 caracteres, cada uno de los cuales codifica un número.{...}¨: para cada uno de los grupos:(16/2)⊤⎕UCS⍵: obtenga los primeros 16 bits de cada uno de los tres caracteres,: concatenar las matrices de bits en una matriz49↑: toma los primeros 49 elementos. Solo hay 48, por lo que esto es equivalente a agregar un0al final.,↑{7↑'*'=⍞}¨⍳7: lea 7 líneas de 7 caracteres del teclado, haga una matriz de bits para cada línea donde1significa que el carácter era un*, y únalas.(+.=)¨: para cada dígito posible, calcule cuántos bits tenía la entrada en común con el dígito.⍒: obtenga los índices para un tipo descendente de esa lista, de modo que el primer elemento del resultado sea el índice del número más grande de la lista anterior.⊃: toma el primer elemento, que es el índice del dígito1-⍨: resta uno, porque los índices APL están basados en 1.fuente
⎕IO←0, tácito, arriba a la izquierda siempre es 0; 80:⊃⍒(,↑{7↑'*'=⍞}¨⍳7)∘(+.=)¨(49⍴(16/2)⊤⎕UCS)¨↓10 3⍴'嵝䍝뫂傁ဣ␋䠁䊫낫䢝䊅넂垵僡ᑨ嘙쐅嘹䜝䪀슪퀪岹亝尵䌧뮢'Pitón
Estoy seguro de que habrá soluciones de OCR, pero la probabilidad de que la mía sea precisa es mucho mayor.
Ingrese una línea de texto a la vez.
No estoy seguro de una mejor manera de lidiar con los asteriscos sin aumentar el recuento de caracteres.
fuente
JavaScript (ES6), 89
Uso:
Versión sin golf:
fuente
Bash + ImageMagick + tesseract, 316 caracteres
Aquí hay una puñalada en una solución de OCR. Sin embargo, no es muy preciso, incluso cuando se le dice a tesseract que solo tenemos un carácter y es un dígito. Moderadamente golfizado, pero aún algo legible:
El script toma información de stdin, por lo que podemos canalizar desde el script de prueba.
Tenga en cuenta que he puesto
tee >( cat 1>&2 )en marcha solo para que podamos ver lo que realmente generó el script de prueba.Ejemplo de salida (Esta fue una ejecución bastante buena con solo 1 carácter incorrecto de 6):
$ python ./asciitest.py | tee> (cat 1> y 2) | ./scanascii.sh *** ** ** * ** ** * **** *** **** Tesseract Open Source OCR Engine v3.02 con Leptonica 9 9 $ python ./asciitest.py | tee> (cat 1> y 2) | ./scanascii.sh * * *** * * * * * * * * * ***** Tesseract Open Source OCR Engine v3.02 con Leptonica 1 $ python ./asciitest.py | tee> (cat 1> y 2) | ./scanascii.sh *** ** ** ** ** ** ** ** ** * ** *** Tesseract Open Source OCR Engine v3.02 con Leptonica 0 0 $ python ./asciitest.py | tee> (cat 1> y 2) | ./scanascii.sh ***** ** ** **** * * * * ** * *** Tesseract Open Source OCR Engine v3.02 con Leptonica 5 5 $ python ./asciitest.py | tee> (cat 1> y 2) | ./scanascii.sh **** ** ** ***** * * *** *** ** ** **** Tesseract Open Source OCR Engine v3.02 con Leptonica 5 5 $ python ./asciitest.py | tee> (cat 1> y 2) | ./scanascii.sh *** * ** * * ** ** *** ** ** ****** Tesseract Open Source OCR Engine v3.02 con Leptonica 2 PSfuente
LÖVE2D, 560 bytes
Primero, dibuja una representación en bloque del texto de entrada, luego, para cada número 0 - 9, superpone un número, comprueba cuántos píxeles similares hay e imprime el número que se acercó más. OCR muy básico. Coincide con todos los casos de prueba y funciona razonablemente bien con mutaciones.
Llamar con:
fuente