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 un0
al final.,↑{7↑'*'=⍞}¨⍳7
: lea 7 líneas de 7 caracteres del teclado, haga una matriz de bits para cada línea donde1
significa 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):
fuente
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