Учитывая 16-разрядное целое число без знака N , ваша задача состоит в том, чтобы определить, соответствует ли его двоичное представление, отображенное в матрице 4x4, форме тетромино , и если да, то какой это форма.
матрица
Каждый бит N отображается в матрице 4x4 слева направо и сверху вниз, начиная с самого старшего.
Пример :
N = 17600
binary representation: 0100010011000000
matrix: [ [ 0, 1, 0, 0 ],
[ 0, 1, 0, 0 ],
[ 1, 1, 0, 0 ],
[ 0, 0, 0, 0 ] ]
Тетромино формы
Основные формы
Существует 7 форм тетромино, обозначенных буквами O , I , S , Z , L , J и T :
Вращения и переводы
Если форма переведена и / или повернута в матрице 4x4, она все еще считается действительным вариантом того же тетромино. Например, 17600, 1136, 2272 и 1604 должны быть обозначены как J- тетромино:
Не оборачивайся!
Однако формы не могут быть обернуты или сдвинуты за пределы какой-либо границы матрицы. Например, ни 568, ни 688 не должны идентифицироваться как J- тетромино (не говоря уже о любой другой форме):
Разъяснения и правила
- Вы можете принимать входные данные как целое число или непосредственно как 16 двоичных цифр в любом приемлемом формате, таком как двумерный массив, плоский массив или строка с разделителями.
- Входными данными гарантированно является 16-разрядное целое число без знака (или его эквивалентное представление в виде массива или строки).
- Когда правильная форма определена, вы должны напечатать или вернуть букву, идентифицирующую форму, в нижнем или верхнем регистре.
- Если фигура не определена, вы должны напечатать или вернуть значение, которое не соответствует ни одной букве тетромино. Вы также можете вообще ничего не возвращать.
- Чтобы считаться действительной, матрица должна содержать точную форму тетромино без каких-либо дополнительных ячеек (см. 1911 и 34953 в тестовых примерах).
- Это код-гольф , поэтому выигрывает самый короткий ответ в байтах!
Контрольные примеры
Вы можете перейти по этой ссылке, чтобы получить тестовые наборы в виде 2D-массивов.
0 -> false
50 -> false
51 -> 'O'
1911 -> false
15 -> 'I'
34952 -> 'I'
34953 -> false
1122 -> 'S'
3168 -> 'Z'
785 -> 'L'
1136 -> 'J'
568 -> false
688 -> false
35968 -> 'T'
19520 -> 'T'
источник
func1 . func2 . func3
в JS: P0
, то есть1111011110111101111
для65535
?15,240,3840,4369,8738,17476,34952,61440
J:71,113,142,226,275,550,802,1100,1136,1604,1808,2272,3208,3616,4400,8800,12832,17600,18176,25664,28928,36352,51328,57856
L:23,46,116,232,368,547,736,785,1094,1570,1856,2188,3140,3712,5888,8752,11776,12560,17504,25120,29696,35008,50240,59392
O:51,102,204,816,1632,3264,13056,26112,52224
S:54,108,561,864,1122,1728,2244,8976,13824,17952,27648,35904
T:39,78,114,228,305,562,610,624,1124,1220,1248,1824,2248,3648,4880,8992,9760,9984,17984,19520,19968,29184,35968,58368
Z:99,198,306,612,1224,1584,3168,4896,9792,19584,25344,50688
Ответы:
Желе ,
54 43 4241 байт-1 байт благодаря Эрику Аутгольферу (перенести транспонирование в повторяющуюся цепь)
Монадическая ссылка, берущая двумерный массив целых чисел (
1
s и0
s) и возвращающая строчную буквуoiszljt
для соответствующего tetromino или,w
если она недействительна.Попробуйте онлайн! или посмотрите набор тестов .
Также см. Эту программу, которая перечисляет все 1820 возможных двумерных двоичных массивов с точно установленными четырьмя битами вместе с их выходами, отсортированными по этим выходам.
Как?
Это сначала берет все четыре вращения входа. Затем он сдвигает установленные биты каждого из них вправо, а затем как можно ниже, и преобразует результаты в двоичные числа. Затем он ищет минимальный результат в списке минимальных таких представлений каждого действительного тетромино и использует уменьшенный результат для индексации в два сцепленных словарных слова
zoist
+jowl
, получая результат,w
когда совпадение не найдено.Предыдущий метод (54 байта)
Монадическая ссылка, берущая двумерный массив целых чисел (
1
s и0
s) и возвращающая строчную буквуoiszljt
для соответствующего tetromino или,w
если она недействительна.Попробуйте онлайн!
При этом проверяется наличие как минимум трех пустых строк (строк + столбцов) и того, что определенные последовательности битов не присутствуют ни в одной строке (в частности, числа 5, 9, 10, 11 и 13), что вместе гарантирует, что следующий шаг не приведет к ложные срабатывания. Затем он выравнивает, а затем сдвигает по полу двоичное число (чередуя конечные нули перед преобразованием) каждого из четырех поворотов и ищет минимальный результат в списке чисел, используя уменьшенный результат для индексации в двух составных словарных словах.
zoist
+jowl
, уступая,w
когда не найдено ни одного совпадения.источник
zoistjowl
в противном случае, обычно не подходит для строки, в противном случае: p)...Ṁị“LZOISTJW
любом случае сохраняет только один байт )ZU$3С
: pPython 3 , 124 байта
Попробуйте онлайн!
Ожидается целое число n, представляющее двоичную матрицу 4 × 4. Выдает, если тетромино не найдено.
Линия 2 перемещает форму вправо, пока 1 не окажется в крайнем правом столбце. (4369
0001 0001 0001 0001
в двоичном виде.) Линия 3 понижает форму, пока 1 не окажется в нижнем ряду. Вместе это превращается, например:Затем мы ищем индекс
n
в этом списке:Каждый столбец индексов, эквивалентных по модулю 7, соответствует форме тетромино. 64 (
@
) используется как значение заполнения, так какn
в этот момент в коде не может быть 64.NB. Исключение выдается для ввода
0
путем вычисленияn/n
вместо1
.источник
print("ÿ")
, байты , которые получают письменные естьc3 bf 0a
, а неff 0a
, и изображения PPM превращается в мусор.APL (Dyalog) ,
9594938987 байт-2 благодаря Захари
Требуется
⎕IO←0
по умолчанию во многих системах. Принимает булеву матрицу (любой формы!) В качестве аргумента. Ничего не возвращает, если заданное количество битов не равно четырем, и пустая строка, если четыре заданных бита не образуют тетромино.Попробуйте онлайн!
Работает, создавая все четыре вращения входа, а затем ищет каждое тетромино в каждом вращении.
{
…}
Анонимная функция, в которой аргумент представлен⍵
:,⍵
рассуждать+/
подвести итог4=
четыре равны этому?:
если так, то (иначе ничего не вернуть):⍳4
Первые четыре ɩ ndices;[0,1,2,3]
⍵∘{
…}¨
Применить следующую функцию к каждому, используя ввод как фиксированный левый аргумент⍺
левый аргумент т.е. вход⊢⍺
дать это (отделяется⍵
от⍺
)⌽∘⍉⍣⍵
отразить и переставить (т.е. повернуть на 90 °)⍵
раз(
…)∘.⍷
Внешний «продукт», но с использованием Find *, следующего списка и поворотов:3↑1
взять три элемента из одного, дополнив нулями;[1,0,0]
K←
сохранить это какK
⍪
таблица (превратить в вектор-столбец);[[1],[0],[0]]
1,
добавить один;[[1,1],[1,0],[1,0]]
( "J")J←
хранить какJ
(
…)⊖¨⊂
Поверните весь J вертикально, каждый из следующих шагов:⍳3
Первые три ɩ ntegers;[0,1,2]
у нас есть
[[[1,1],[1,0],[1,0]],[[1,0],[1,0],[1,1]],[[1,0],[1,1],[1,0]]]
(«J», «L», «T»)(
…),
Добавьте следующий список:2⊖J
повернитеJ
два шага вертикально;[[1,0],[1,1],[1,0]]
( "Т")K⌽
поверните строки этого на 1, 0 и 0 шагов соответственно;[[0,1],[1,1],[1,0]]
( "Z")0 1⌽¨⊂
вращать весь массив вертикально, не раз и не один раз;[[[0,1],[1,1],[1,0]],[[1,0],[1,1],[0,1]]]
("Z", "S")(
…),
Добавьте следующий список:(2 2)4⍴¨1
преобразовать единицу в каждую из матрицы 2 × 2 и списка из 4 элементов;[[[1,1],[1,1]],[1,1,1,1]]
(«О», «Я»)1∊¨
для каждого один член?∨/
горизонтальное уменьшение ИЛИ (то есть поперек поворотов; один логический для каждой фигуры)'OIZSLJT'/⍨
используйте это для фильтрации строки* Find возвращает логический массив той же формы, что и его правый аргумент, с указанием левого верхнего угла всех подмассивов, идентичных левому аргументу.
источник
{4=+/,⍵:'OIZSJLT'/⍨∨/1∊¨(((2 2)4⍴¨1),(0 1⌽¨⊂K⌽2⊖J),(⍳3)⊖¨⊂J←1,⍪K←3↑1)∘.⍷⍵∘{⌽∘⍉⍣⍵⊢⍺}¨⍳4}
JavaScript (ES6),
242212172164 байтаПредполагалось, что это просто для того, чтобы сдвинуться с мертвой точки, но я немного опаздываю на это
Принимает строку битов со строками, разделенными символом
0
s ('0001000110001000000'
представляющими0001 0011 0010 0000
), и возвращает массив, содержащий символ, представляющий тетромино, или массив, не содержащий ничего.Это работает путем проверки каждого поворота тетромино, чтобы увидеть, содержит ли вход в любой точке тетромино, полностью окруженный нулями с обеих сторон. Каждое тетромино представлено одним или несколькими двоичными числами:
Таким образом, чтобы проверить, содержит ли вход S tetromino, мы просто проверяем, содержит ли он двоичное представление одного
51
или2145
только0
с s с каждой стороны.Некоторые из тетромино имеют 4 ориентации. Если вы посмотрите на двоичные их представления, у каждого есть 2 представления, которые являются просто зеркалом двух других. Чтобы сэкономить пространство, двоичное представление создается вперед и назад одновременно с рекурсивной
C
функцией, что позволяет нам вводить только две ориентации и подразумевать две другие.Альтернативный подход с помощью кодов:
источник
Сетчатка , 125 байт
Попробуйте онлайн! Ссылка включает в себя контрольные примеры плюс заголовок для преобразования из целых чисел в матрицу 4 × 4. Объяснение:
Удалить ввод, если он содержит 5
1
с.Проверьте все вращения входа (см. Ниже). Если вход содержит четыре последовательных
1
с, этоI
.Если он содержит три последовательных
1
s плюс a1
на следующей строке под одним из трех, сопоставьте число промежуточных символов с соответствующей буквой результата.Аналогично для двух смежных
1
s, смежных с двумя смежными1
s на следующей строке.Но также ведите подсчет количества вращений, используя в противном случае неиспользованные
0
s.И сдавайтесь, если было выполнено слишком много вращений.
Транспонировать и перевернуть массив, таким образом вращая его.
источник
MATL , 60 байт
Ввод - это двоичный массив 4 × 4 (матрица), использующий в
;
качестве разделителя строк. Ouput это буква или пусто для тетромино.Попробуйте онлайн! Или проверьте все контрольные примеры (к выводу добавлена точка, позволяющая идентифицировать пустой результат).
объяснение
Код строит 4 поворота входного массива 4 × 4 с шагом 90 градусов. Каждый повернутый массив дополняется 2 нулями вверх и вниз, что превращает его в массив 8 × 4. 4 массива вертикально объединены в массив 32 × 4. Четыре повернутых массива в этом объединенном массиве «изолированы» благодаря заполнению нулями.
Каждый из 7 возможных шаблонов проверяется, чтобы увидеть, присутствует ли он в массиве 32 × 4. Для этого используется цикл. Каждый шаблон определяется двумя числами, которые в двоичном виде дают соответствующую маску 0/1. Например, число
3
,6
определяет форму «S».7 наборов из 2 чисел расположены в матрице 2 × 7, из которой цикл будет последовательно выбирать каждый столбец. Матрица определяется путем помещения всех чисел в стек, связывания их в вектор и преобразования в двухрядную матрицу. Поскольку форма «I» определяется числом 15, за которым следует 0, размещение в конце позволяет неявно заполнять 0 функцией преобразования.
Затем маска дополняется 3 нулями в четырех направлениях. Это необходимо для обнаружения нежелательных значений на входе.
Чтобы увидеть, присутствует ли маска в массиве 32 × 4, последний преобразуется в биполярную форму (т.е. -1/1 вместо 0/1) и сворачивается с маской. Поскольку маска имеет 4 единицы, сопоставление происходит, если какая-либо запись в результате свертки равна 4.
В конце цикла было получено 7 ложных / истинных результатов, максимум один из которых является правдивым. Это используется для индексации в строку, содержащую возможные выходные буквы.
источник
Желе , 53 байта
Попробуйте онлайн!
Полная программа. Занимает 4х4. Печатает,
m
если не тетромино, в противном случае печатает строчные.источник
Perl 5 , 197 + 1 (-p) = 198 байт
Попробуйте онлайн!
Принимает 16-битную строку в качестве ввода. Ничего не выводится, если на входе нет одного тетромино.
Как?
Две замены «перемещают» входную форму в нижний правый угол. Результирующая битовая строка преобразуется в целое число, а затем проверяется на хэш допустимых целых чисел.
источник
APL (Dyalog) , 66 байт
{'TIOJSLZ-'[(¯51 144 64,,∘+⍨12J96 ¯48J64)⍳×/(+/-4×⊢)⍵/,0j1⊥¨⍳4 4]}
Попробуйте онлайн!
Аргумент является логическим вектором.
Вычисляет расстояния между точками со знаком и их центром тяжести в виде комплексных чисел (действительная и мнимая части - ∆x, ∆y) и умножает комплексные числа вместе. Это оказывается достаточно хорошим инвариантом, чтобы различать тетромино.
источник