Herausforderung
Erkennen Sie ASCII-Kunstnummern. Um die Sache interessant zu machen, können drei zufällige Punkte im Bild umgedreht werden. Beispielsweise:
*****
* **
**
**
**
**
Eingang
Eine 7x7-ASCII-Kunstnummer, die mit dem folgenden Python-Skript generiert wurde.
Ausgabe
Eine Ziffer.
Skript testen
Hier ist ein Python-Skript (2.6+) zum Generieren der Testfälle:
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))
Antworten:
APL (
8785)Erläuterung:
Jede mögliche ASCII-Nummer ist in 48 Bit codiert. (Das 49. Bit ist sowieso immer Null). Die Saite
嵝䍝뫂傁ဣ␋䠁䊫낫䢝䊅넂垵僡ᑨ嘙쐅嘹䜝䪀슪퀪岹亝尵䌧뮢
besteht aus drei Zeichen pro ASCII-Nummer, von denen jedes 16 Bits codiert.↓10 3⍴
: Teilen Sie den Datenstring in 10 3-Zeichen-Gruppen auf, von denen jede eine Zahl codiert.{
...}¨
: für jede der Gruppen:(16/2)⊤⎕UCS⍵
: Holen Sie sich die ersten 16 Bits von jedem der drei Zeichen,
: Verketten Sie die Bit-Arrays zu einem Array49↑
: nimm die ersten 49 Elemente. Es gibt nur 48, dies entspricht also dem Hinzufügen eines0
am Ende.,↑{7↑'*'=⍞}¨⍳7
: 7 Zeilen mit 7 Zeichen von der Tastatur lesen, für jede Zeile ein Bit-Array erstellen, wobei1
das Zeichen a bedeutet*
, und füge sie zusammen.(+.=)¨
: Berechnen Sie für jede mögliche Ziffer, wie viele Bits die Eingabe mit der Ziffer gemeinsam hatte.⍒
: Ruft die Indizes für eine abwärts gerichtete Sortierung dieser Liste ab, sodass das erste Element im Ergebnis der Index der größten Zahl in der vorherigen Liste ist.⊃
: nimm den ersten Punkt, der der Index der Ziffer ist1-⍨
: subtrahiere eins, da APL-Indizes 1-basiert sind.quelle
⎕IO←0
, stillschweigend, oben links ist immer 0; 80:⊃⍒(,↑{7↑'*'=⍞}¨⍳7)∘(+.=)¨(49⍴(16/2)⊤⎕UCS)¨↓10 3⍴'嵝䍝뫂傁ဣ␋䠁䊫낫䢝䊅넂垵僡ᑨ嘙쐅嘹䜝䪀슪퀪岹亝尵䌧뮢'
Python
Ich bin mir sicher, dass es OCR-Lösungen geben wird, aber die Wahrscheinlichkeit meiner Genauigkeit ist viel höher.
Geben Sie jeweils eine Textzeile ein.
Ich bin mir nicht sicher, wie ich besser mit den Sternchen umgehen kann, ohne die Anzahl der Zeichen zu erhöhen.
quelle
JavaScript (ES6), 89
Verwendung:
Ungolf-Version:
quelle
Bash + ImageMagick + Tesseract, 316 Zeichen
Hier ist ein Vorgeschmack auf eine OCR-Lösung. Es ist allerdings nicht sehr genau, selbst wenn man Tesseract sagt, dass wir nur ein Zeichen haben und es eine Ziffer ist. Mäßig golfen, aber immer noch etwas lesbar:
Das Skript nimmt Eingaben von stdin entgegen, sodass wir das Testskript weiterleiten können.
Hinweis Ich habe
tee >( cat 1>&2 )
die Pipeline so eingestellt, dass wir sehen können, was das Testskript tatsächlich generiert hat.Beispielausgabe (Dies war ein ziemlich guter Lauf mit nur 1 falschen Zeichen von 6):
quelle
LÖVE2D, 560 Bytes
Zeichnet zunächst eine blockartige Darstellung des eingegebenen Texts, überlagert dann für jede Zahl 0 - 9 eine Zahl, überprüft, wie viele ähnliche Pixel vorhanden sind, und druckt die Zahl aus, die am nächsten gekommen ist. Sehr einfache Texterkennung. Es passt zu allen Testfällen und schneidet bei Mutationen recht gut ab.
Rufen Sie an mit:
quelle