Намалюйте контурний графік ASCII


11

Розглянемо наступні блоки 3x3, які алгоритм маршируючих квадратів ідентифікував би для кожної комірки (з позначенням на основі 0, позначеним ідентифікатором):

0:
...
...
...

1:
...
...
\..

2:
...
...
../

3:
...
---
...

4:
..\
...
...

5:
/..
...
../

6:
.|.
.|.
.|.

7:
/..
...
...

8:
/..
...
...

9:
.|.
.|.
.|.

10:
..\
...
\..

11:
..\
...
...

12:
...
---
...

13:
...
...
../

14:
...
...
\..

15:
...
...
...

Мета цієї задачі - 2D матриця блоків ідентифікаторів, намалювати повний контурний графік, з'єднавши ці менші комірки разом. Зауважте, що є кілька повторних випадків (наприклад: 0 і 15 візуально однакові)

Вхідні дані

Ваша програма / функція повинна приймати як вхід 2D прямокутну матрицю цілих чисел у діапазоні [0+a,15+a](де aдовільне цілочисельне зсув на ваш вибір; це дозволяє використовувати нульову індексацію або індексацію на основі 1 для блоків). Це може бути з будь-якого потрібного джерела (stdin, параметр функції тощо).

Вихідні дані

Ваша програма / функція повинна виводити один рядок, що представляє повний контурний графік. Не повинно бути зайвих проміжних / кінцевих пробілів, але дозволена одна затримка нового рядка. Не повинно бути розділення між сусідніми блоками вертикально або горизонтально.

Зверніть увагу, що вам не доведеться робити якісь спеціальні обробки для блоків, які відображають на "сідло"; просто намалюйте блок із заданим ідентифікатором як є.

Вихід може бути для будь-якої потрібної раковини (stdout, значення повернення тощо)

Приклади

Усі приклади нижче використовують ідентифікатори блоків на основі 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 провідні лінії вертикальних брусків?
dzaima

так, виправлено. Дякую!
helloworld922

Потрібно було використовувати шістнадцятковий вхід.
Чарівна восьминога урна

Відповіді:


2

Математика, 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

Математика, 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 - складіть шістнадцять квадратів, взявши сітку 3х3 "."і замінивши деякі символи, а потім зшийте квадрати разом, але використовуючи для цього трохи коротші функції. (Дякую алефальфі, що нагадав мені, що 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 різні.
Leaky Nun

@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 використовувати шрифт monospace>. <
HyperNeutrino

10 косої риски ширше, ніж на 10 періодів.
HyperNeutrino

1

Пітон 2, 196 191 181 176 байт

Спробуйте в Інтернеті!

Функція, яка приймає масив масивів ints і повертає рядок:

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)

EDIT: збережено 5 байт шляхом призначення J, N; ще 10 байт, тому що я забув, що вхід вважається масивом масивів ints; а потім ще 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.