ASCII art 3D StreetView


29

การป้อนข้อมูล:

  1. คุณได้รับชุดจำนวนเต็ม (ป้อนผ่าน stdin หรือพรอมต์)
  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. Building Block พื้นฐานดูเหมือนว่านี้ (1 W, 1H)
   __
 / __ / | (ฐาน cube ยืมมาจากก้อนที่คำถามนี้:
| | | 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 ที่พิมพ์ได้เท่านั้น มีความสุข!

คะแนนโบนัสจินตนาการสำหรับหน้าต่าง (สุ่ม) รถยนต์หรือคนเดินเท้า

อย่าลังเลที่จะแสดงความคิดเห็นหากข้อกำหนดไม่ชัดเจน!


@ ไม่ทราบชื่อผู้ใช้: มีการพิมพ์ผิดเล็ก ๆ น้อย ๆ ในกฎแน่นอน ควรได้รับการแก้ไขแล้วขอบคุณ!
ChristopheD

อนุญาตให้ใช้ช่องว่างต่อท้ายได้หรือไม่ คุณดูเหมือนจะมีบางตัวอย่างดังนั้นฉันคิดเช่นนั้น
Peter Taylor

@Peter Taylor: อนุญาตให้ใช้ช่องว่างต่อท้ายได้
ChristopheD

ถนนตอนที่ 3 ควรเป็น'-  '(มีสองช่องว่าง) หรือไม่ แก้ไข : อ้าทั้งสองช่องว่างไม่แสดง: P คุณสามารถแสดงช่องว่างหลายช่องโดยใช้ ASCII 255 (พื้นที่ไม่แตก, ALT + 255 บน numpad) หรือโดยการคัดลอกและวางจากความคิดเห็นของฉันที่นี่ ออร์ ... คุณสามารถบอกได้ว่ามันเป็นการทำซ้ำของ' - ':)
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 ทำให้ฉันสนใจที่จะเรียนรู้เพิ่มเติมเกี่ยวกับฮาเซล สั้น ๆ อาจเป็นวิธีแก้ปัญหาพวกเขายังคงค่อนข้าง 'อ่านได้' imho
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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.