Рассмотрим следующие блоки 3x3, которые алгоритм идентифицирующих квадратов должен идентифицировать для каждой ячейки (с помеченным идентификатором на основе 0):
0:
...
...
...
1:
...
...
\..
2:
...
...
../
3:
...
---
...
4:
..\
...
...
5:
/..
...
../
6:
.|.
.|.
.|.
7:
/..
...
...
8:
/..
...
...
9:
.|.
.|.
.|.
10:
..\
...
\..
11:
..\
...
...
12:
...
---
...
13:
...
...
../
14:
...
...
\..
15:
...
...
...
Целью этой задачи является создание двумерной матрицы идентификаторов блоков, построение полного контурного графика путем объединения этих меньших ячеек. Обратите внимание, что есть несколько повторных случаев (например, 0 и 15 визуально совпадают)
вход
Ваша программа / функция должна принимать в качестве входных данных двумерную прямоугольную матрицу целых чисел в диапазоне [0+a,15+a]
(где a
произвольный целочисленный сдвиг по вашему выбору; это позволяет вам использовать индексацию на основе нуля или индексацию на основе 1 для блоков). Это может быть любой источник (стандартный, параметр функции и т. Д.).
Выход
Ваша программа / функция должна вывести единственную строку, представляющую полный контурный график. Не должно быть лишних пробелов в начале / конце, но допускается одиночный перевод строки. Не должно быть разделения между соседними блоками по вертикали или по горизонтали.
Обратите внимание, что вам не нужно выполнять какую-либо специальную обработку для блоков, которые отображаются в «седло»; просто нарисуйте блок с данным идентификатором как есть.
Выход может быть на любой желаемый приемник (стандартный вывод, возвращаемое значение и т. Д.)
Примеры
Во всех приведенных ниже примерах используются идентификаторы блоков на основе 0.
case 1:
2 1
4 8
......
......
../\..
..\/..
......
......
case 2:
15 13 12 14 15
13 8 0 4 14
11 1 0 2 7
15 11 3 7 15
...............
......---......
...../...\.....
.../.......\...
...............
../.........\..
..\........./..
...............
...\......./...
.....\.../.....
......---......
...............
case 3:
12 12 12 8 4
0 0 0 0 2
0 0 0 2 7
0 2 3 7 15
........./....\
---------......
...............
...............
...............
............../
............/..
...............
.........../...
........./.....
......---......
...../.........
case 4:
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
............
.........---
...\..../...
..\/...|./..
.......|....
...../.|....
/...|...\..\
....|.......
....|.\.....
............
---.........
...../\.....
case 5:
0 0 0 0 6 15 15
0 0 0 0 6 15 15
0 0 0 0 6 15 15
0 0 0 2 7 15 15
0 0 2 5 14 15 15
0 2 5 8 4 12 14
0 4 8 0 0 0 6
0 0 0 0 0 0 4
.............|.......
.............|.......
.............|.......
.............|.......
.............|.......
.............|.......
.............|.......
.............|.......
.............|.......
............/........
.....................
.........../.........
........./...........
.....................
......../../\........
....../../....\......
...............---...
...../../.........\..
.....\/............|.
...................|.
...................|.
....................\
.....................
.....................
счет
Это код гольф; выигрывает самый короткий код в байтах. Применяются стандартные лазейки.
Ответы:
Mathematica,
353326 байтвход
источник
JavaScript (ES6), 195 байт
Контрольные примеры
Показать фрагмент кода
источник
Mathematica, 173 байта
Попробуйте в песочнице Wolfram!
"
\n
" Должен быть заменен фактическим переводом строки. Ввод 1 индексируется - например, третий тестовый случай становится{{13,13,13,9,5},{1,1,1,1,3},{1,1,1,3,8},{1,3,4,8,16}}
. Выход представляет собой строку.Идея в основном такая же, как и в ответе Jenny_mathy - сделайте шестнадцать квадратов, взяв сетку 3x3
"."
s и заменив некоторые символы, затем соедините квадраты вместе, но используя для этого немного более короткие функции. (Спасибо алефальфе за напоминание о том, чтоArrayFlatten
существует!)Возможно, что это можно сделать за меньшее количество байтов, сделав квадраты умнее, а не просто закодировав их, но это потребует гораздо больших усилий ...
источник
{{16,14,13,15,16},{14,9,1,5,15},{12,2,1,3,8},{16,12,4,8,16}}
. Если вы попробовали это, и это все еще не работает, не могли бы вы сказать мне, с какой проблемой вы столкнулись?Сетчатка , 165 байт
Попробуйте онлайн! Ссылка включает в себя второй пример. Объяснение: Первые два этапа преобразуются из десятичного в шестнадцатеричное, что позволяет удалить пробелы. Затем третий этап дублирует каждую строку, давая каждой новой строке отдельный маркер. Эти маркеры затем пересекают шестнадцатеричные цифры, преобразовывая их в контурный график по мере их продвижения, пока не достигнут конца линии, после чего они удаляются.
источник
Python 2 , 247 байт
Попробуйте онлайн!
-1 байт благодаря LeakyNun
источник
SOGL V0.12 ,
10689 байтПопробуй здесь! (он имеет дополнительный байт
→
для простоты ввода. В противном случае можно ожидать, что массив уже находится в стеке)источник
Python 2,
196191181176 байтПопробуйте онлайн!
Функция, которая принимает массив массивов целых и возвращает строку:
РЕДАКТИРОВАТЬ: сохранить 5 байтов, присваивая J, N; еще 10 байтов, потому что я забыл, что входные данные уже считаются массивом массивов целых чисел; а затем еще 5 байтов, сэкономленных путем более умной нарезки ...
Конкатенированная строка из всех 16 ячеек 3x3 (144 байта, без разрывов строки) кодируется по длине серии в 41-байтовую строку:
o!j1cSe!f1g1aAbAbAa1h1iAbAbAc!c!d!iSk1f!k
где каждый элемент RLE
(cellType, length)
закодирован в символchr(32+16*cellType+length)
(удобно, что максимальный пробег равен 15;ord(' ')==32
это делится на 16). При декодировании мы берем'\/|-.'[cellType]
за печатный символ.Ничего особенно умного после этого ...
источник
05AB1E , 61 байт
Попробуйте онлайн!
Первая половина шаблона может быть сжата как:
Вторая половина должна быть:
Мы можем просто вертикально отразить первую половину и вставить
binary 110 (1101110)
для2111111125
.Затем мы берем этот шаблон и разбиваем на пять, а затем добавляем его:
Теперь у нас есть наши строительные блоки, последние части просто заменяют записи матрицы соответствующими строительными блоками, склеивают строки и печатают пользователю замененные символы:
Могу опубликовать официальное объяснение операции, если кто-то хочет, спасибо.
источник
Желе , 64 байта
Попробуйте онлайн!
Это использует простое сжатие и, вероятно, может сэкономить много байтов с кодированием длины строки.
Как это работает
источник