Desafio
Reconheça números artísticos ASCII. Para tornar as coisas interessantes, três pontos aleatórios na imagem podem ser invertidos. Por exemplo:
*****
* **
**
**
**
**
Entrada
Um número de arte ASCII 7x7 gerado pelo script Python abaixo.
Resultado
Um dígito.
Script de teste
Aqui está um script Python (2.6+) para gerar os casos de teste:
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
Liquidificador
fonte
fonte
Respostas:
APL (
8785)Explicação:
Cada número ASCII possível é codificado em 48 bits. (O 49º bit é sempre zero de qualquer maneira). A cadeia
嵝䍝뫂傁ဣ␋䠁䊫낫䢝䊅넂垵僡ᑨ嘙쐅嘹䜝䪀슪퀪岹亝尵䌧뮢
possui três caracteres por número ASCII, cada um dos quais codifica 16 bits.↓10 3⍴
: divida a sequência de dados em 10 grupos de 3 caracteres, cada um dos quais codifica um número.{
...}¨
: para cada um dos grupos:(16/2)⊤⎕UCS⍵
: obtenha os primeiros 16 bits de cada um dos três caracteres,
: concatenar as matrizes de bits em uma matriz49↑
: pegue os primeiros 49 elementos. Existem apenas 48, portanto isso equivale a adicionar um0
no final.,↑{7↑'*'=⍞}¨⍳7
: leia 7 linhas de 7 caracteres no teclado, faça uma matriz de bits para cada linha em que1
significa que o caractere era a*
e junte-as.(+.=)¨
: para cada dígito possível, calcule quantos bits a entrada tinha em comum com o dígito.⍒
: obtenha os índices para uma classificação descendente dessa lista, para que o primeiro item no resultado seja o índice do maior número da lista anterior.⊃
: pegue o primeiro item, que é o índice do dígito1-⍨
: subtraia um, porque os índices APL são baseados em 1.fonte
⎕IO←0
, tácito, o canto superior esquerdo é sempre 0; 80:⊃⍒(,↑{7↑'*'=⍞}¨⍳7)∘(+.=)¨(49⍴(16/2)⊤⎕UCS)¨↓10 3⍴'嵝䍝뫂傁ဣ␋䠁䊫낫䢝䊅넂垵僡ᑨ嘙쐅嘹䜝䪀슪퀪岹亝尵䌧뮢'
Pitão
Tenho certeza de que haverá soluções de OCR, mas a probabilidade de minha precisão ser muito maior.
Insira uma linha de texto por vez.
Não tenho certeza de uma maneira melhor de lidar com os asteriscos sem aumentar a contagem de caracteres.
fonte
JavaScript (ES6), 89
Uso:
Versão sem golfe:
fonte
Bash + ImageMagick + tesseract, 316 caracteres
Aqui está uma facada em uma solução de OCR. Porém, não é muito preciso, mesmo ao dizer ao tesseract que temos apenas um caractere e é um dígito. Golfe moderado, mas ainda um pouco legível:
O script recebe a entrada de stdin, para que possamos canalizar a partir do script de teste.
Observe que eu coloquei
tee >( cat 1>&2 )
no pipeline apenas para que possamos ver o que o script de teste realmente gerou.Exemplo de saída (esta foi uma execução muito boa, com apenas 1 caracter incorreto de 6):
fonte
LÖVE2D, 560 bytes
Primeiro, desenha uma representação em bloco do texto de entrada; em seguida, para cada número de 0 a 9, sobrepõe um número, verifica quantos pixels semelhantes existem e imprime o número que mais se aproxima. OCR muito básico. Ele corresponde a todos os casos de teste e funciona razoavelmente bem com mutações.
Ligue para:
fonte