绘制ASCII轮廓图


11

考虑下面的3x3块,行进平方算法将为每个像元标识(带有从0开始的标记ID):

0:
...
...
...

1:
...
...
\..

2:
...
...
../

3:
...
---
...

4:
..\
...
...

5:
/..
...
../

6:
.|.
.|.
.|.

7:
/..
...
...

8:
/..
...
...

9:
.|.
.|.
.|.

10:
..\
...
\..

11:
..\
...
...

12:
...
---
...

13:
...
...
../

14:
...
...
\..

15:
...
...
...

这个挑战的目标是给块ID的二维矩阵,通过将这些较小的单元格拼接在一起绘制完整的轮廓图。请注意,有一些重复的情况(例如:0和15在视觉上是相同的)

输入值

您的程序/函数应将范围内整数的2D矩形矩阵作为输入[0+a,15+a](其中a您可以选择任意整数移位;这允许您对块使用从零开始的索引或从1开始的索引)。这可以来自任何所需的来源(stdin,函数参数等)。

输出量

您的程序/函数应输出代表完整轮廓图的单个字符串。不应有多余的前导/尾随空格,但只允许尾随换行符。垂直或水平相邻块之间不应有间隔。

注意,您不必对映射到“马鞍”的块进行任何特殊处理。只需按原样绘制具有给定ID的块即可。

输出可以是任何所需的接收器(stdout,返回值等)

例子

以下所有示例均使用基于0的块ID。

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

应该使用十六进制输入。
Magic Octopus Urn

Answers:


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中很难做到这一点。
Magic Octopus Urn

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 网格并替换一些字符,然后将这些正方形缝合在一起来形成16个正方形-但使用稍微短一些的函数即可。(感谢alephalpha提醒我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.12106个 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)

编辑:通过分配J,N保存5个字节;另外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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.