Chế độ xem 3D nghệ thuật ASCII


29

Đầu vào:

  1. Bạn nhận được một loạt các số nguyên (được cho ăn qua stdin hoặc dấu nhắc).
  2. Mỗi cặp số nguyên trong chuỗi này đại diện cho WIDTH của tòa nhà [phạm vi hợp lệ: 1..10] và HEIGHT [phạm vi hợp lệ: 0..10]
  3. Giả sử đầu vào được hình thành tốt.

Đầu vào mẫu (dòng thứ hai chỉ dành cho mục đích trình diễn):

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

Đầu ra mẫu tương ứng:

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

Quy tắc:

Những tòa nhà

  1. Một khối xây dựng cơ bản trông như thế này (1 W, 1H)
   __
 / __ / | (khối cơ sở được mượn từ một trong câu hỏi này:
| | | http://stackoverflow.com/questions/1609702/code-golf-playing-cubes)
| ___ | /
  1. Quan điểm của chúng tôi là (ahum) ~ 3D để các tòa nhà lân cận có thể che giấu các phần của người khác. Các tòa nhà được 'logic' hiển thị từ trái sang phải.

  2. Tòa nhà đầu tiên đi trước hai không gian bên trái.

  3. Bạn kết xuất mọi tòa nhà bằng cách áp dụng WIDTH và HEIGHT cho các kích thước của khối cơ sở (hãy nhìn vào đầu ra mẫu được cung cấp!). Để tham khảo: số lượng ký tự từ trái sang phải 'tường' (đối với tòa nhà có W> 1): (W * 5) - (W-1).

  4. Các tòa nhà có Chiều cao> 0 có MỘT cửa (được mô tả bởi nhân vật ovà được đặt tại hai ký tự từ bức tường 'bên trái' trên hàng 'dưới cùng').

Con đường:

  1. Con đường bao gồm ba phần mà chúng ta sẽ gọi là 'trên cùng', 'giữa' và 'dưới cùng'.
  2. Phần 'trên cùng' và 'dưới cùng' giống hệt nhau ngoài thực tế là phần 'trên cùng' có trước hai khoảng trắng.
  3. Phần giữa được đi trước bởi một khoảng trắng và bao gồm sự lặp lại của mẫu sau:
    '-'
  4. Chiều dài sẽ được xác định bằng tổng chiều rộng của các tòa nhà kết hợp: phần bên phải nhất của con đường tương ứng với vị trí của bức tường 'bên phải' của tòa nhà 'cuối cùng'.

Người chiến thắng:

Đây là môn đánh gôn! Người chiến thắng là thí sinh đủ điều kiện với giải pháp ngắn nhất (theo số mã nguồn). Nguồn phải chỉ bao gồm các ký tự ASCII có thể in được. Chúc vui vẻ!

Điểm thưởng tưởng tượng cho (ngẫu nhiên) cửa sổ, xe hơi hoặc người đi bộ.

Hãy bình luận nếu các thông số kỹ thuật không rõ ràng!


@user không rõ: thực sự có một lỗi đánh máy nhỏ trong các quy tắc thực sự. Nên sửa ngay, cảm ơn!
BarsheD

Trailing khoảng trắng được phép? Bạn dường như có một số trong ví dụ, vì vậy tôi giả sử như vậy.
Peter Taylor

@Peter Taylor: khoảng trắng theo dõi được cho phép.
BarsheD

Đường phần 3, có nên '-  '(có hai khoảng trống)? Chỉnh sửa : Ah, hai không gian không hiển thị: P. Bạn có thể hiển thị nhiều khoảng trắng bằng cách sử dụng ASCII 255 (không gian không phá vỡ, ALT + 255 trên numpad) hoặc bằng cách sao chép và dán từ nhận xét của tôi ở đây. Orr ... thay vào đó bạn chỉ có thể nói đó là sự lặp lại của ' - ':)
mellamokb

Có vẻ như phạm vi hợp lệ chiều cao thực sự là [ 0 ..10]. Ngoài ra những gì bạn có nghĩa là bởi but you must not enforce thistrong 3)? IMO, bất kỳ giả định nào cũng có sẵn để được khai thác nếu nó làm tăng điểm của bạn. Vì vậy, tôi có thể viết mã chỉ hoạt động nếu tổng chiều rộng nhỏ hơn 80 nếu tôi có thể giảm số lượng ký tự thấp hơn. Ví dụ, ghi đầu ra vào mảng bộ đệm hiển thị có chiều rộng 80, vì vậy nó sẽ bị sập trên bất kỳ chiều rộng nào cao hơn. Nếu bạn muốn bất kỳ chiều rộng nào được hỗ trợ, thì đừng đưa ra giả định - bạn không thể có cả hai: P
mellamokb

Câu trả lời:


10

Haskell, 396 ký tự

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=' '

Ví dụ đầu ra:

$ 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 Các bài nộp haskell gần đây của bạn trên codegolf.se đã gây hứng thú cho tôi vì đã tìm hiểu thêm một chút về haskell. Ngắn gọn như các giải pháp có thể, chúng vẫn còn khá 'dễ đọc'.
BarsheD

8

Python, ký tự 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

Sử dụng các lát để vẽ tất cả các phần của tòa nhà.

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

+1 Rất đẹp. Các giải pháp trông khá golfed đã ;-)
ChristopheD

2
Có một khoảng trống bị mất tại `p + = j` (@ cuối dòng dài). Không chắc chắn nếu bạn tính cái đó ;-)
BarsheD
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.