ASCII艺术3D StreetView


29

输入:

  1. 您会得到一系列整数(通过标准输入或提示输入)。
  2. 此系列中的每对整数代表建筑物的宽度[有效范围:1..10]和高度[有效范围:0..10]
  3. 假设输入格式正确。

样本输入(第二行仅用于演示目的):

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. 第一栋建筑前面有两个空格。

  3. 通过将WIDTH和HEIGHT应用于基础立方体的尺寸来渲染每个建筑物(请看提供的示例输出!)。供参考:从左到右“墙”的字符数(对于W> 1的建筑物):(W * 5)-(W-1)。

  4. 高度> 0的建筑物具有一扇门(由字符描绘,o位于“底”行的“左”墙的两个字符处)。

马路:

  1. 这条路由三部分组成,分别称为“顶部”,“中间”和“底部”。
  2. “顶部”部分和“底部”部分是相同的,只是“顶部”部分前面有两个空格。
  3. 中间部分前面有一个空格,由以下模式的重复组成:
    '-'
  4. 长度由合并建筑物的总宽度决定:道路最右边的部分与“最后”建筑物的“右”墙的位置相对应。

获奖者:

这是代码高尔夫球!获奖者是解决方案最短的合格参赛者(按源代码计数)。源必须仅由可打印的ASCII字符组成。玩得开心!

(随机)窗户,汽车或行人的虚构奖励积分。

如果规格不清楚,请随时发表评论!


@user未知:确实确实有一些小错字。现在应该修复,谢谢!
ChristopheD

允许尾随空格?您似乎在示例中有一些内容,所以我认为是的。
彼得·泰勒

@Peter Taylor:允许尾随空格。
ChristopheD

道路3,应该是'-  '(有两个空格)?编辑:啊,两个空格不显示:P。您可以显示多个空格,方法是使用ASCII 255(不间断空格,数字键盘上的ALT + 255),或者通过在此处复制和粘贴我的注释。Orr ...相反,您可以说这是重复的' - ':)
mellamokb

看起来高度有效范围实际上是[ 0 ..10]。另外,您but you must not enforce this在3)中是什么意思?IMO,如果可以提高您的分数,任何假设都可以被利用。因此,我可以编写在总宽度小于80的情况下才能起作用的代码,前提是我可以挤出较少的字符数。例如,将输出写入宽度为80的显示缓冲区阵列,这样在任何更大的总宽度上都会崩溃。如果您希望支持任何宽度,则不要给出假设-您不能同时使用:P
mellamokb'1

Answers:


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。尽管解决方案可能很短,但它们仍然保持着“可读性”,恕我直言。
ChristopheD

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非常好。解决方案看起来已经很不错了;-)
ChristopheD

2
在p + = j(@长行的结尾)处有一个丢失的空间。不知道您是否数过;-)
ChristopheD
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.