自動ハウスビルダー


15

自動住宅建設用ナノボットが製造されており、それらをコーディングするのはあなたの仕事です。

これは入力によって作成された家です 7 4 2

  /-----/|
 /     / |
|-----|  |
|     |  |
|     | /
|_____|/

入力は、家の寸法を含む文字列です。

7 は幅です。

|_____|

---7---

4 高さです。

|
|
|
|

2 深さです

 / 
/

この入力が与えられたら、家を作成できますか?

コードは、ロボットに収まるようにできるだけ小さくする必要があります。

ノート

入力として与えられる最小寸法は3 2 2です。あなたのプログラムは、より小さい寸法で何でもできます3 2 2

テストケース

3 2 10

          /-/|
         / / |
        / / /
       / / /
      / / /
     / / /
    / / /
   / / /
  / / /
 / / /
|-| /
|_|/


それは立方体ではないので、私の質問は十分に別だと思います。ただし、文字を変更できます。

2
もっとテストケースをお願いします?
リーキー修道女

1
また、これはいい質問です。まだ持っていないと思います。
Rɪᴋᴇʀ

1
出力は何になり3 2 10ますか?
ダウンゴート

回答:


3

Python 2、128バイト

w,h,d=input();i=d
while-i<h:c='|/'[i>0];print' '*i+c+'- _'[(d>i!=0)+(h+i<2)]*(w-2)+c+' '*min(d-i,h-1,w+1,h-1+i)+'/|'[d-i<h];i-=1

行ごとに印刷します。行インデックスiはからdにカウントダウンし-h+1ます。


あなたは置き換えることにより、3つのバイトをトリミングすることができ' '*min(d-i,h-1,w+1,h-1+i)(' '*d)[max(0,i):h-1+i]
RootTwo

1

ルビー、145バイト

文字列のリストを返します。リストの各要素は行に対応しています。複数行の文字列を返す必要がある場合は、3バイトを追加して*$/、最後のブラケットの直前に追加します。

->w,h,d{s=' ';(0..m=d+h-1).map{|i|(i<d ?s*(d-i)+?/:?|)+(i<1||i==d ??-:i==m ??_ :s)*(w-2)+(i<d ? ?/:?|)+(i<h ?s*[i,d].min+?|:s*[m-i,h-1].min+?/)}}

1

JavaScript(ES6)、169バイト

(w,h,d)=>[...Array(d+h--)].map((_,i)=>` `[r=`repeat`](i<d&&d-i)+(c=`|/`[+(i<d)])+` _-`[i&&i-d?h+d-i?0:1:2][r](w-2)+c+` `[r]((i<d?i:d)-(i>h&&i-h))+`|/`[+(i>h)]).join`\n`

where \nはリテラルの改行文字を表します。説明:

(w,h,d,)=>                          Parameters
[...Array(d+h--)].map((_,i)=>       Loop over total height = d + h
 ` `[r=`repeat`](i<d&&d-i)+         Space before roof (if applicable)
 (c=`|/`[+(i<d)])+                  Left wall/roof edge
 ` _-`[i&&i-d?h+d-i?0:1:2][r](w-2)+ Space, floor or eaves between walls
 c+                                 Right wall/roof edge (same as left)
 ` `[r]((i<d?i:d)-(i>h&&i-h))+      Right wall
 `|/`[+(i>h)]                       Back wall/floor edge
).join`                             Join everything together
`

編集:@jrichのおかげで2バイト保存されました。


,r='repeat'前面から取り外して最初のもの[r]を置き換えてください[r='repeat']
-jrich

@jrichおかげで、私はもともと持っていたので,r=(n,c=` `)=>c.repeat(n)、タックを変更したとき、再配置の可能性を見落としていました。
ニール

1

パイソン224 301の 297バイト

(1x1x1を含むすべてのボックスで動作します)

