アドベントチャレンジ4:現在の組立ライン!


12

<<前 へ次へ>>

サンタはエルフが一晩盗んだプレゼントをすべて再生産することができました!今、彼はそれらをパッケージングのために組立ラインに送らなければなりません。彼は通常、組み立てラインを監視するカメラを持っています。エルフが良い仕事をしていることを確認するためと、組み立てラインの写真が広告ポスターできれいに見えるためです[引用が必要]

残念ながら、彼のカメラは壊れたので、彼はあなたに組立ラインがどのように見えるかについてのシミュレーションを引き出して欲しいと思っています!

組立ラインを最大限の効率で機能させ、エラーや故障のリスクを減らすために、現在のすべてのボックスは同じ幅になっているため、コンベアベルトに完全に収まります。

チャレンジ

寸法で表されたプレゼントのリストが与えられたら、すべてのプレゼントを含むコンベアベルトを出力します。

プレゼントは次のように描かれます。

  +----+
 /    /|
+----+ |
|    | +
|    |/
+----+

このプレゼントには幅1、高さ2、および長さ4があります。プラス記号は辺の長さにはカウントされないため、長さ4のプレゼントは実際には6桁にまたがっています。

すべてのプレゼントは、最も近い2つのキャラクターの間に1つのスペースを空けて隣り合わせに描かれます。つまり、現在のボックスにlength lとwidthがあるw場合、次の現在のボックスの左下l + w + 4隅は、前のボックスの左下隅のちょうど右側に位置するように、プレゼントの左下隅が間隔をあけられます。

存在するすべてのボックスが描画された後、最後の各行のボックス間のスペースwidth + 2をアンダースコアで置き換えることにより、コンベアベルトが描画されます。

現在の箱のための最終的な出力(l, w, h)のは、[(4, 1, 2), (8, 1, 3), (1, 1, 1)]次のようになります。

           +--------+
  +----+  /        /|
 /    /| +--------+ |   +-+
+----+ | |        | |  / /|
|    | +_|        | +_+-+ +
|    |/__|        |/__| |/
+----+___+--------+___+-+

フォーマット仕様

要素の1つがリスト全体で一貫している3つのタプルのリスト(幅)を選択するか、現在の幅に続いて長さを表す2タプルのリストを選択できます。各プレゼントの高さ。入力は任意の順序で適切な形式で取得できますが、プレゼントは入力として与えられたのと同じ順序で表示する必要があります。

ASCIIアートの適切な出力形式を選択できます(関数からの戻りを含む)。

テストケース

これらのテストケースは[(l, w, h), ...]形式として提供されます。

[(4, 1, 2), (8, 1, 3), (1, 1, 1)]:

           +--------+
  +----+  /        /|
 /    /| +--------+ |   +-+
+----+ | |        | |  / /|
|    | +_|        | +_+-+ +
|    |/__|        |/__| |/
+----+___+--------+___+-+

[(5, 3, 4), (8, 3, 1), (1, 3, 7)]:

                               +-+
                              / /|
                             / / |
    +-----+                 / /  |
   /     /|                +-+   |
  /     / |                | |   |
 /     /  |     +--------+ | |   |
+-----+   |    /        /| | |   |
|     |   +___/        / +_| |   +
|     |  /___/        / /__| |  /
|     | /___+--------+ /___| | /
|     |/____|        |/____| |/
+-----+_____+--------+_____+-+

[(0, 0, 0)] (this is the most interesting test case ever :P)

 ++
+++
++

[(8, 3, 0), (0, 3, 8)] (more zero cases)

                   ++
                  //|
                 // |
                //  |
               ++   |
               ||   |
               ||   |
               ||   |
    +--------+ ||   |
   /        /+_||   +
  /        //__||  /
 /        //___|| /
+--------+/____||/
+--------+_____++

ルール

  • 標準的な抜け穴が適用されます
  • これはなので、バイト単位の最短回答が勝ちます
  • 回答は受け付けられません

注:Advent Of Codeからこのチャレンジシリーズのインスピレーションを引き出しました。このサイトに所属していない

