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


10

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

Найти 0:
OOOOOOOOOOOOOOOOOOOO0OOOOOOOOOOOOOOOOOO

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

вход

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

Пример ввода

Вывод

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

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

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


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

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


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


На сколько входов это работает? Моя копия не распознает текст в первом примере (например, трубы и восклицательный знак). Если я не пропускаю что-то, с чем у меня идентичное выступление 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.