l,w,h=input()
s,r,d,v,R,x=" "," - ","/","|",range,(l*3-1)
print s*(w+1)+r*l
for n in R(w):
    if n<h:e,c=v,n
    else:e,c=d,h
    print s*(w-n)+d+s*x+d+s*c+e
if h-w>=1:e,c=v,w
elif w>h:e,c=d,h
else:e,c=d,w
print s+r*l+s*c+e
for n in R(h):
    if h>w+n:e,c=v,w
    else:e,c=d,h-n-1
    print v+s*x+v+s*c+e
print r*l

説明:

3つの定数を取ります:l(長さ)、h(高さ)、w(幅)。

いくつかのサンプルボックスを見ると、間隔にパターンがあります。

3 x 4 x 3ボックスの場合、セクション間の間隔を表すために数字を使用します。

1234 -  -  - 
123/12345678/|
12/12345678/1|
1/12345678/12|
1 -  -  - 123|
|12345678|123/
|       8|12/
|       8|1/
|       8|/
 -  -  - 

上の行には4つのスペースがあるか、w + 1です。次の3行にはw-(1 * x)があります。Xはラインです。

これらは、すべてのボックスのすべての行にわたって続くパターンです。そのため、パターンに合わせてスペースの数を掛けて、この行ごとに簡単にプログラムできます。

これは、5 x 5 x2ボックスのサンプルです。

 123 -  -  -  -  -
 12/12345678912345/|
 1/              /1|
 1 -  -  -  -  - 12|
 |              |12|
 |              |12|
 |              |12|
 |              |1/
 |12345678912345|/
  -  -  -  -  -

おそらくゴルフを続けるべきです。
Rɪᴋᴇʀ

また、w,h,l=input()これを機能に割り当てるか、作成する必要があります。
Rɪᴋᴇʀ

プログラミングパズルとコードゴルフへようこそ!すべての提出は、STDINから読み取りSTDOUTに書き込む完全なプログラムか、引数を受け入れて値を返す関数である必要があります。また、投稿は、投稿時に勝つための真剣な候補者であることを要求します。つまり、コードゴルフでは、無料または一部無料のソリューションを許可しません。
アレックスA.

ここでこのコードを実行すると、出力に余分なスペースがあります。
DJMcMayhem

@DrGreenEg​​gsandHamDJそれを修正しました!h、w、およびlの特定のパターンを考慮していないため、ifステートメントをいくつか追加しました。
JoshK

0

パイソン3.5、328の 326 313 305 295 248バイト

三項ステートメントのサイズを小さくするためのヒントをくれたケビン・ラウに感謝します!

def s(w,h,d):R,M=range,max;S,V,L=' |/';O=w-2;D=d-M(0,d-h);Q=h-M(0,h-d);print('\n'.join([S*(d-i)+L+' -'[i<1]*O+L+S*[h-1,i][i<=D-1]+'/|'[i<=D-1]for i in R(D+M(0,d-h))]+[V+[' -'[i==h],'_'][i<2]*O+V+S*[i-1,d][i>Q]+'/|'[i>Q]for i in R(Q+M(0,h-d),0,-1)]))

入力を3つの整数としての順序で受け取りますwidth, height, depth。いつでもどこでもゴルフできます。

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

説明:

この説明の目的で、関数が引数を使用して実行されたと仮定します(3,2,3)。3は幅(w)、2は高さ(h)、3は深さ(d)です。そうは言っても、機能全体の主要部分を示すことから始めましょう。

'\n'.join([S*(d-i)+L+' -'[i<1]*O+L+S*[h-1,i][i<=D-1]+'/|'[i<=D-1]for i in R(D+M(0,d-h))]+[V+[' -'[i==h],'_'][i<2]*O+V+S*[i-1,d][i>Q]+'/|'[i>Q]for i in R(Q+M(0,h-d),0,-1)])

