Trova la lettera diversa


10

Potresti aver visto puzzle come questo:

Trova 0:
OOOOOOOOOOOOOOOOOOOO0OOOOOOOOOOOOOOOOOO

La sfida è quella di scrivere un programma che trova l'indice della lettera diversa data un'immagine.

Ingresso

L'input sarà un Image. L'immagine sarà composta da una riga di testo nero in Helvetica 24 pt. carattere su uno sfondo bianco . Il testo consisterà in una selezione di due caratteri: un carattere che si ripete e un carattere che appare una sola volta. Per esempio:

Input di esempio

Produzione

L'output sarà un Integer indice del carattere diverso. Nell'esempio sopra, l'output sarà 4. (Nota che gli indici di una stringa iniziano da 0)

Specifiche del programma

Come al solito per il golf del codice, vince il programma più breve.


Casi test

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


2
Nota pedante: il tuo esempio del mondo reale non è di per sé un enigma. È più un gioco divertente per gli occhi.
Zach Gates

Come viene segnato?
intboolstring

È un codice golf, quindi il programma più breve che genera correttamente la risposta a ciascuno degli esempi.
AMACB

2
Si noti che la risposta più breve per alcune lingue potrebbe effettivamente essere codificare i risultati e sceglierne uno in base a qualcosa di simile alla dimensione dell'immagine di input (che presumo non sia consentita).
user81655

1
@AMACB "sebbene nessuno sia incluso negli esempi", allora potrebbe essere una buona idea cambiarlo;). Inoltre qual è il numero minimo di personaggi che dobbiamo gestire? (Almeno 3 credo, o possiamo supporre che sia più di questo?) Dovrebbe esserci anche un test case per quel minimo.
Martin Ender

Risposte:


6

Dyalog APL , 31 32 byte

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

⎕IO←0 per ottenere indici che iniziano con 0 (per OP) e che è comunque predefinito in molti sistemi APL.

1,⍵anteporre una colonna di pixel bianchi (per garantire il margine)
∧⌿booleana per ogni colonna se tutta bianca (riduzione AND verticale)
2>/booleana sul bordo sinistro di ciascun personaggio (coppia maggiore di)
⍵⊂⍨divisa in blocchi a partire da ogni VERO.
{... per ogni blocco
∧⌿⍵booleano per ogni colonna se tutte le colonne bianche (riduzione AND verticale)
⍵/⍨~che non sono [tutte bianche]
∘.≡⍨corrispondono a ciascun elemento a tutti gli elementi
+⌿numero di blocchi identici a ciascun blocco (riduzione verticale più)
1⍳⍨ dell'indice del primo (ovvero elemento unico)

Presuppone che l'immagine sia nera (0) e bianca (1) pixel nella matrice Ie che tra i caratteri sia presente almeno una colonna di pixel completamente bianca.

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

"!IO!!":

      ⊢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

Non puoi rimuovere completamente {⍵/⍨~∧⌿⍵}¨e rimanere solo con {1⍳⍨+⌿∘.≡⍨⍵⊂⍨2>/∧⌿1,⍵}?
lstefano,

@lstefano Quindi smetterebbe di funzionare se ci fossero quantità variabili di spazio bianco.
Adám,

Capisco cosa intendi.
lstefano,

3

Mathematica, 125 byte

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

Ahh, builtins di Mathemeatica. Così incredibile. (E così a lungo ...) Esplode su | /! : /; , /. `/ 'e esplode in modo diverso su m / n.


Per quanti ingressi funziona? La mia copia non riconoscerà alcun testo nel primo esempio (pipe e punto esclamativo) per esempio. A meno che non mi manchi qualcosa con cui ho prestazioni identiche Length[Split[Characters@TextRecognize@#][[1]]] &
A Simmons

Oops, mi sono dimenticato di Split .... E si basa sul riconoscitore di testo integrato di Mathematica ... E non puoi mai fidarti.
Calcolatrice

Pubblicherò quindi la mia come soluzione separata.
A Simmons

3

Mathematica, 46 byte

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

Stessi fallimenti dell'altra soluzione matematica che si basa sulla stessa TextRecognizefunzione.


Bytesave:Length@First@Split@Characters@TextRecognize@#&
CalculatorFeline

@CatsAreFluffy Cheers
A Simmons

Peccato che sia abbastanza lungo da @*non salvare.
Calcolatrice
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.