Этот вызов был вдохновлен рекламой Венди с 1984 года.
Иллюстрация Т.С. Роджерса
Ваша задача - найти шестнадцатеричный 0xBEEF на двоичной булочке.
«Говядина» состоит из следующего шаблона:
1 0 1 1 (0xB)
1 1 1 0 (0xE)
1 1 1 0 (0xE)
1 1 1 1 (0xF)
И «плюшка» состоит из двоичной матрицы 12x12, такой как:
1 1 1 0 0 1 1 1 1 1 1 0
1 1 0 1 0 0 1 0 0 0 0 0
0 1 0 0 0 1 1 1 1 1 0 1
1 0 0 1 0 0 1 0 0 1 0 0
1 0 0 1 0 1 1 0 0 1 1 1
1 1 1 1 1 1 0 0 0 0 1 0
1 1 0 1 1 1 0 0 0 0 0 1
1 0 0 1 1 1 1 0 0 0 0 1
1 0 0 1 1 1 0 1 1 1 1 1
1 1 1 1 1 0 0 1 1 1 1 1
1 0 0 0 0 1 0 1 0 1 1 1
1 1 0 0 1 1 0 0 0 0 1 1
вход
Ваша программа или функция будет принимать двоичную матрицу в качестве входных данных. Формат матрицы очень гибкий, но он должен быть четко описан в вашем ответе.
Например:
одиночная двоичная строка, с или без разделителей между строками:
"111001111110 110100100000..."
или же:
"111001111110110100100000..."
массив двоичных строк:
["111001111110", "110100100000", ...]
массив чисел (каждое число, описывающее строку, однажды преобразованную обратно в двоичную и дополненную слева нулями):
[3710, 3360, ...]
Выход
Координаты (X, Y)
«говядины», (0, 0)
являющейся верхним левым углом булочки.
В качестве альтернативы, вы можете использовать координаты на основе 1 (но не сочетание обоих форматов, например 0 на основе X и 1 на основе Y).
Для приведенного выше примера ожидаемый ответ (3, 4)
(на основе 0) или (4, 5)
(на основе 1):
00 01 02 03 04 05 06 07 08 09 10 11
00 1 1 1 0 0 1 1 1 1 1 1 0
01 1 1 0 1 0 0 1 0 0 0 0 0
02 0 1 0 0 0 1 1 1 1 1 0 1
03 1 0 0 1 0 0 1 0 0 1 0 0
04 1 0 0 [1 0 1 1] 0 0 1 1 1
05 1 1 1 [1 1 1 0] 0 0 0 1 0
06 1 1 0 [1 1 1 0] 0 0 0 0 1
07 1 0 0 [1 1 1 1] 0 0 0 0 1
08 1 0 0 1 1 1 0 1 1 1 1 1
09 1 1 1 1 1 0 0 1 1 1 1 1
10 1 0 0 0 0 1 0 1 0 1 1 1
11 1 1 0 0 1 1 0 0 0 0 1 1
Опять же, любой разумный формат будет работать, если он указан в вашем ответе. Также укажите, если вы используете 0 или 1.
правила
- Вы можете смело предположить, что на булочке всегда ровно одна «говядина». Ваш код не обязан поддерживать случаи с более чем одной говядиной или вообще без говядины.
- Шаблон говядины всегда будет выглядеть так, как описано. Он никогда не будет повернут или отражен каким-либо образом.
- Это код-гольф, поэтому выигрывает самый короткий ответ в байтах. Стандартные лазейки запрещены.
Контрольные примеры
В следующих тестовых примерах каждая строка матрицы выражается в виде десятичного представления.
Input : [ 3710, 3360, 1149, 2340, 2407, 4034, 3521, 2529, 2527, 3999, 2135, 3267 ]
Output: [ 3, 4 ]
Input : [ 1222, 3107, 1508, 3997, 1906, 379, 2874, 2926, 1480, 1487, 3565, 633 ]
Output: [ 3, 7 ]
Input : [ 2796, 206, 148, 763, 429, 1274, 2170, 2495, 42, 1646, 363, 1145 ]
Output: [ 6, 4 ]
Input : [ 3486, 3502, 1882, 1886, 2003, 1442, 2383, 2808, 1416, 1923, 2613, 519 ]
Output: [ 1, 1 ]
Input : [ 3661, 2382, 2208, 1583, 1865, 3969, 2864, 3074, 475, 2382, 1838, 127 ]
Output: [ 8, 8 ]
Input : [ 361, 1275, 3304, 2878, 3733, 3833, 3971, 3405, 2886, 448, 3101, 22 ]
Output: [ 0, 3 ]
Input : [ 3674, 2852, 1571, 3582, 1402, 3331, 1741, 2678, 2076, 2685, 734, 261 ]
Output: [ 7, 7 ]
(1,1)
)?y
,x
(т.е. в обратном порядке)?Ответы:
Желе ,
201716 байтВходные данные представлены в виде булевой матрицы, выходные данные - индексная пара на основе 1 (Y, X) .
Попробуйте онлайн! или проверьте все контрольные примеры .
Как это устроено
источник
ṡ4Z€Ḅw€“Ье‘ĖUṀ
ṡ€4ḄZjw“¿ÇÇБ’d24
индексирование на основе 0, но, к сожалению, оно на один байт длиннее.vim,
126807776Ожидает ввода в виде
И выходные данные (с индексами на основе 1) как
Спасибо Jörg Hülsermann за косвенную экономию 46 байт, благодаря которой я понял, что мое регулярное выражение было очень глупым, и DJMcMayhem за еще 3 байта.
источник
Yp
лучше, чемyyp
(хотя я знаю, что вы возражаете противY
: P) 2) пробелы в немexec 'norm Go'
не нужны. И 3)kd{
короче чемkdgg
. (Хотя не проверял это)Y
потому что у меня это отскок в моем vimrc. : P На самом деле,kdgg
было эквивалентно простоd{
, что, как ни удивительно, не удаляет текущую строку.{
движение персонажа; поэтому я должен сделать что-то вроде{d''
удаления целых строк.JavaScript (ES6),
636056 байтПринимает ввод в виде 155-символьной строки из 12 12-значных двоичных строк, разделенных пробелом, возвращает значения с нулевым индексом. Изменить: Сохранено 3 байта благодаря @ JörgHülsermann. Сохранено 4 байта благодаря @ETHproductions.
источник
s.search(r)
вместоr.exec(s).index
?s=>[
на(s,i)=>[
, потому что вам нужно где-то определить i: /C
146177173163 байтаСпасибо Numberknot за исправление кода (смещение трех нижних строк).
Сохранение 4 байта, заменив
>>=1
с/=2
в 4 -х местах. Сохранение более 10 байт, позволяяx
иy
быть глобальным и по умолчаниюint
благодаря MD XFUngolfed:
Возвращает x, y (на основе 0) в верхнем и нижнем полубайтах байта.
Использование:
источник
#define T(i,n)if((A[y+i]&15)==n)
и раздел if,T(0,11)T(1,14)T(2,14)T(3,15)return
чтобы сохранить 6 байтов. Также измените сигнатуру функцииint b(int*A)
на 4 сохраненных байта.MATL ,
2221 байтВвод представляет собой двоичную матрицу с
;
разделителем строк. Выход 1-основе в обратном порядке:Y X
.Попробуйте онлайн! Или проверьте все контрольные примеры с десятичным форматом ввода.
объяснение
Шаблон обнаруживается с использованием 2D свертки. За это,
1, -1
вместо1, 0
. Поскольку шаблон имеет размер 4 × 4, его появление обнаруживается записью, равной16
на выходе свертки.Кроме того, поскольку свертка вносит смещение в обнаруженные индексы, это необходимо исправить в выходных данных.
источник
Mathematica, 62 байта
Возвращает все позиции матрицы BEEF, с 1 индексированием. На входе должна быть матрица двоичных цифр. Хотя x и y на выходе переключаются.
источник
x
иy
не переключайтесь.Скольжение , 28 байт
27 байт кода, +1 за
p
опцию.Требует ввода в виде многострочного прямоугольника из 1 и 0 без пробелов. Попробуйте это здесь (с третьим тестом в качестве входных данных).
объяснение
Slip - это язык из задачи 2-D Pattern Matching . Sp3000 мог бы сказать об этом гораздо больше, чем я, но в основном это расширенная форма регулярного выражения с некоторыми командами направления, которые позволяют вам сопоставлять в двух измерениях. Приведенный выше код использует одноименную команду «slip»
\
, которая не меняет направление указателя совпадения, а перемещает его вбок на один символ. Он также использует «стационарную группу»(?|...)
, которая сопоставляет что-то, а затем сбрасывает указатель на его предыдущее местоположение.Код разбивается следующим образом:
Это соответствует
0xBEEF
площади.p
Опция выводит координаты матча, 0-индексированные.источник
1011>001>1(11>){3}1>1
1(11>){3}
.PHP, 87 байт
двоичная строка в качестве ввода без разделителей, возвращает значения с нулевым индексом.
массив чисел в качестве входных 128 байтов
14 байтов сохранено @Titus Спасибо
источник
,
вместо.
вecho
и вы можете удалить скобки. (-4)PREG_OFFSET_CAPTURE
: добавьте,256
кpreg_match
параметрам, удалите^(.*)
из регулярного выражения$c[0][1]
вместоstrlen($c[1])
(-6)Java 7,
182177 байтЯ портировал ответ Karl Napf C на JAVA И спасибо Karl Napf за то, что он сэкономил 5 байт, напомнив мне немного магии. (Кстати, я тоже придумал эту идею, но идея возврата части @KarlNapf была вашей, а не моей). Извините, если я вас не устраивал.
(От 0)
Ungolfed
источник
a[y++]>>=1)
иif((a[y]&15)==
. Кстати, я считаю 182 байта вместо 183? : S...a[y++]/=2)
иif((a[y]&15)==...
.Сетчатка, 47 байт
Я хотел бы предварить это извинением. Я думаю, что это, вероятно, ужасно и плохой пример того, как использовать язык, но так как я использовал Regex для своего ответа на Perl, я решил попробовать Retina. Я не очень хорош. :( Отрывки на github мне очень помогли!
Спасибо @ wullzx за комментарий к моему Perl-ответу для -3 байта и @ Taemyr за указание на проблему с моим методом!
Ожидает ввод в виде разделенной пробелами двоичной строки и выводит координаты разделенных пробелом.
Попробуйте онлайн!
Проверьте все тесты одновременно.
источник
You can safely assume that there is always exactly one 'beef' on the bun. Your code is not required to support cases with more than one beef or no beef at all.
? Это может быть решено с помощью ненадежных модификаторов, если это необходимо(.{12})*?(.)*?
.Скала, 90 байт
Объяснение:
(a -> b) andThen (b -> c)
в результате получается(a -> c)
функция, аналогичная compose, но требует меньше аннотаций типов в scala. В этом случае он принимает строку двоичных цифр в качестве входных данных и возвращает набор нулевых индексов.источник
J,
3129 байтВходные данные отформатированы в виде двумерного массива двоичных значений, а выходные данные - это координаты, начинающиеся с нуля, в виде массива
[y, x]
.Сглаживание и базовое преобразование для поиска индекса - это то, что я узнал из этого комментария Денниса.
использование
объяснение
источник
Python 2,
989592 байтаВвод - это список строк, вывод - это строка XY (индексы на основе 1).
Проверьте это на Ideone .
источник
Perl, 54 байта
Код 53 байта + 1 для
-n
. Используется-E
без каких-либо дополнительных затрат.Использует индексы на основе 0. Ожидает ввод в виде строки
1
s и0
s и выводит разделенные пробелом координаты.Спасибо @ wullxz и @ GabrielBenamy за помощь в экономии 9 байт, а также комментарию @ Taemyr к моему ответу Retina за указание на проблему!
использование
источник
(.{8}1110){2}
вместо.{8}1110.{8}1110
length$`
в$-[0]
\1
но безуспешно , не думал пытаться{2}
! Спасибо!$-[0]
- это смещение начала последнего успешного совпадения.$-[n]
Это смещение начала подстроки, совпадающей с n-ным подшаблоном, илиundef
если подшаблон не совпадает." От: perldoc.perl.org/perlvar.html (ищите@-
)Scala, 318 байт
Это решение может быть улучшено в дальнейшем ... но я сохранил его читабельным и допустил, чтобы входные данные были многострочными матрицами.
Фактическое решение, если массив двоичной строки
Образец работы
источник
Python, 137 байт (согласно Linux (спасибо ElPedro))
Не совсем конкурентный счет, но алгоритм немного интересен. Принимает ввод как строку двоичных значений.
источник
Рубин , 62 байта
Он ожидает строку
0
и1
возвращает массив Y и X, нулевой основе.Попробуйте в идеоне .
источник
F # - 260 байт
Полная программа, включая требуемый указатель EntryPoint (так что считайте меньше, если хотите, я полагаю).
Ввод: каждая строка в виде отдельной строки: "111001111110" "110100100000" "010001111101" "100100100100" "100101100111" "111111000010" "110111000001" "100111100001" "100111011111" "111110011111" "100001010111" "1100110111" "1100110011" "1100110011
Код:
Скорее всего, это не самое элегантное решение, но я хотел бы придерживаться строк, поэтому я так и сделал. Я почти сделал так, чтобы это была одна линия и меньше, использующая каналы, но есть кое-что с двойным блоком if, который заставлял меня, что я не мог разрешить. Ну да ладно!
Я тоже думал о переносе ответа Карла на F #, поскольку он хороший, и, возможно, все еще делает это ради забавы, как другой подход, но хотел придерживаться этого, чтобы быть другим.
источник
Дьялог АПЛ,
2927 байтПринимает двоичный массив 12x12 в качестве пользовательского ввода и возвращает координаты в обратном порядке, индексы начинаются с 1.
Спасибо @ Adám за сохранение большого количества байтов. -2 байта, потому что я тупой и оставил все в функции без причины.
источник
~2 8 12∊⍨4 4⍴⍳16
на15 7 15 9⊤⍨4/2
. Обратите внимание, что0~⍨∊{⍵×⍳⍴⍵}
его можно заменить на⍸
версию 16.0 (ваш код работает только в Dyalog APL).⍸
добавляется начиная с версии 16, я не смог найти список примитивов GNUAPL.Элемент , 130 байт
Попробуйте онлайн!
Принимает ввод в виде одной длинной строки 1 и 0 без разделителей. Выходы как
3 4
(индексация на основе 0).Это работает, помещая входные данные в «массив» (в основном словарь с целочисленными ключами), а затем, для каждого возможного начального значения, проверяет биты с определенными смещениями (все 16 из них в очень трудоемком процессе).
источник