ここでは、「家」全体を構成する2つのリストが作成され、リテラルの改行(\n)で結合されます。それらをそれぞれリストaとリストと呼びb、それぞれを分析してみましょう。

  • リストaが作成される場所は次のとおりです。

    [S*(d-i)+L+' -'[i<1]*O+L+S*[h-1,i][i<=D-1]+'/|'[i<=D-1]for i in R(D+M(0,d-h))]
    

    このリストにdは、家の最初の行が含まれています。ここで、i範囲内の各数値である場合、負又はゼロ。最初に、スペースがリストに追加され、その後にaが続き、圧縮された条件ステートメントによって返されるものが何でも続きます。この条件ステートメントでは、スペースの数がifを返します。それ以外の場合は、同じ数が返されます。次に、これらの後に別の、次にスペースが続きます。スペースの数は、の有無に依存します。そうである場合、スペースが追加されます。それ以外の場合、スペースが追加されます。最後に、これはすべてのいずれかによってオフトッピングされまたは場所、場合に追加され、さもなければ、0=>(d-(d-h))+d-hd-h=0d-i/w-2i>1-/i<=d-(d-h)-1ih-1/||i<=d-(d-h)-1/追加されます。この3x2x3プリズムの場合、これはlistによって返されますa

          /-/|
         / / |
        / / /
    
  • リストbが作成される場所は次のとおりです。

    [V+[' -'[i==h],'_'][i<2]*O+V+S*[i-1,d][i>Q]+'/|'[i>Q]for i in R(Q+M(0,h-d),0,-1)]`
    

    このリストには、プリズムの残りの線が含まれています。このリストでは、i範囲内の各整数である場合、負又はゼロ。このリストを開始するには、これらの行は常にで始まるため、最初にa が追加されます。その後、いずれかの空間、またはか否かに応じて添加されますか、。の場合、a が追加されます。そうでなければ、あれば追加される、またはスペースがあれば追加されるか、または。この決定が行われた後、選択されたキャラクターの数が追加されます。この後、別の追加され、その後のいずれか、またはスペースの数が追加されます。の場合、その後(h-(h-d))+h-d=>0h-d=0||-_i=hi<2i<2_-i=hi>hi<hi>2w-2|i-1di>h-(h-d)dスペースの数が追加されます。それ以外の場合、i-1スペースの数が追加されます。最後に、これはすべてa |またはa /で終了します。a |がif i>h-(h-d)で追加されるか、a /がifで追加されますi<=h-(h-d)3x2x3プリズムの場合、リストbは以下を返します。

        |-| /
        |_|/
    

2つのリストが作成された後、それらを最終的にリテラルの改行(\n)で結合し'\n'.join()ます。これは完成したプリズムであり、この場合、次のようになります。

       /-/|
      / / |
     / / /
    |-| /
    |_|/

1
Pythonのブール値は整数に評価されます。つまり、ほとんどの3要素はのようなものに圧縮できます'-_'[f<2]。最後に、R=range;S,V,L=' |/'そのような状況では文字列が喜んで展開されるため、初期変数を割り当てるために機能します。
バリューインク

気にしないで、私は演算子がPythonに存在しないことを忘れていました...しかし、残りは動作するはずです!
バリューインク

@ KevinLau-notKennyうわー、ヒントをありがとう!:)三項表現がそのように表現できることは知りませんでした!
R.ガプス

内部の変数を変更しない限り、3項にこのトリックを使用できます。たとえば、との両方を変更a=1 if b<9 else c=5して[a=1,c=5][b<9]しまうため、として表現できません。PPCG Pythonゴルフのヒントページを次に示します。codegolf.stackexchange.com / questions / 54 / ac
Value Ink

あなたはまだそこに残っている三元を持ってい'_'if f<2else' -'[f==h]ます。ブール値は整数として評価されるため、この3項をgetに修正した他の3項に「連鎖」させることができ[' -'[f==h],'_'][f<2]ます。また、あなたはS,V,L=' |/'まだ私のヒントを使用していません。
バリューインク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.