Gambarlah plot kontur ASCII

11

Pertimbangkan blok 3x3 berikut yang akan diidentifikasi algoritma kotak marching untuk setiap sel (dengan ID berlabel berbasis-0):

0:
...
...
...

1:
...
...
\..

2:
...
...
../

3:
...
---
...

4:
..\
...
...

5:
/..
...
../

6:
.|.
.|.
.|.

7:
/..
...
...

8:
/..
...
...

9:
.|.
.|.
.|.

10:
..\
...
\..

11:
..\
...
...

12:
...
---
...

13:
...
...
../

14:
...
...
\..

15:
...
...
...

Tujuan dari tantangan ini adalah memberikan matriks 2D dari blok ID, menggambar plot kontur penuh dengan menggabungkan sel-sel yang lebih kecil ini. Perhatikan bahwa ada beberapa kasus berulang (mis .: 0 dan 15 secara visual sama)

Memasukkan

Program / fungsi Anda harus mengambil sebagai input matriks persegi panjang 2D bilangan bulat dalam rentang [0+a,15+a](di mana apergeseran bilangan bulat sewenang-wenang pilihan Anda; ini memungkinkan Anda untuk menggunakan pengindeksan berbasis nol atau pengindeksan berbasis 1 untuk blok). Ini mungkin dari sumber yang diinginkan (stdin, parameter fungsi, dll.).

Keluaran

Program / fungsi Anda harus menampilkan string tunggal yang mewakili plot kontur penuh. Seharusnya tidak ada spasi tambahan spasi jejak / jejak tambahan, tetapi baris baru trailing diizinkan. Seharusnya tidak ada pemisahan antara blok yang berdekatan secara vertikal atau horizontal.

Perhatikan bahwa Anda tidak harus melakukan perlakuan khusus apa pun untuk blok yang memetakan "pelana"; hanya menggambar blok dengan ID yang diberikan apa adanya.

Outputnya mungkin untuk setiap wastafel yang diinginkan (stdout, nilai pengembalian, dll.)

Contohnya

Semua contoh di bawah ini menggunakan ID blok berbasis 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

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

Mencetak gol

Ini adalah kode golf; kode terpendek dalam byte menang. Celah standar berlaku.

helloworld922
sumber
Terkait
Martin Ender
1
Tidakkah seharusnya test case terakhir memiliki 3 garis utama dari bar vertikal?
dzaima
ya, sudah diperbaiki. Terima kasih!
helloworld922
Seharusnya sudah menggunakan input hexidecimal.
Magic Octopus Guci
Menangis secara internal.
Magic Gurita Guci

Jawaban:

2

Mathematica, 353 326 byte

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"}]&


memasukkan

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

J42161217
sumber
Mengesankan, sulit untuk melakukan ini di Mathematica.
Guci Gurita Ajaib
2

JavaScript (ES6), 195 byte

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`
`

Uji kasus

Arnauld
sumber
2

Mathematica, 173 byte

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",""]&

Cobalah di kotak pasir Wolfram!

" \n" Harus diganti dengan baris baru yang sebenarnya. Input diindeks 1 - sebagai contoh, test case ketiga menjadi {{13,13,13,9,5},{1,1,1,1,3},{1,1,1,3,8},{1,3,4,8,16}}. Outputnya adalah string.

Idenya pada dasarnya sama dengan jawaban Jenny_mathy - buat enam belas kotak dengan mengambil kotak 3x3 "."dan mengganti beberapa karakter, lalu jahit kotak-kotak bersama - tetapi menggunakan fungsi yang sedikit lebih pendek untuk melakukannya. (Terima kasih kepada alephalpha untuk mengingatkan saya bahwa ArrayFlattenada!)

Mungkin saja ini dapat dilakukan dalam lebih sedikit byte dengan membuat kuadrat secara cerdik alih-alih pada dasarnya meng-hardcoding mereka, tetapi itu akan membutuhkan lebih banyak usaha ...

