ASCIIアート3D StreetView


29

入力:

  1. 一連の整数を取得します(stdinまたはプロンプト経由で供給されます)。
  2. このシリーズの整数のペアはすべて、建物の幅[有効範囲:1..10]および高さ[有効範囲:0..10]を表します
  3. 入力が整形式であると想定します。

サンプル入力(2行目はデモのみを目的としています):

1 2 1 1 1 0 2 4 1 3 1 2 2 1
WHWHWHWHWHWHWH

対応するサンプル出力:

                 ______
               / ______ / |
              | | | __
              | | / __ / |
     __ | | | | __
   / __ / | | | | / __ / |  
  | | | __ | | | | | ______
  | | / __ / | | | | | / ______ / |
  | | | | _ | | | | | |
  | _o_ | _o_ | / __ | _o _____ | _o_ | _o_ | _o _____ | /
  -------------------------------------  
 -------------- 
-------------------------------------

ルール:

建物

  1. 基本的なビルディングブロックは次のようになります(1 W、1H)
   __
 / __ / | (ベースキューブは、この質問にあるものから借用しています:
| | | http://stackoverflow.com/questions/1609702/code-golf-playing-cubes)
| ___ | /
  1. 私たちのビューは(ahum)〜3Dなので、隣接する建物は他の建物の一部を隠す場合があります。建物は左から右へ「論理的に」レンダリングされます。

  2. 最初の建物の前には、左側に2つのスペースがあります。

  3. ベースキューブの寸法にWIDTHとHEIGHTを適用することにより、すべての建物をレンダリングします(サンプル出力をご覧ください!)。参考:左から右の「壁」までの文字数(W> 1の建物の場合):(W * 5)-(W-1)。

  4. 高さ> 0の建物には、ドアが1つあります(ドアはキャラクターによって描かれo、「下」列の「左」壁から2つのキャラクターにあります)。

道:

  1. 道路は、「トップ」、「ミドル」、「ボトム」と呼ぶ3つの部分で構成されています。
  2. 「上部」部分と「下部」部分は、「上部」部分の前に2つのスペースがあるという事実を除いて同一です。
  3. 中央部分の前には1つのスペースがあり、次のパターンの繰り返しで構成されています。
    '-'
  4. 長さは、結合された建物の合計幅によって決定されます。道路の右端の部分は、「最後の」建物の「右」の壁の位置に対応します。

受賞者:

これはコードゴルフです!勝者は、最短のソリューション(ソースコード数による)を獲得した資格のある競技者です。ソースは、印刷可能なASCII文字のみで構成されている必要があります。楽しむ!

(ランダムな)窓、車、または歩行者の想像上のボーナスポイント。

仕様が明確でない場合は、気軽にコメントしてください!


@user unknown:確かにルールに小さなタイプミスがありました。今すぐ修正する必要があります、ありがとう!
クリストフ

末尾の空白は許可されますか?あなたは例にいくつかあるようですので、私はそう思います。
ピーターテイラー

@Peter Taylor:末尾の空白は許可されます。
クリストフ

道路パート3は'-  '(2つのスペースがある)べきですか?編集:ああ、2つのスペースは表示されません:P。ASCII 255(改行なしスペース、テンキーのALT + 255)を使用するか、ここのコメントからコピーして貼り付けることにより、複数のスペースを表示できます。Orr ...あなたは代わりにそれを繰り返すだけだと言うことができます' - ':)
mellamokb

高さの有効範囲は実際には[ 0 ..10]のようです。またbut you must not enforce this、3)ではどういう意味ですか?IMO、あなたのスコアを増加させるならば、どんな仮定でも利用できます。したがって、より少ない文字数を絞り出すことができる場合、合計幅が80未満の場合にのみ機能するコードを書くことができます。たとえば、幅が80のディスプレイバッファー配列に出力を書き込むと、合計幅が大きくなるとクラッシュします。幅をサポートしたい場合は、仮定を与えないでください-両方を持つことはできません:P
mellamokb

回答:


10

Haskell、396文字

w&h=take h((3," /|"++(w-3)#'_'++"o_|"):c[(3,"| |"++(w-1)#s++"|")])++[(2,"|/ "++(w-2)#'_'++"/"),(0,"  "++(w-2)#'_')]++c[(0,w#s)]
p(w,h)=r.z take[sum w+k|k<-[1..]]$([c"-",s:c"-  ","  "++c"-"]++).map r.foldl(z(%))((2+maximum h)#(5#s))$z(&)w h
main=interact$unlines.p.q.map read.words;y%(d,x)=x++drop d y;q(x:y:z)=(4*x:a,2*y:b)where(a,b)=q z
q x=(x,x);(#)=replicate;c=cycle;r=reverse;z=zipWith;s=' '

出力例:

$ runghc Streetview.hs <<< "1 1 1 3 1 2 1 0 2 4 2 2 1 3 3 1"
                     ______                          
                   /______ /|                        
         __       |       | |        __              
       /__ /|     |       | |      /__ /|            
      |   | |__   |       | |_____|   | |            
      |   |/__ /| |       |/______|   | |            
     _|   |   | | |       |       |   | |__________  
   /__|   |   | | |       |       |   |/__________ /|
  |   |   |   | |_|       |       |   |           | |
  |_o_|_o_|_o_|/__|_o_____|_o_____|_o_|_o_________|/
  -------------------------------------------------
 -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
-------------------------------------------------

5
+1 codegolf.seでの最近のhaskellの投稿は、haskellについてもう少し学ぶことに興味を持ちました。解決策は短いかもしれませんが、それでもかなり「読みやすい」ままです。
クリストフ

8

Python、415文字

I=eval(raw_input().replace(' ',','))
X=I[::2]
Y=I[1::2]
W=4*sum(X)+6
H=2*max(Y)+2
A=W*H*[' ']
p=W*H-W+2
for w,h in zip(X,Y):i=2*h;j=4*w;q=p-i*W;r=p+j;s=q+j;A[p+1:q+1:-W]=A[p+2:q+2:-W]=i*' ';A[p:q:-W]=A[r:s:-W]=A[r+2-W:s+2-W:-W]=i*'|';A[p+1:r]='_'*(j-1);A[q+2:s]=A[q+3-W:s+1-W]='_'*(j-2);A[q+1]=A[s+1]=A[r+1]='/';A[p+2]='_o'[h>0]; p+=j
A[W-1::W]='\n'*H
D=(W-5)*'-'
print''.join(A)+'  '+D+'\n'+(' - '*W)[:W-4]+'\n'+D

スライスを使用して、建物のすべての部分を描画します。

$ echo "1 2 1 1 1 0 2 4 1 3 1 5 2 1" | ./streetview.py 
                             __          
                           /__ /|        
                 ______   |   | |        
               /______ /| |   | |        
              |       | |_|   | |        
              |       |/__|   | |        
     __       |       |   |   | |        
   /__ /|     |       |   |   | |        
  |   | |__   |       |   |   | |______  
  |   |/__ /| |       |   |   |/______ /|
  |   |   | |_|       |   |   |       | |
  |_o_|_o_|/__|_o_____|_o_|_o_|_o_____|/ 
  -------------------------------------
 -  -  -  -  -  -  -  -  -  -  -  -  -
-------------------------------------

+1とてもいい。ソリューションは既にかなりゴルフに見えます;
クリストフ

2
`p + = j`(@長い行の終わり)に1つの失われたスペースがあります。あなたがそれを数えたかどうかわからない;
クリストフ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.