Знайдіть іншу букву


10

Можливо, ви бачили такі головоломки:

Знайдіть 0:
OOOOOOOOOOOOOOOOOOOO0OOOOOOOOOOOOOOOOOO

Завдання полягає в тому, щоб написати програму, яка знайде індекс різної букви, заданої зображенням.

Вхідні дані

Вхід буде an Image. Зображення буде складатися з одного рядка з чорного тексту в Helvetica 24 пунктів. шрифт на білому тлі. Текст буде складатися з виділення двох символів: одного символу, який повторюється, і одного символу, який з’являється лише один раз. Наприклад:

Зразок введення

Вихідні дані

Виведенням буде Integerіндекс різного символу. У наведеному вище прикладі результат буде 4. (Зверніть увагу, що індекси рядка починаються з 0)

Технічні характеристики програми

Як звичайно для кодового гольфу, виграє найкоротша програма.


Випробування

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


2
Педантична примітка: ваш приклад у реальному світі не є загадкою. Це більше забавна гра очей.
Зак Гейтс

Як це забито?
intboolstring

Це кодовий гольф, тому найкоротша програма, яка успішно видає відповідь на кожен із прикладів.
AMACB

2
Зауважте, що найкоротша відповідь для деяких мов може насправді бути жорстким кодуванням результатів та вибором одного на основі розміру вхідного зображення (який, я вважаю, не дозволений).
користувач81655

1
@AMACB "хоча жоден з них не включений у приклади", можливо, було б корисно змінити це;). Крім того, яка мінімальна кількість символів нам належить обробляти? (Принаймні, 3 я гадаю, чи можна припустити, що це більше ніж це?) Для цього мінімуму також повинен бути тестовий випадок.
Мартін Ендер

Відповіді:


6

Діалог APL , 31 32 байт

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

⎕IO←0 щоб отримати індекси, починаючи з 0 (за ОП), і це в будь-якому випадку за умовчанням у багатьох системах APL.

1,⍵додайте стовпчик білих пікселів (щоб забезпечити запас)
∧⌿булевим для кожного стовпчика, якщо суцільно-білий (вертикальний AND-зменшення)
2>/булевий лівий край кожного символу (на пару більше, ніж),
⍵⊂⍨розділений на блоки, що починаються з кожної ІСТИНИ.
{Для кожного
∧⌿⍵булевого блоку для кожного стовпчика, якщо повністю-білі (вертикальні AND-скорочення)
⍵/⍨~стовпці, які не [всебілимі],
∘.≡⍨відповідають кожному елементу, всім елементам
+⌿кількість блоків, ідентичний кожному блоку (вертикальне плюс зменшення)
1⍳⍨індексу першого (тобто унікальний елемент)

Передбачається, що зображення має чорну (0) та білу (1) пікселі в матриці I, і що між символами є принаймні один стовпець із усіма білими пікселями.

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

"! Я !!":

      ⊢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

Ви не можете повністю видалити {⍵/⍨~∧⌿⍵}¨та залишитися лише {1⍳⍨+⌿∘.≡⍨⍵⊂⍨2>/∧⌿1,⍵}?
lstefano

@lstefano Тоді воно б перестало працювати, якщо було б багато пробілів.
Адам

Я бачу, що ти маєш на увазі.
lstefano

3

Математика, 125 байт

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

А-а-а, Mathemeatica buildins. Так дивно. (І так довго ...) Вибухає на | /! : /; , /. `/ 'і вибухає по-різному на m / n.


На скільки входів це працює? Моя копія, наприклад, не розпізнає жоден текст у першому прикладі (трубки та знак оклику). Якщо я не пропускаю щось, з чим я однаковий, Length[Split[Characters@TextRecognize@#][[1]]] &
A Simmons

На жаль, забув про Спліт .... І він покладається на вбудований розпізнавач тексту Mathematica ... І ти ніколи не можеш довіряти цьому.
CalculatorFeline

Тоді я опублікую шахту як окреме рішення.
Сіммонс

3

Математика, 46 байт

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

Ті ж збої, що й інші математичні рішення, оскільки воно спирається на ту саму TextRecognizeфункцію.


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

@CatsAreFluffy Cheers
A Simmons

Шкода, що достатньо довго, що @*не економить.
CalculatorFeline
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.