Найди другое письмо

10

Возможно, вы видели такие загадки:

Найти 0:
OOOOOOOOOOOOOOOOOOOO0OOOOOOOOOOOOOOOOOO

Задача состоит в том, чтобы написать программу, которая находит индекс другой буквы для данного изображения.

вход

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

Пример ввода

Вывод

Выводом будет Integerиндекс другого символа. В приведенном выше примере вывод будет 4. (Обратите внимание, что индексы строки начинаются с 0)

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

Как обычно для кода гольф, выигрывает самая короткая программа.


Тестовые случаи

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

AMACB
источник
2
Педантическое примечание: ваш реальный пример не является загадкой как таковой. Это больше забавная игра для глаз.
Зак Гейтс
Как это забил?
intboolstring
Это код гольф, поэтому самая короткая программа, которая успешно выводит ответ на каждый из примеров.
AMACB
2
Обратите внимание, что самым коротким ответом для некоторых языков может быть жесткое кодирование результатов и выбор одного из них, основанный на размере входного изображения (что, я полагаю, недопустимо).
user81655
1
@AMACB «хотя ни один из них не включен в примеры», тогда было бы неплохо изменить это;). Кроме того, какое минимальное количество символов мы должны обработать? (Думаю, по крайней мере, 3, или мы можем предположить, что это нечто большее?) Для этого минимума также должен быть контрольный пример.
Мартин Эндер

Ответы:

6

Дьялог АПЛ , 31 32 байта

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

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

1,⍵добавьте столбец белых пикселей (для обеспечения поля)
∧⌿логического значения для каждого столбца, если полностью белый (вертикальное И-уменьшение)
2>/логическое значение по левому краю каждого символа (попарно больше)
⍵⊂⍨разделится на блоки, начинающиеся с каждого ИСТИНА.
{Для каждого
∧⌿⍵логического блока для каждого столбца, если полностью белые (вертикальное И-уменьшение)
⍵/⍨~столбцы, которые не являются [полностью белыми],
∘.≡⍨соответствуют каждому элементу количеству всех элементов,
+⌿идентичных каждому
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

Mathematica, 125 байт

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

Ааа, Mathemeatica встроенные. Так удивительно. (И так долго ...) взрывается на | /! : /; , /. `/ 'и взрывается по-другому на м / п.

CalculatorFeline
источник
На сколько входов это работает? Моя копия не распознает текст в первом примере (например, трубы и восклицательный знак). Если я не пропускаю что-то, с чем у меня идентичное выступление Length[Split[Characters@TextRecognize@#][[1]]] &
A Simmons
Ой, забыл о Сплите .... И он опирается на встроенный в Mathematica распознаватель текста ... И вы никогда не можете доверять этому.
CalculatorFeline
Я выложу мое как отдельное решение тогда.
Симмонс
3

Mathematica, 46 байт

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

Те же сбои, что и у другого решения Mathematica, поскольку оно опирается на ту же TextRecognizeфункцию.

Симмонс
источник
Bytesave:Length@First@Split@Characters@TextRecognize@#&
КалькуляторFeline
@CatsAreFluffy Cheers
Симмонс
Жаль, что достаточно долго, что @*не спасает.
CalculatorFeline