Trouvez la lettre différente

10

Vous avez peut-être vu des puzzles comme celui-ci:

Trouvez le 0:
OOOOOOOOOOOOOOOOOOOO0OOOOOOOOOOOOOOOOOO

Le défi est d'écrire un programme qui trouve l'index des différentes lettres à partir d'une image.

Contribution

L'entrée sera un Image. L'image consistera en une ligne de texte noir dans le Helvetica 24 pt. police sur fond blanc . Le texte sera composé d'une sélection de deux caractères: un caractère qui est répété et un caractère qui n'apparaît qu'une seule fois. Par exemple:

Exemple d'entrée

Production

La sortie sera un Integer, l'index du caractère différent. Dans l'exemple ci-dessus, la sortie sera 4. (Notez que les indices d'une chaîne commencent à 0)

Spécifications du programme

Comme d'habitude pour le golf à code, le programme le plus court gagne.


Cas de test

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

AMACB
la source
2
Remarque pédante: votre exemple réel n'est pas un puzzle en soi. C'est plus un jeu visuel amusant.
Zach Gates
Comment est-ce noté?
intboolstring
C'est un golf de code, donc le programme le plus court qui produit avec succès la réponse à chacun des exemples.
AMACB
2
Notez que la réponse la plus courte pour certaines langues peut en fait être de coder en dur les résultats et d'en choisir une basée sur quelque chose comme la taille de l'image d'entrée (ce qui, je suppose, n'est pas autorisé).
user81655
1
@AMACB "bien qu'aucun ne soit inclus dans les exemples", alors ce pourrait être une bonne idée de changer cela;). Quel est également le nombre minimum de caractères que nous devons gérer? (Au moins 3 je suppose, ou pouvons-nous supposer que c'est plus que cela?) Il devrait également y avoir un cas de test pour ce minimum.
Martin Ender

Réponses:

6

Dyalog APL , 31 32 octets

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

⎕IO←0 pour obtenir des indices commençant par 0 (par OP), et qui est de toute façon par défaut dans de nombreux systèmes APL.

1,⍵ajouter une colonne de pixels blancs (pour garantir la marge)
∧⌿booléenne pour chaque colonne si tout blanc (réduction ET verticale)
2>/booléen au bord gauche de chaque caractère (par paire supérieur à)
⍵⊂⍨divisé en blocs commençant à chaque VRAI.
{Pour chaque bloc
∧⌿⍵booléen pour chaque colonne si les colonnes tout blanc (vertical ET-réduction)
⍵/⍨~qui ne sont pas [tout blanc]
∘.≡⍨correspondent à chaque élément à tous les éléments
+⌿nombre de blocs identique à chaque bloc (vertical plus-réduction)
1⍳⍨index du premier (ie élément unique)

Suppose que l'image est Icomposée de pixels noirs (0) et blancs (1) dans la matrice et qu'il existe au moins une colonne de pixels entièrement blancs entre les caractères.

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

"!JE!!":

      ⊢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
la source
Vous ne pouvez pas supprimer complètement le {⍵/⍨~∧⌿⍵}¨et rester avec seulement {1⍳⍨+⌿∘.≡⍨⍵⊂⍨2>/∧⌿1,⍵}?
lstefano
@lstefano Ensuite, il cesserait de fonctionner s'il y avait différentes quantités d'espace blanc.
Adám
Je vois ce que tu veux dire.
lstefano
3

Mathematica, 125 octets

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

Ahh, Mathemeatica a intégré. Tellement incroyable. (Et si longtemps ...) explose | /! : /; , /. `/ 'et explose différemment sur m / n.

CalculatorFeline
la source
Pour combien d'entrées cela fonctionne-t-il? Ma copie ne reconnaîtra aucun texte dans le premier exemple (pipes et point d'exclamation) par exemple. À moins que quelque chose me manque, j'ai des performances identiques Length[Split[Characters@TextRecognize@#][[1]]] &
A Simmons
Oups, j'ai oublié Split .... Et cela repose sur la reconnaissance de texte intégrée de Mathematica ... Et vous ne pouvez jamais lui faire confiance.
CalculatorFeline
Je posterai alors la mienne comme solution distincte.
Un Simmons
3

Mathematica, 46 octets

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

Mêmes défaillances que l'autre solution mathématique car elle repose sur la même TextRecognizefonction.

A Simmons
la source
Bytesave:Length@First@Split@Characters@TextRecognize@#&
CalculatorFeline
@CatsAreFluffy Cheers
A Simmons
Dommage, c'est juste assez long pour @*ne pas sauver.
CalculatorFeline