Znajdź inną literę

10

Być może widziałeś takie układanki:

Znajdź 0:
OOOOOOOOOOOOOOOOOOOO0OOOOOOOOOOOOOOOOOO

Wyzwanie polega na napisaniu programu, który znajdzie indeks innej litery na podstawie obrazka.

Wejście

Dane wejściowe będą Image. Obraz składa się z jednej linii z czarnym tekstem Helvetica 24 pkt. czcionka na białym tle. Tekst będzie się składał z wyboru dwóch znaków: jednego znaku, który jest powtarzany, i jednego znaku, który pojawia się tylko raz. Na przykład:

Przykładowe dane wejściowe

Wynik

Wynikiem będzie Integerindeks innego znaku. W powyższym przykładzie wynikiem będzie 4. (Zauważ, że indeksy łańcucha zaczynają się od 0)

Specyfikacja programu

Jak zwykle w przypadku golfa kodowego, wygrywa najkrótszy program.


Przypadki testowe

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

AMACB
źródło
2
Uwaga pedantyczna: Twój przykład z prawdziwego świata nie jest sam w sobie zagadką. To bardziej zabawna gra oka.
Zach Gates
Jak to jest punktowane?
introolstring
Jest to golf golfowy, więc najkrótszy program, który z powodzeniem podaje odpowiedź na każdy z przykładów.
AMACB
2
Zauważ, że najkrótszą odpowiedzią dla niektórych języków może być zakodowanie wyników na sztywno i wybranie jednej na podstawie czegoś takiego jak rozmiar obrazu wejściowego (co, jak zakładam, jest niedozwolone).
user81655,
1
@AMACB „chociaż nie ma ich w przykładach”, warto to zmienić;). Jaka jest minimalna liczba znaków, z którymi musimy sobie poradzić? (Chyba co najmniej 3, czy możemy założyć, że to coś więcej?) Powinien też istnieć przypadek testowy dla tego minimum.
Martin Ender

Odpowiedzi:

6

Dyalog APL , 31 32 bajtów

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

⎕IO←0 aby uzyskać indeksy zaczynające się od 0 (na OP), które i tak są domyślne w wielu systemach APL.

1,⍵wstaw kolumnę z białymi pikselami (dla zapewnienia marginesu) wartość
∧⌿logiczną dla każdej kolumny, jeśli całkowicie biała (pionowa redukcja AND) wartość
2>/logiczna na lewej krawędzi każdego znaku (para większa niż)
⍵⊂⍨podzielona na bloki rozpoczynające się od każdej PRAWDY.
{Dla każdego
∧⌿⍵logicznego bloku dla każdej kolumny, jeżeli kolumny całkowicie białe (pionowa redukcja AND)
⍵/⍨~, które nie są [całkowicie białe],
∘.≡⍨dopasowują każdy element do wszystkich elementów
+⌿liczba bloków identycznych z każdym
1⍳⍨indeksem (indeks pionowy plus redukcja) pierwszego (tj. unikalny element)

Zakłada, że ​​obraz ma czarne (0) i białe (1) piksele w matrycy Ii że między znakami jest co najmniej jedna kolumna z białymi pikselami.

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

"!JA!!":

      ⊢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ám
źródło
Nie możesz całkowicie usunąć {⍵/⍨~∧⌿⍵}¨i pozostać tylko z {1⍳⍨+⌿∘.≡⍨⍵⊂⍨2>/∧⌿1,⍵}?
lstefano
@lstefano Wtedy przestałby działać, gdyby istniało różne ilości białych znaków.
Adám
Rozumiem, co masz na myśli.
lstefano
3

Mathematica, 125 bajtów

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

Ahh, wbudowane Mathemeatica. Tak niezwykłe. (I tak długo ...) Wysadza | /! : /; , /. `/ 'i wysadza się inaczej na m / n.

CalculatorFeline
źródło
Dla ilu danych to działa? Moja kopia nie rozpozna na przykład tekstu w pierwszym przykładzie (potoki i wykrzyknik). Chyba że brakuje mi czegoś, z czym mam identyczny występ Length[Split[Characters@TextRecognize@#][[1]]] &
A Simmons
Ups, zapomniałem o Splicie ... I opiera się on na wbudowanym rozpoznawaniu tekstu Mathematica ... I nigdy nie możesz temu ufać.
CalculatorFeline
Prześlę moje jako osobne rozwiązanie.
A Simmons
3

Mathematica, 46 bajtów

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

Te same awarie, co inne rozwiązanie matematyczne, ponieważ opiera się na tej samej TextRecognizefunkcji.

Simmons
źródło
Bytesave:Length@First@Split@Characters@TextRecognize@#&
CalculatorFeline
@CatsAreFluffy Cheers
A Simmons
Szkoda, że ​​jest wystarczająco długi, aby @*nie oszczędzać.
CalculatorFeline