Bukan pohon
sumber
@ Jenny_mathy: Diedit - apakah itu yang Anda inginkan?
Bukan pohon
@ Jenny_mathy, sepertinya itu bekerja untuk saya. Saya menggunakan 1-pengindeksan, jadi Anda perlu menambahkan 1 ke setiap nomor; kasus uji menjadi {{16,14,13,15,16},{14,9,1,5,15},{12,2,1,3,8},{16,12,4,8,16}}. Jika Anda mencobanya dan masih tidak berhasil, dapatkah Anda memberi tahu saya masalah apa yang Anda hadapi?
Bukan pohon
2

Retina , 165 byte

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

Cobalah online! Tautan termasuk contoh kedua. Penjelasan: Dua tahap pertama mengkonversi dari desimal ke heksadesimal, memungkinkan spasi untuk dihapus. Tahap ketiga kemudian rangkap tiga setiap baris, memberikan setiap baris baru penanda yang terpisah. Marker ini kemudian melintasi digit hex, mengonversinya menjadi plot kontur saat mereka pergi, sampai mereka mencapai ujung garis, di mana titik mereka dihapus.

Neil
sumber
1

Python 2 , 247 byte

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()],[])))

Cobalah online!

-1 byte terima kasih kepada LeakyNun

HyperNeutrino
sumber
Harap dicatat bahwa 10 dan 5 berbeda.
Leaky Nun
@ LeakyNun menghela nafas aku tahu aku harus mengacaukan sesuatu. Menghapus sampai saya memperbaikinya, mungkin besok.
HyperNeutrino
@ LeakyNun Saya telah memperbaiki kodenya, meskipun sekarang ini menjadi sangat jelek dan tidak menarik.
HyperNeutrino
1

SOGL V0.12 , 106 89 byte

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

Coba Di Sini! (yang memiliki byte ekstra untuk kemudahan input. Jika tidak, diharapkan array sudah ada di stack)

dzaima
sumber
Silakan buat juru bahasa SOGL menggunakan font monospace>. <
HyperNeutrino
10 garis miring lebih lebar dari 10 periode.
HyperNeutrino
1

Python 2, 196 191 181 176 byte

Cobalah online!

Fungsi yang mengambil array array int dan mengembalikan string:

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: disimpan 5 byte dengan menetapkan J, N; 10 byte lainnya karena saya lupa input sudah dianggap array array ints; dan kemudian 5 byte lainnya disimpan oleh irisan yang lebih cerdas ...

String gabungan dari semua 16 sel 3x3 (144 byte, menghilangkan linebreak) di-run-length-encoded ke string 41 byte:

o!j1cSe!f1g1aAbAbAa1h1iAbAbAc!c!d!iSk1f!k

di mana setiap elemen RLE (cellType, length)dikodekan ke karakter chr(32+16*cellType+length)(berguna bahwa menjalankan maksimum adalah 15; dan yang ord(' ')==32dapat dibagi oleh 16). Saat decoding, kami menganggapnya '\/|-.'[cellType]sebagai karakter yang dapat dicetak.

Tidak ada yang pintar setelah itu ...

Chas Brown
sumber
1

05AB1E , 61 byte

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

Cobalah online!


Paruh pertama pola dapat dikompresi sebagai:

5
11111105
1111111125
1113335
1105
2111111125
141141145
25

Babak kedua harus:

25
141141145
11011105
1105
1113335
1111111125
11111105
5

Kami hanya dapat secara vertikal mencerminkan paruh pertama, dan masukkan binary 110 (1101110)untuk 2111111125.


Selanjutnya kita ambil pola ini dan membaginya menjadi lima, lalu padukan dengan yang berikut:

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

Sekarang kami memiliki blok bangunan kami, bagian terakhir hanya mengganti entri matriks dengan blok bangunan yang sesuai, zip bersama baris dan cetak ke pengguna dengan simbol yang diganti:

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

Dapat memposting penjelasan operasi formal jika ada yang menginginkannya, terima kasih.

Guci Gurita Ajaib
sumber
1

Jelly , 64 byte

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

Cobalah online!

Ini menggunakan kompresi naif dan mungkin bisa menyimpan banyak byte dengan pengkodean run-length.

Bagaimana itu bekerja

“¡_ḟ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
fireflame241
sumber