ASCII等高線図を描く


11

マーチングスクエアアルゴリズムがすべてのセル(0ベースのラベル付きID)で識別する次の3x3ブロックを検討します。

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で、任意の整数シフトがあります。これにより、ブロックにゼロベースのインデックス付けまたは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

16進入力を使用する必要がありました。
魔法のタコUr

回答:


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で行うのは難しい。
魔法のタコUr

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から始まり、たとえば、3番目のテストケースはになり{{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

オンラインでお試しください!リンクには2番目の例が含まれています。説明:最初の2つのステージは10進数から16進数に変換され、スペースを削除できます。3番目の段階では、各行を3回複製し、新しい各行に個別のマーカーを付けます。次に、これらのマーカーは16進数をトラバースし、行の終わりに達するまで等高線図に変換しますが、その時点で削除されます。


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

オンラインでお試しください!

LeakyNunのおかげで-1バイト


10と5は異なることに注意してください。
リーキー修道女

@LeakyNun ため息をついた 明日までに修正するまで削除します。
ハイパーニュートリノ

@LeakyNunコードを修正しましたが、今では非常にくて手に負えなくなりました。
ハイパーニュートリノ

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ピリオドよりも広いです。
ハイパーニュートリノ

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バイトを節約しました。入力がすでにintの配列の配列であると想定されていたため、さらに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


次に、このパターンを取得して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.