Défi
Reconnaître les numéros d'art ASCII. Pour rendre les choses intéressantes, trois points aléatoires de l'image peuvent être inversés. Par exemple:
*****
* **
**
**
**
**
Contribution
Un numéro d'art ASCII 7x7 généré par le script Python ci-dessous.
Production
Un chiffre.
Script de test
Voici un script Python (2.6+) pour générer les cas de test:
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))
Réponses:
APL (
8785)Explication:
Chaque numéro ASCII possible est codé en 48 bits. (Le 49e bit est toujours zéro de toute façon). La chaîne
嵝䍝뫂傁ဣ␋䠁䊫낫䢝䊅넂垵僡ᑨ嘙쐅嘹䜝䪀슪퀪岹亝尵䌧뮢
a trois caractères par numéro ASCII, chacun codant 16 bits.↓10 3⍴
: divise la chaîne de données en 10 groupes de 3 caractères, chacun codant un nombre.{
...}¨
: pour chacun des groupes:(16/2)⊤⎕UCS⍵
: obtenez les 16 premiers bits de chacun des trois caractères,
: concaténer les tableaux de bits dans un tableau49↑
: prenez les 49 premiers éléments. Il n'y en a que 48, ce qui revient à ajouter un0
à la fin.,↑{7↑'*'=⍞}¨⍳7
: lisez 7 lignes de 7 caractères sur le clavier, faites un tableau de bits pour chaque ligne où1
signifie que le caractère était un*
, et joignez-les ensemble.(+.=)¨
: pour chaque chiffre possible, calculez combien de bits l'entrée avait en commun avec le chiffre.⍒
: récupère les indices pour un tri vers le bas de cette liste, de sorte que le premier élément du résultat soit l'index du plus grand nombre de la liste précédente.⊃
: prendre le premier élément, qui est l'index du chiffre1-⍨
: soustrayez un, car les indices APL sont basés sur 1.la source
⎕IO←0
, tacite, en haut à gauche est toujours 0; 80:⊃⍒(,↑{7↑'*'=⍞}¨⍳7)∘(+.=)¨(49⍴(16/2)⊤⎕UCS)¨↓10 3⍴'嵝䍝뫂傁ဣ␋䠁䊫낫䢝䊅넂垵僡ᑨ嘙쐅嘹䜝䪀슪퀪岹亝尵䌧뮢'
Python
Je suis sûr qu'il y aura des solutions OCR, mais la probabilité que la mienne soit précise est beaucoup plus élevée.
Saisissez une ligne de texte à la fois.
Pas sûr d'une meilleure façon de gérer les astérisques sans augmenter le nombre de caractères.
la source
JavaScript (ES6), 89
Usage:
Version sans golf:
la source
Bash + ImageMagick + tesseract, 316 caractères
Voici un aperçu d'une solution d'OCR. Ce n'est pas très précis cependant, même en disant à tesseract que nous n'avons qu'un seul caractère et que c'est un chiffre. Modérément golfé, mais encore un peu lisible:
Le script prend l'entrée de stdin, nous pouvons donc diriger à partir du script de test.
Remarque J'ai mis
tee >( cat 1>&2 )
dans le pipeline juste pour que nous puissions voir ce que le script de test a réellement généré.Exemple de sortie (c'était une assez bonne course avec seulement 1 caractère incorrect sur 6):
la source
LÖVE2D, 560 octets
Tout d'abord, dessine une représentation en blocs du texte d'entrée, puis, pour chaque nombre 0 - 9, superpose un nombre, vérifie le nombre de pixels similaires et imprime le nombre le plus proche. OCR très basique. Il correspond à tous les cas de test et fonctionne relativement bien avec les mutations.
Appeler avec:
la source