Temukan surat yang berbeda

10

Anda mungkin pernah melihat puzzle seperti ini:

Temukan 0:
OOOOOOOOOOOOOOOOOOOO0OOOOOOOOOOOOOOOOOO

Tantangannya adalah untuk menulis sebuah program yang menemukan indeks surat yang berbeda diberikan gambar.

Memasukkan

Input akan menjadi Image. Gambar akan terdiri dari satu baris dari hitam teks dalam Helvetica 24 pt. font pada latar belakang putih . Teks akan terdiri dari pilihan dua karakter: satu karakter yang diulang, dan satu karakter yang hanya muncul sekali. Contohnya:

Input Sampel

Keluaran

Output akan menjadi Integer, indeks karakter yang berbeda. Pada contoh di atas, hasilnya akan menjadi 4. (Perhatikan bahwa indeks string dimulai pada 0)

Spesifikasi Program

Seperti biasa untuk golf kode, program terpendek menang.


Uji Kasus

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

AMACB
sumber
2
Catatan pedantic: contoh dunia nyata Anda bukan teka-teki per se. Ini lebih dari permainan mata yang lucu.
Zach Gates
Bagaimana skornya?
intboolstring
Ini adalah kode golf, jadi program terpendek yang berhasil menampilkan jawaban untuk masing-masing contoh.
AMACB
2
Perhatikan bahwa jawaban terpendek untuk beberapa bahasa mungkin benar-benar mengkodekan hasil dan memilih satu berdasarkan sesuatu seperti ukuran gambar input (yang saya anggap tidak diperbolehkan).
user81655
1
@AMACB "walaupun tidak ada yang disertakan dalam contoh", maka mungkin ide yang baik untuk mengubahnya;). Juga berapa jumlah minimum karakter yang harus kita tangani? (Setidaknya 3 kurasa, atau bisakah kita menganggapnya lebih dari itu?) Juga harus ada test case untuk minimum itu.
Martin Ender

Jawaban:

6

Dyalog APL , 31 32 byte

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

⎕IO←0 untuk mendapatkan indeks yang dimulai dengan 0 (per OP), dan yang merupakan default di banyak sistem APL.

1,⍵tambahkan kolom piksel putih (untuk memastikan margin)
∧⌿boolean untuk setiap kolom jika boolean semua-putih (vertikal DAN-reduksi)
2>/di tepi kiri masing-masing karakter (berpasangan lebih besar dari)
⍵⊂⍨dibagi menjadi blok yang dimulai pada masing-masing BENAR.
{... untuk setiap blok
∧⌿⍵boolean untuk setiap kolom jika semua-putih (vertikal DAN-reduksi)
⍵/⍨~kolom yang tidak [semua-putih]
∘.≡⍨cocok dengan setiap elemen dengan semua elemen
+⌿jumlah blok identik dengan setiap blok (vertikal plus-reduksi)
1⍳⍨indeks yang pertama (yaitu elemen unik)

Mengasumsikan gambar berwarna hitam (0) dan putih (1) piksel dalam matriks I, dan setidaknya ada satu kolom piksel semua-putih di antara karakter.

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

"!SAYA!!":

      ⊢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
Adm
sumber
Tidak bisakah Anda menghapus sepenuhnya {⍵/⍨~∧⌿⍵}¨dan tetap dengan saja {1⍳⍨+⌿∘.≡⍨⍵⊂⍨2>/∧⌿1,⍵}?
lstefano
@ lstefano Maka itu akan berhenti bekerja jika ada berbagai jumlah ruang putih.
Adám
Saya mengerti apa yang kamu maksud.
lstefano
3

Mathematica, 125 byte

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

Ahh, Mathemeatica builtins. Begitu menakjubkan. (Dan sangat lama ...) Meledakkan | /! : /; , /. `/ 'dan meledak berbeda di m / n.

CalculatorFeline
sumber
Berapa banyak input yang bekerja untuk ini? Salinan saya tidak akan mengenali teks apa pun dalam contoh pertama (pipa dan tanda seru) misalnya. Kecuali jika saya melewatkan sesuatu yang memiliki kinerja yang identik dengan Length[Split[Characters@TextRecognize@#][[1]]] &
A Simmons
Ups, lupa tentang Split .... Dan itu bergantung pada pengenal teks bawaan Mathematica ... Dan Anda tidak pernah bisa mempercayainya.
CalculatorFeline
Saya akan memposting milik saya sebagai solusi terpisah.
A Simmons
3

Mathematica, 46 byte

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

Kegagalan yang sama dengan solusi Mathematica lainnya karena bergantung pada TextRecognizefungsi yang sama .

A Simmons
sumber
Bytesave:Length@First@Split@Characters@TextRecognize@#&
CalculatorFeline
@CatsAreFluffy Cheers
A Simmons
Sayang sekali, itu cukup lama sehingga @*tidak menyelamatkan.
CalculatorFeline