J , 82 72 66 байт
(ucp' #───│┌┐┬│└┘┴│├┤┼'){~]+]*3 3((2#.1 7 3 5{,);._3)0,.~0,.0,~0,]
Входные данные являются булевой таблицей 1 и 0. Правила гласят, что каждый символ коробки считается одним байтом, а не тремя, и это было применено здесь.
использование
f =: (ucp' #───│┌┐┬│└┘┴│├┤┼'){~]+]*3 3((2#.1 7 3 5{,);._3)0,.~0,.0,~0,]
m =: 1 0 1 1 1 1 0 1 1 0 1 , 1 1 0 1 0 0 1 1 0 0 1 ,: 0 0 0 1 1 1 1 0 0 1 1
m { ' #'
# #### ## #
## # ## #
#### ##
f m
│ ─┬── ┌─ │
└─ │ ┌┘ │
└──┘ ─┘
' #' {~ m =: 5 5 $ 1
f m
┌┬┬┬┐
├┼┼┼┤
├┼┼┼┤
├┼┼┼┤
└┴┴┴┘
' #' {~ m =: 5 9 $ 1 0
# # # # #
# # # #
# # # # #
# # # #
# # # # #
f m
# # # # #
# # # #
# # # # #
# # # #
# # # # #
объяснение
Сначала ввод дополняется нулями со всех сторон.
] m =: 1 0 1 1 1 1 0 1 1 0 1 , 1 1 0 1 0 0 1 1 0 0 1 ,: 0 0 0 1 1 1 1 0 0 1 1
1 0 1 1 1 1 0 1 1 0 1
1 1 0 1 0 0 1 1 0 0 1
0 0 0 1 1 1 1 0 0 1 1
(0,.~0,.0,~0,]) m
0 0 0 0 0 0 0 0 0 0 0 0 0
0 1 0 1 1 1 1 0 1 1 0 1 0
0 1 1 0 1 0 0 1 1 0 0 1 0
0 0 0 0 1 1 1 1 0 0 1 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0
Затем выбирается каждый подмассив размером 3
3 3 <;._3 (0,.~0,.0,~0,]) m
┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
│0 0 0│0 0 0│0 0 0│0 0 0│0 0 0│0 0 0│0 0 0│0 0 0│0 0 0│0 0 0│0 0 0│
│0 1 0│1 0 1│0 1 1│1 1 1│1 1 1│1 1 0│1 0 1│0 1 1│1 1 0│1 0 1│0 1 0│
│0 1 1│1 1 0│1 0 1│0 1 0│1 0 0│0 0 1│0 1 1│1 1 0│1 0 0│0 0 1│0 1 0│
├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│0 1 0│1 0 1│0 1 1│1 1 1│1 1 1│1 1 0│1 0 1│0 1 1│1 1 0│1 0 1│0 1 0│
│0 1 1│1 1 0│1 0 1│0 1 0│1 0 0│0 0 1│0 1 1│1 1 0│1 0 0│0 0 1│0 1 0│
│0 0 0│0 0 0│0 0 1│0 1 1│1 1 1│1 1 1│1 1 0│1 0 0│0 0 1│0 1 1│1 1 0│
├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│0 1 1│1 1 0│1 0 1│0 1 0│1 0 0│0 0 1│0 1 1│1 1 0│1 0 0│0 0 1│0 1 0│
│0 0 0│0 0 0│0 0 1│0 1 1│1 1 1│1 1 1│1 1 0│1 0 0│0 0 1│0 1 1│1 1 0│
│0 0 0│0 0 0│0 0 0│0 0 0│0 0 0│0 0 0│0 0 0│0 0 0│0 0 0│0 0 0│0 0 0│
└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘
Тогда только 5 значений в каждом подмассиве рассматриваются
┌───┐
│xAx│
│CED│
│xBx│
└───┘
Значения ABCD
выбираются путем выравнивания каждого подмассива и выбора индексов 1 7 3 5
. Эти значения умножаются E
на индекс 4. Он затем преобразуется из списка двоичных цифр в десятичную и увеличивается на E
. Эти x
значения не нужны.
3 3 (4&{([+2#.*)1 7 3 5&{)@,;._3 (0,.~0,.0,~0,]) m
5 0 2 8 4 3 0 6 3 0 5
10 3 0 13 0 0 6 11 0 0 13
0 0 0 10 4 4 11 0 0 2 11
Это используется в качестве индекса для выбора персонажа для рисования в соответствии с таблицей ниже (немного переупорядочено для игры в гольф). Последний столбец сопоставляет выходное значение каждого подмассива с символом поля.
0 (space) 0
1 # 1
2 ┌ 6
3 ┬ 8
4 ┐ 7
5 ├ 14
6 ┼ 16
7 ┤ 15
8 └ 10
9 ┴ 12
10 ┘ 11
11 │ 5, 9, 13
12 ─ 2, 3, 4
Кроме того, в J строка ' #───│┌┐┬│└┘┴│├┤┼'
использует 8-битные символы, что делает ее длиной 47 (для каждого байта) для 17 необходимых символов. Команда ucp
преобразует его в 16-битные символы, что позволяет ему быть длиной 17.