Zählen Sie die Nummer einer Nummer im Bildbereich

8

Ihr Ziel ist es, ein vollständiges Programm oder eine vollständige Funktion zu schreiben, die 5 positive Ganzzahlen und eine Zeichenfolge mit einem Bilddateinamen als Eingabe [X1,Y1], [X2,Y2], N, image.jpgin einem beliebigen vernünftigen Format verwendet, wobei:

  • Erste Paar [X1,Y1]sind die oben links X, YKoordinaten ( <=20) des blauen rechteckigen Bereich in dem Beispielbild ( 16,11).
  • Zweite Paar [X2,Y2]sind die unten rechts X, YKoordinaten ( <=20) des blauen rechteckigen Bereich in dem Beispielbild ( 20,22).
  • Fünfte Zahl Nso 0 <= N <= 9ist die Zahl , die gefunden werden muss.
  • Der sechste Parameter ist eine Zeichenfolge mit dem Dateinamen dieses JPG-Bildes .

Geben Sie aus, wie viele von Nihnen im angegebenen Bereich vorhanden sind (im Bild für dieses Beispiel blau umrandet):

Geben Sie hier die Bildbeschreibung ein

Klicken Sie hier , um eine größere, saubere Version desselben Bildes zu erhalten.

Auf dem Bild sind 500 Zahlen von 0bis 9(enthalten) in 20 Spalten pro 25 Zeilen in monospaced Courier NewSchriftart angeordnet. Jede andere Zahl hat eine andere Farbe (Sie können diese Tatsache ausnutzen oder ignorieren und das Bild in Monokrom betrachten oder konvertieren, wenn dies Ihnen hilft).

Testfälle:

[4,4],[13,5],1,image.jpg    > 4  (outlined in red)
[4,4],[13,5],4,image.jpg    > 2  (outlined in red)
[17,5],[17,5],2,image.jpg   > 1  (outlined in magenta)
[17,5],[17,5],9,image.jpg   > 0  (outlined in magenta)
[20,8],[20,9],3,image.jpg   > 1  (outlined in cyan)
[20,8],[20,9],2,image.jpg   > 0  (outlined in cyan)
[16,11],[20,22],0,image.jpg > 8  (outlined in blue)
[16,11],[20,22],3,image.jpg > 9  (outlined in blue)
[3,14],[11,20],7,image.jpg  > 6  (outlined in green)
[3,14],[11,20],5,image.jpg  > 6  (outlined in green)
[3,14],[11,20],8,image.jpg  > 8  (outlined in green)
[1,1],[20,25],0,image.jpg   > 47 (whole picture)
[1,1],[20,25],8,image.jpg   > 50 (whole picture)
[1,1],[20,25],1,image.jpg   > 55 (whole picture)

Regeln:

  • Dies ist also gewinnt der kürzeste Code.
  • Sie müssen diese JPG-Datei als Eingabe verwenden .
  • Sie dürfen die im JPG dargestellte Zahlenmatrix oder die Ergebnisse nicht fest codieren.
  • Standardlücken sind verboten.
Mario
quelle

Antworten:

4

Mathematica, 92 Bytes

Count[Take[Characters@StringSplit@TextRecognize@Binarize[Import@#4,.9],#2,#],ToString@#3,2]&

Unbenannte Funktion mit den Argumenten in diesem Format : [{X1,X2}, {Y1,Y2}, N, "image.jpg"]. (In der Tat kann das vierte Argument entweder der lokale Dateiname oder die URL sein http://i67.tinypic.com/6qh5lj.jpg.)

Import@#4Importiert die Bilddatei, Binarize[...,.9]verdunkelt alle Zahlen auf Schwarz und TextRecognizeextrahiert (die Funktion, die hier eindeutig das schwere Heben übernimmt!) eine mehrzeilige Zeichenfolge aus dem resultierenden Bild, die in eine verschachtelte Liste von Zeichen mit aufgeteilt wird Characters@.

Take[...,#2,#]behält nur die Zeichen bei, die dem umrissenen Rechteck entsprechen, und Count[...,ToString@#3,2]zählt die Anzahl der Vorkommen Nim Ergebnis.

Greg Martin
quelle
2

Python 3 + Kissen + Pytesseract, 239 Bytes

from PIL.Image import*
from pytesseract import*
def c(a,b,n,f):w,h=b[0]-a[0]+1,b[1]-a[1]+1;return len([1for i in range(h*w)if image_to_string(open(f).convert('L').point(lambda x:[9,0][x<250],'1')).split()[i//w+a[1]-1][i%w+a[0]-1]==str(n)])

Dies ist schrecklich ineffizient, da für jede Zahlenkachel die gesamte Datei analysiert wird. Die viel schnellere und etwas längere 243-Byte- Lösung wäre

from PIL.Image import*
from pytesseract import*
def c(a,b,n,f):s=image_to_string(open(f).convert('L').point(lambda x:[9,0][x<250],'1')).split();w,h=b[0]-a[0]+1,b[1]-a[1]+1;return len([1for i in range(h*w)if s[i//w+a[1]-1][i%w+a[0]-1]==str(n)])
TidB
quelle