Encontre a letra diferente

10

Você pode ter visto quebra-cabeças como este:

Encontre o 0:
OOOOOOOOOOOOOOOOOOOO0OOOOOOOOOOOOOOOOOO

O desafio é escrever um programa que encontre o índice da letra diferente dada uma imagem.

Entrada

A entrada será um Image. A imagem consistirá em uma linha de texto em preto no Helvetica 24 pt. fonte sobre um fundo branco. O texto consistirá em uma seleção de dois caracteres: um caractere que é repetido e um caractere que aparece apenas uma vez. Por exemplo:

Entrada de amostra

Resultado

A saída será um Integer, o índice do caractere diferente. No exemplo acima, a saída será 4. (Observe que os índices de uma string começam em0 )

Especificações do programa

Como de costume no código de golfe, o programa mais curto vence.


Casos de teste

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

AMACB
fonte
2
Nota pedante: seu exemplo do mundo real não é um quebra-cabeça em si. É mais um jogo divertido para os olhos.
Zach Gates
Como isso é pontuado?
Intboolstring
É um código de golfe, portanto, o programa mais curto que gera com sucesso a resposta para cada um dos exemplos.
AMACB 2/16
2
Observe que a resposta mais curta para alguns idiomas pode, na verdade, codificar os resultados e escolher uma com base em algo como o tamanho da imagem de entrada (o que, suponho, não é permitido).
user81655
11
@AMACB "embora nenhum esteja incluído nos exemplos", pode ser uma boa ideia mudar isso;). Além disso, qual é o número mínimo de caracteres que precisamos lidar? (Acho que pelo menos três, ou podemos assumir que é mais do que isso?) Também deve haver um caso de teste para esse mínimo.
Martin Ender

Respostas:

6

Dyalog APL , 31 32 bytes

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

⎕IO←0 para obter índices começando com 0 (por OP) e que é o padrão em muitos sistemas APL.

1,⍵preceda uma coluna de pixels brancos (para garantir margem)
∧⌿booleana para cada coluna se todo branco (redução AND vertical)
2>/booleano na borda esquerda de cada caractere (maior que o par)
⍵⊂⍨dividido em blocos começando em cada VERDADEIRO.
{Para cada bloco
∧⌿⍵booleano de cada coluna se colunas totalmente brancas (redução AND vertical)
⍵/⍨~que não são [totalmente brancas]
∘.≡⍨correspondem a cada elemento a todos os elementos
+⌿número de blocos idênticos a cada bloco (redução vertical mais)
1⍳⍨ índice de do primeiro (ou seja, elemento único)

Supõe que a imagem possui pixels preto (0) e branco (1) na matriz Ie que há pelo menos uma coluna de pixels totalmente branca entre os caracteres.

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

"!EU!!":

      ⊢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ão
fonte
Você não pode remover completamente o {⍵/⍨~∧⌿⍵}¨e permanecer apenas {1⍳⍨+⌿∘.≡⍨⍵⊂⍨2>/∧⌿1,⍵}?
lstefano
@lstefano Pararia de funcionar se houvesse quantidades variáveis ​​de espaço em branco.
Adám 27/06/16
Eu vejo o que você quer dizer.
lstefano
3

Mathematica, 125 bytes

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

Ahh, built-in Mathemeatica. Tão incrível. (E por tanto tempo ...) Explode em | /! : /; , /. `/ 'e explode de maneira diferente em m / n.

CalculatorFeline
fonte
Para quantas entradas isso funciona? Minha cópia não reconhecerá nenhum texto no primeiro exemplo (tubos e ponto de exclamação), por exemplo. A menos que eu estou faltando alguma coisa eu ter um desempenho idêntico Length[Split[Characters@TextRecognize@#][[1]]] &
A Simmons
Opa, esqueci o Split .... E ele se baseia no reconhecedor de texto incorporado do Mathematica ... E você nunca pode confiar nele.
CalculatorFeline
Vou postar o meu como uma solução separada então.
A Simmons
3

Mathematica, 46 bytes

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

Mesmas falhas que a outra solução mathematica, pois depende da mesma TextRecognizefunção.

A Simmons
fonte
Bytesave:Length@First@Split@Characters@TextRecognize@#&
CalculatorFeline
@CatsAreFluffy Cheers
A Simmons
Pena que é apenas o tempo suficiente para @*não salvar.
CalculatorFeline