Finde den anderen Buchstaben

10

Möglicherweise haben Sie folgende Rätsel gesehen:

Finden Sie die 0:
OOOOOOOOOOOOOOOOOOOO0OOOOOOOOOOOOOOOOOO

Die Herausforderung besteht darin, ein Programm zu schreiben, das den Index der verschiedenen Buchstaben eines Bildes findet.

Eingang

Eingabe wird ein sein Image. Das Bild besteht aus einer Zeile von schwarzem Text in der Helvetica 24 pt. Schrift auf weißem Hintergrund. Der Text besteht aus einer Auswahl von zwei Zeichen: einem Zeichen, das wiederholt wird, und einem Zeichen, das nur einmal vorkommt. Zum Beispiel:

Probeneingabe

Ausgabe

Die Ausgabe ist ein IntegerIndex des verschiedenen Zeichens. Im obigen Beispiel wird die Ausgabe sein 4. (Beachten Sie, dass die Indizes einer Zeichenfolge bei beginnen. 0)

Programmspezifikationen

Wie beim Code Golf üblich, gewinnt das kürzeste Programm.


Testfälle

 => 10
 => 11
 => 5
 => 16
 => 10
 => 21
 => 20
 => 13
 => 11
 => 4
 => 7

AMACB
quelle
2
Pedantischer Hinweis: Ihr reales Beispiel ist an sich kein Rätsel. Es ist eher ein amüsantes Augenspiel.
Zach Gates
Wie wird das gewertet?
Intboolstring
Es ist ein Code-Golf, also das kürzeste Programm, das die Antwort auf jedes der Beispiele erfolgreich ausgibt.
AMACB
2
Beachten Sie, dass die kürzeste Antwort für einige Sprachen möglicherweise darin besteht, die Ergebnisse hart zu codieren und eine auszuwählen, die auf der Größe des Eingabebilds basiert (was meiner Meinung nach nicht zulässig ist).
user81655
1
@AMACB "obwohl in den Beispielen keine enthalten sind", könnte es eine gute Idee sein, dies zu ändern;). Wie viele Zeichen müssen wir mindestens verarbeiten? (Mindestens 3, denke ich, oder können wir davon ausgehen, dass es mehr als das ist?) Es sollte auch einen Testfall für dieses Minimum geben.
Martin Ender

Antworten:

6

Dyalog APL , 31 32 Bytes

{1⍳⍨+⌿∘.≡⍨{⍵/⍨~∧⌿⍵}¨⍵⊂⍨2>/∧⌿1,⍵}

⎕IO←0 Indizes ab 0 (pro OP) zu erhalten, was in vielen APL-Systemen ohnehin Standard ist.

1,⍵Stellen Sie
∧⌿für jede Spalte eine Spalte mit weißen Pixeln (um den Rand zu gewährleisten) voran, wenn
2>/am linken Rand jedes Zeichens (paarweise größer als) ein rein weißer Boolescher Wert (vertikale UND-Reduzierung)
⍵⊂⍨in Blöcke aufgeteilt ist, die an jedem TRUE beginnen.
{Für jeden Block
∧⌿⍵Boolescher Wert für jede Spalte, wenn rein weiße (vertikale UND-Reduktion)
⍵/⍨~Spalten, die nicht [rein weiß] sind
∘.≡⍨, jedes Element mit allen Elementen
+⌿übereinstimmen. Anzahl der Blöcke identisch mit jedem Blockindex (vertikale Plus-Reduktion)
1⍳⍨der ersten (dh einzigartiges Element)

Angenommen, das Bild enthält schwarze (0) und weiße (1) Pixel in der Matrix Iund zwischen den Zeichen befindet sich mindestens eine rein weiße Pixelspalte.

      f←{1⍳⍨+⌿∘.≡⍨{⍵/⍨~∧⌿⍵}¨⍵⊂⍨2>/∧⌿1,⍵}

"!ICH!!":

      ⊢I←6 12⍴(13/1),(22⍴0 1 1),(5/1),0,(8/1),(10⍴0 1 1),13/1
1 1 1 1 1 1 1 1 1 1 1 1
1 0 1 1 0 1 1 0 1 1 0 1
1 0 1 1 0 1 1 0 1 1 0 1
1 1 1 1 0 1 1 1 1 1 1 1
1 0 1 1 0 1 1 0 1 1 0 1
1 1 1 1 1 1 1 1 1 1 1 1
      f I
1

"mmnmm":

      ⊢I←7 31⍴(94/1),0 0,(∊0 1⌽¨2/⊂12⍴6↑1 0 1 1),0 1,(62⍴1 1 1,(⊢,⌽)(14⍴0 1)),33/1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 0 0 1 0 1 1 0 0 1 0 1 1 0 0 0 1 1 0 0 1 0 1 1 0 0 1 0 1 1 1
1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1
1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1     
      f I
2
Adam
quelle
Kannst du das nicht komplett entfernen {⍵/⍨~∧⌿⍵}¨und nur bei bleiben {1⍳⍨+⌿∘.≡⍨⍵⊂⍨2>/∧⌿1,⍵}?
Lstefano
@lstefano Dann würde es aufhören zu funktionieren, wenn es unterschiedlich viel Leerraum gäbe.
Adám
Ich verstehe was du meinst.
Lstefano
3

Mathematica, 125 Bytes

StringCases[#,x:Except[StringCases[#~StringTake~3,x_~~___~~x_:>x][[1]]]:>Position[Characters@#,x]][[1,1,1]]-1&@*TextRecognize

Ahh, Mathemeatica gebaut. So erstaunlich. (Und so lange ...) Sprengt auf | /! : /; , /. `/ 'und explodiert anders auf m / n.

CalculatorFeline
quelle
Für wie viele Eingänge funktioniert das? Meine Kopie erkennt beispielsweise im ersten Beispiel keinen Text (Pipes und Ausrufezeichen). Es sei denn, ich vermisse etwas, mit dem ich die gleiche Leistung habe Length[Split[Characters@TextRecognize@#][[1]]] &
A Simmons
Hoppla, ich habe Split vergessen ... Und es basiert auf Mathematicas integriertem Texterkenner ... Und man kann ihm niemals vertrauen.
CalculatorFeline
Ich werde meine dann als separate Lösung veröffentlichen.
Ein Simmons
3

Mathematica, 46 Bytes

Length@First@Split@Characters@TextRecognize@#& 

Gleiche Fehler wie bei der anderen mathematica-Lösung, da sie auf derselben TextRecognizeFunktion beruht .

Ein Simmons
quelle
Bytesave:Length@First@Split@Characters@TextRecognize@#&
CalculatorFeline
@ CatsAreFluffy Cheers
A Simmons
Schade, dass es gerade lang genug ist, um @*nicht zu sparen.
CalculatorFeline