ASCII 등고선 그리기


11

마칭 제곱 알고리즘 이 모든 셀에 대해 식별 할 수 있는 다음 3x3 블록을 고려하십시오 (0 기반 레이블이있는 ID).

0:
...
...
...

1:
...
...
\..

2:
...
...
../

3:
...
---
...

4:
..\
...
...

5:
/..
...
../

6:
.|.
.|.
.|.

7:
/..
...
...

8:
/..
...
...

9:
.|.
.|.
.|.

10:
..\
...
\..

11:
..\
...
...

12:
...
---
...

13:
...
...
../

14:
...
...
\..

15:
...
...
...

이 도전의 목표는 블록 ID의 2D 매트릭스가 주어지며, 작은 셀을 함께 묶어 전체 윤곽 플롯을 그립니다. 반복되는 사례가 있습니다 (예 : 0과 15는 시각적으로 동일합니다).

입력

프로그램 / 함수는 범위 내에서 정수의 2D 직사각형 행렬을 입력으로 가져와야합니다 [0+a,15+a](여기서 a임의의 정수 이동이 선택됩니다; 블록에 대해 0부터 시작하는 색인 ​​또는 1부터 시작하는 색인을 사용할 수 있습니다). 이것은 원하는 소스 (stdin, function parameter 등)에서 온 것일 수 있습니다.

산출

프로그램 / 함수는 전체 등고선도를 나타내는 단일 문자열을 출력해야합니다. 추가 선행 / 후행 공백이 없어야하지만 단일 후행 줄 바꿈이 허용됩니다. 수직 또는 수평으로 인접한 블록 사이에 간격이 없어야합니다.

"안장"에 매핑되는 블록에 대해서는 특별한 처리를 할 필요가 없습니다. 주어진 ID로 그대로 블록을 그립니다.

원하는 싱크로 출력 할 수 있습니다 (stdout, return value 등).

아래의 모든 예는 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

16 진수 입력을 사용해야합니다.
Magic Octopus Urn

답변:


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에서이 작업을 수행하기가 어렵습니다.
매직 문어 Urn

2

자바 스크립트 (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 격자를 가져 와서 "."일부 문자를 바꾼 다음 정사각형을 함께 연결 하여 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

온라인으로 사용해보십시오! 링크는 두 번째 예를 포함합니다. 설명 : 처음 두 단계는 10 진수에서 16 진수로 변환되어 공백을 삭제할 수 있습니다. 그런 다음 세 번째 단계는 각 줄을 세 번 반복하여 새 줄마다 별도의 마커를 제공합니다. 그런 다음이 마커는 16 진수를 가로 지르며 줄 끝에 도달 할 때까지 삭제되는 등고선 플롯으로 변환합니다.


1

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

온라인으로 사용해보십시오!

LeakyNun 덕분에 -1 바이트


10과 5가 다릅니다.
Leaky Nun

@LeakyNun 한숨을 쉬는 것은 내가 뭔가를 엉망으로 만들어야 한다는 것을 알았습니다. 내일 쯤이면 고칠 때까지 삭제합니다.
HyperNeutrino 2016 년

@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 2016 년

1

파이썬 2 196 191 181 176 바이트

온라인으로 사용해보십시오!

int 배열의 배열을 가져 와서 문자열을 반환하는 함수 :

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 바이트는 이미 int 배열의 배열이라고 가정합니다. 똑똑한 슬라이싱으로 5 바이트를 더 절약했습니다 ...

16 개의 3x3 셀 (144 바이트, 줄 바꿈 생략)의 연결된 문자열은 길이가 41 바이트 문자열로 인코딩됩니다.

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

여기서 각 RLE 요소 (cellType, length)는 문자로 인코딩됩니다 chr(32+16*cellType+length)(최대 실행이 15이고 ord(' ')==3216으로 나눌 수 있음). 디코딩 할 때 '\/|-.'[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.


다음으로이 패턴을 취해서 5로 나눈 다음 1로 채 웁니다.

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.