Нарисуйте контурный график ASCII


11

Рассмотрим следующие блоки 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

.............|.......
.............|.......
.............|.......
.............|.......
.............|.......
.............|.......
.............|.......
.............|.......
.............|.......
............/........
.....................
.........../.........
........./...........
.....................
......../../\........
....../../....\......
...............---...
...../../.........\..
.....\/............|.
...................|.
...................|.
....................\
.....................
.....................

счет

Это код гольф; выигрывает самый короткий код в байтах. Применяются стандартные лазейки.



1
Разве в последнем тесте не должно быть еще 3 ведущих линий вертикальных полос?
Дзайма

да, исправлено Благодаря!
helloworld922

Должен был использовать шестнадцатеричный ввод.
Волшебная Урна Осьминога

Ответы:


2

Mathematica, 353 326 байт

s=Table[".",3,3];z=Reverse;l@0=l@15=s;y=s;y[[3,1]]="\\";l@1=l@14=y;y=s;y[[3,3]]="/";l@2=l@13=y;y=s;y[[2,All]]="-";l@3=l@12=y;y=l@4=l@11=z/@z@l@1;y[[3,1]]="\\";l@10=y;y=s;y[[All,2]]="|";l@6=l@9=y;y=l@7=l@8=z/@z@l@2;y[[3,3]]="/";l@5=y;StringReplace[ToString@Grid@Map[Column,Map[StringJoin,Map[l,#,{2}],{3}],{2}],{"\n\n"->"\n"}]&


вход

[{{15, 13, 12, 14, 15}, {13, 8, 0, 4, 14}, {11, 1, 0, 2, 7}, {15, 11, 3, 7, 15}} ]


Впечатляет, трудно сделать это в Mathematica.
Волшебная Урна Осьминога

2

JavaScript (ES6), 195 байт

a=>a.map((r,y)=>r.map((i,x)=>[...s='76843210_'].map((_,j)=>(o[Y=y*3+j/3|0]=o[Y]||[])[x*3+j%3]='.\\/-\\/|/\\'[[0,64,256,56,4,257,146,1,68][k=s[i-8]||i]>>j&1&&k])),o=[])&&o.map(r=>r.join``).join`
`

Контрольные примеры


2

Mathematica, 173 байта

StringRiffle[ArrayFlatten[ReplacePart[Table[".",16,3,3],{{2|11|15,3,1}|{5|11|12,1,3}->"\\",{3|6|14,3,3}|{6|8|9,1,1}->"/",{4|13,2,_}->"-",{7|10,_,2}->"|"}][[#]]&/@#],"\n",""]&

Попробуйте в песочнице 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существует!)

Возможно, что это можно сделать за меньшее количество байтов, сделав квадраты умнее, а не просто закодировав их, но это потребует гораздо больших усилий ...


@Jenny_mathy: отредактировано - это то, что вы хотели?
Не дерево

@ Jenny_mathy, похоже, работает на меня. Я использую 1-индексирование, поэтому вам нужно добавить 1 к каждому номеру; контрольный пример становится {{16,14,13,15,16},{14,9,1,5,15},{12,2,1,3,8},{16,12,4,8,16}}. Если вы попробовали это, и это все еще не работает, не могли бы вы сказать мне, с какой проблемой вы столкнулись?
Не дерево

2

Сетчатка , 165 байт

T`d`L`1\d
 |\bB\B

.+
X$&¶Y$&¶Z$&
%{`[XYZ]$

([XYZ])[69]
.|.$1
X[^4-B]
...X
X[4AB]
..\X
X[578]
/..X
Y[^369C]
...Y
Y[3C]
---Y
Z[03478BCF]
...Z
Z[1AE]
\..Z
Z[25D]
../Z

Попробуйте онлайн! Ссылка включает в себя второй пример. Объяснение: Первые два этапа преобразуются из десятичного в шестнадцатеричное, что позволяет удалить пробелы. Затем третий этап дублирует каждую строку, давая каждой новой строке отдельный маркер. Эти маркеры затем пересекают шестнадцатеричные цифры, преобразовывая их в контурный график по мере их продвижения, пока не достигнут конца линии, после чего они удаляются.


1

Python 2 , 247 байт

J='...'
print'\n'.join(map(''.join,sum([[sum([f[i*3:][:3]for i in j],[])for f in map(list,[J*4+'..\\/...|./../...|...\\..\\'+J*4,J*3+'---.......|........|.......---'+J*3,'...\\..../......../.|........|.\\'+J*3+'./\\.....'])]for j in input()],[])))

Попробуйте онлайн!

-1 байт благодаря LeakyNun


Обратите внимание, что 10 и 5 разные.
Утренняя монахиня

@ LeakyNun вздохнул, я знал, что должен что-то испортить . Удаление, пока я не исправлю это, может быть, к завтрашнему дню.
HyperNeutrino

@LeakyNun Я исправил код, хотя теперь он стал очень уродливым и неуклюжим.
HyperNeutrino

1

SOGL V0.12 , 106 89 байт

žj}² ³
ē0=?²
{ā;{"⁰9═‼pnk№Ο|╚φ;“2─6nwEX .9*3n²Xƨ.ƨ-¹╬-}²X"č7_#‘3n}² /33³\13³\31³/11žj}┼}O

Попробуй здесь! (он имеет дополнительный байт для простоты ввода. В противном случае можно ожидать, что массив уже находится в стеке)


Пожалуйста, сделайте так, чтобы интерпретатор SOGL использовал моноширинный шрифт>. <
HyperNeutrino

10 слешей шире 10 периодов.
HyperNeutrino,

1

Python 2, 196 191 181 176 байт

Попробуйте онлайн!

Функция, которая принимает массив массивов целых и возвращает строку:

J=''.join;N='\n'.join
f=lambda I:N(N(J(J('\/|-.'[C/16-2]*(C%16)for C in map(ord,'o!j1cSe!f1g1aAbAbAa1h1iAbAbAc!c!d!iSk1f!k'))[c*9+3*j:][:3]for c in r)for j in[0,1,2])for r in I)

РЕДАКТИРОВАТЬ: сохранить 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] за печатный символ.

Ничего особенно умного после этого ...


1

05AB1E , 61 байт

v•2mßklJFΘõÿ|åU‚ιØØ•6B5¡∊¶¡110bTǝ.BJ3ô3ôyèøJ»}»4ÝJð«"\./-|."‡

Попробуйте онлайн!


Первая половина шаблона может быть сжата как:

5
11111105
1111111125
1113335
1105
2111111125
141141145
25

Вторая половина должна быть:

25
141141145
11011105
1105
1113335
1111111125
11111105
5

Мы можем просто вертикально отразить первую половину и вставить binary 110 (1101110)для 2111111125.


Затем мы берем этот шаблон и разбиваем на пять, а затем добавляем его:

1 = 111111111
2 = 111111011
3 = 111111112
4 = 111333111
5 = 110111111
6 = 211111112
7 = 141141141
8 = 211111111
9 = 141141141
A = 110111011
B = 110111111
C = 111333111
D = 111111112
E = 111111111

Теперь у нас есть наши строительные блоки, последние части просто заменяют записи матрицы соответствующими строительными блоками, склеивают строки и печатают пользователю замененные символы:

0 = .........
1 = ......\..
2 = ......../
3 = ...---...
4 = ..\......
5 = /......./
6 = .|..|..|.
7 = /........
8 = /........
9 = .|..|..|.
A = ..\...\..
B = ..\......
C = ...---...
D = ......../
E = .........

Могу опубликовать официальное объяснение операции, если кто-то хочет, спасибо.


1

Желе , 64 байта

“¡_ḟ5⁸ṫ⁺Y"⁷ƘzƬɼ¥@TR/ṖQ½3yİ>ẎḄT¥⁹iḟQ¬Ɠl¹µŒ’ṃ“/-\|.”s3s3ṙ9ị@³ZY$€Y

Попробуйте онлайн!

Это использует простое сжатие и, вероятно, может сэкономить много байтов с кодированием длины строки.

Как это работает

“¡_ḟ5⁸ṫ⁺Y"⁷ƘzƬɼ¥@TR/ṖQ½3yİ>ẎḄT¥⁹iḟQ¬Ɠl¹µŒ’ṃ“/-\|.”s3s3ṙ9ị@³ZY$€Y
“¡_ḟ5⁸ṫ⁺Y"⁷ƘzƬɼ¥@TR/ṖQ½3yİ>ẎḄT¥⁹iḟQ¬Ɠl¹µŒ’ encodes the integer 4591777158889232952973696500124538798606476761349931038636020730336909822188496590423586252520
ṃ“/-\|.”                   - convert to base 5 and index into the string to get "/......../.........|..|..|...\...\....\.........---.........../......\.................\........../...---.....\....../......./.|..|..|."
        s3s3               - split every 9 characters into a 3x3 square submatrix       
            ṙ9             - rotate left by 9 to line up the submatrix for 1 with index 1
              ị@³          - index the input into this
                 ZY$€Y     - format
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.