ここで最初のチャレンジの「リンク」セクションを見ると、シリーズのすべてのチャレンジのリストを見ることができます


@AdmBorkBork 全て本ボックスは同じ幅有する
エリックOutgolfer

1
炭がこれを破壊しない場合、私は何をするのかわかりません。
完全に人間

@totallyhuman実際、brainf ** kはこのチャレンジに勝ちます:P
HyperNeutrino

これらの質問すべてにインデックスを付けるために、メタに投稿できますか?
ラーメンシェフ

@RamenChef Hm良いアイデア。私はそれをするかもしれません:P
HyperNeutrino

回答:


4

96 81バイト

NθWS«→FυG↗→↙⁺²θ_≔I⪪ι υ≔⊟υπ≔§υ⁰ρ→↗G↑⊕π↗⊕θ→⊕ρ↓⊕π↙⊕θ ↑πP↗⊕θP←⊕ρ↓+↓πF²«↷⁴+ρ↷²+π↷¹+θ↶³

オンラインでお試しください!リンクは、コードの詳細バージョンです。入力は、最初の行の幅であり、その後、空白行で終わる次の行の他の寸法です。説明:

Nθ

幅を入力します。

WS«

空白行に達するまで残りの行をループします。

→FυG↗→↙⁺²θ_

プレゼントの間にベルトを描きます。u後でその上、このコードは一度実行させる、単一の要素で終わるながら変数は、したがって、最初のパスで何もしない空のリストに事前に定義されています。(を使用するifと、ゴルフが少なくなります。)

≔I⪪ι υ

スペースで寸法を分割し、整数にキャストして、に保存しますu

≔⊟υπ

最後の次元を削除して、に保存しpます。

≔§υ⁰ρ

最初の寸法をにコピーしますが、次のループでベルトが描画さrれるuように残します。

→↗G↑⊕π↗⊕θ→⊕ρ↓⊕π↙⊕θ 

ベルトが重なっている場合に備えて、プレゼントの内部を消去します。

↑πP↗⊕θP←⊕ρ↓+↓π

現在の内部線を描画します。

F²«↷⁴+ρ↷²+π↷¹+θ↶³

プレゼントの外側の半分を描き、残りの半分について繰り返します。


1

ピップ160 154バイト

153バイトのコード、+ 1 -lフラグ。

{YMX:_+B+3MUaRV$.({UwhlWg+^11{a<=h+w?J[sXa-haN[0hh+w]?'-XlWR'+sXlWR("/|"a<h)RV(("+|/"aCMw).sXw)@<MN[ah+w-awh]'_Xw-a+1|s]sXl+w+3}M,y}MUa)R`_ +`'_X#_<|:'_}

これは、を含むリストのリストを取得する関数です[width height length]オンラインでお試しください!

どうやって?

トップレベルの説明:

  • 1つのボックスを表す行のリストを返す関数を定義します
  • 指定された次元の各リストに関数をマッピングします
  • 結果の行のリストを項目ごとに連結します
  • アンダースコアが適切に動作するように、正規表現の置換で少し後処理を行う

コメントを残して、より詳細な説明を追加します。


0

Python 2、508バイト

def f(B):
 d=B[0][1]+2;H=max(B)[0]+d+1;W=sum(sum(b[1:])+3for b in B)+len(B);r=[[' ']*i+W*['_']for i in range(d)]+[W*[' ']for _ in' '*H];o=0
 for h,w,l in B:
	for i in range(w+2,1,-1):r[i-1][o+i-2:o+l+i]=[' ']*(l+2)+['/'];r[h+i][o+i-1]=r[h+i][o+l+i]='/'
	r[0][o:o+l+2]=r[h+1][o:o+l+2]=r[w+h+2][o+w+1:o+w+l+3]=['+']+['-']*l+['+']
	for i in range(1,h+1):m=min(i,w)-1;r[i][o:o+l+2+m]=['|']+[' ']*l+['|']+[' ']*m;r[i+w+1][o+l+w+2]='|'
	r[w+1][o+l+w+2]='+';o+=l+w+4
 for l in r[H-1::-1]:print''.join(l).rstrip('_')

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

のリストのリストを取ります [height, width, length]

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.