Encuentra la letra diferente

10

Es posible que hayas visto rompecabezas como este:

Encuentra el 0:
OOOOOOOOOOOOOOOOOOOO0OOOOOOOOOOOOOOOOOO

El desafío es escribir un programa que encuentre el índice de la letra diferente dada una imagen.

Entrada

La entrada será un Image. La imagen consistirá en una línea de texto negro en Helvetica 24 pt. fuente sobre un fondo blanco . El texto consistirá en una selección de dos caracteres: un carácter que se repite y un carácter que aparece solo una vez. Por ejemplo:

Entrada de muestra

Salida

La salida será un Integer, el índice de los diferentes caracteres. En el ejemplo anterior, la salida será 4. (Tenga en cuenta que los índices de una cadena comienzan en 0)

Especificaciones del programa

Como de costumbre para el código de golf, gana el programa más corto.


Casos de prueba

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

AMACB
fuente
2
Nota pedante: su ejemplo del mundo real no es un rompecabezas per se. Es más un juego visual divertido.
Zach Gates
¿Cómo se puntúa esto?
intboolstring
Es un código de golf, por lo que el programa más corto que genera con éxito la respuesta a cada uno de los ejemplos.
AMACB
2
Tenga en cuenta que la respuesta más corta para algunos idiomas en realidad puede ser codificar los resultados y elegir uno basado en algo como el tamaño de la imagen de entrada (que supongo que no está permitido).
user81655
1
@AMACB "aunque ninguno está incluido en los ejemplos", entonces podría ser una buena idea cambiar eso;). Además, ¿cuál es el número mínimo de caracteres que tenemos que manejar? (Supongo que al menos 3, ¿o podemos suponer que es más que eso?) También debería haber un caso de prueba para ese mínimo.
Martin Ender

Respuestas:

6

Dyalog APL , 31 32 bytes

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

⎕IO←0 para obtener índices que comienzan con 0 (por OP), y que de todos modos es el predeterminado en muchos sistemas APL.

1,⍵anteponga una columna de píxeles blancos (para asegurar el margen)
∧⌿booleano para cada columna si el booleano completamente blanco (reducción Y vertical)
2>/en el borde izquierdo de cada carácter (en pares, mayor que) se
⍵⊂⍨divide en bloques que comienzan en cada VERDADERO.
{... para cada bloque
∧⌿⍵booleano para cada columna si las columnas completamente blancas (vertical Y-reducción)
⍵/⍨~que no son [todas blancas] hacen
∘.≡⍨coincidir cada elemento con todos los elementos
+⌿número de bloques idénticos a cada bloque (vertical más-reducción)
1⍳⍨índice del primero (es decir, elemento único)

Asume que la imagen es de píxeles negros (0) y blancos (1) en la matriz I, y que hay al menos una columna de píxeles completamente blanca entre los caracteres.

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

"!¡¡YO!!":

      ⊢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
Adán
fuente
¿No puedes eliminar por completo el {⍵/⍨~∧⌿⍵}¨y permanecer solo {1⍳⍨+⌿∘.≡⍨⍵⊂⍨2>/∧⌿1,⍵}?
lstefano
@lstefano Entonces dejaría de funcionar si hubiera cantidades variables de espacio en blanco.
Adám
Veo a que te refieres.
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 incorporado. Tan increíble. (Y hasta luego ...) Sopla en | /! : /; , /. `/ 'y explota de manera diferente en m / n.

CalculadoraFeline
fuente
¿Para cuántas entradas funciona esto? Mi copia no reconocerá ningún texto en el primer ejemplo (tuberías y signos de exclamación), por ejemplo. A menos que me falte algo con lo que tengo un rendimiento idéntico Length[Split[Characters@TextRecognize@#][[1]]] &
A Simmons
Vaya, se olvidó de Split ... Y se basa en el reconocedor de texto incorporado de Mathematica ... Y nunca puedes confiar en él.
CalculatorFeline
Publicaré la mía como una solución separada entonces.
Un Simmons
3

Mathematica, 46 bytes

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

Las mismas fallas que la otra solución matemática, ya que depende de la misma TextRecognizefunción.

Un simmons
fuente
Bytesave:Length@First@Split@Characters@TextRecognize@#&
CalculatorFeline
@CatsAreFluffy Cheers
A Simmons
Lástima que sea lo suficientemente largo como para que @*no se guarde.
CalculatorFeline