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


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.