ASCII adalah 3D StreetView

29

Memasukkan:

  1. Anda mendapatkan serangkaian bilangan bulat (diumpankan melalui stdin atau prompt).
  2. Setiap pasangan bilangan bulat dalam seri ini mewakili WIDTH gedung [rentang valid: 1..10] dan HEIGHT [rentang valid: 0..10]
  3. Asumsikan input terbentuk dengan baik.

Input sampel (baris kedua hanya untuk tujuan demonstrasi):

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

Output sampel yang sesuai:

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

Aturan:

Bangunan-bangunan

  1. Balok pembangun dasar terlihat seperti ini (1 W, 1 H)
   __
 / __ / | (kubus dasar dipinjam dari yang ada di pertanyaan ini:
| | | http://stackoverflow.com/questions/1609702/code-golf-playing-cubes)
| ___ | /
  1. Pandangan kami adalah (ahum) ~ 3D sehingga bangunan tetangga dapat menyembunyikan bagian lain. Bangunan 'secara logis' dirender dari kiri ke kanan.

  2. Bangunan pertama didahului oleh dua ruang di sebelah kiri.

  3. Anda membuat setiap bangunan dengan menerapkan WIDTH dan HEIGHT ke dimensi kubus dasar (lihat output sampel yang disediakan!). Untuk referensi: jumlah karakter dari kiri ke kanan 'dinding' (untuk bangunan dengan W> 1): (W * 5) - (W-1).

  4. Bangunan dengan Tinggi> 0 memiliki SATU pintu (yang digambarkan oleh karakter odan terletak di dua karakter dari dinding 'kiri' di baris 'bawah').

Jalan:

  1. Jalan terdiri dari tiga bagian yang kita sebut 'atas', 'tengah' dan 'bawah'.
  2. Bagian 'atas' dan 'bawah' identik terlepas dari kenyataan bahwa bagian 'atas' didahului oleh dua spasi.
  3. Bagian tengah didahului oleh satu spasi dan terdiri dari pengulangan pola berikut:
    '-'
  4. Panjang harus ditentukan oleh lebar total bangunan gabungan: bagian paling kanan jalan sesuai dengan posisi dinding 'kanan' dari bangunan 'terakhir'.

Pemenang:

Ini golf kode! Pemenangnya adalah kontestan yang memenuhi syarat dengan solusi terpendek (berdasarkan jumlah kode sumber). Sumber harus terdiri dari karakter ASCII yang dapat dicetak. Selamat bersenang-senang!

Poin bonus imajiner untuk jendela, mobil, atau pejalan kaki (acak).

Jangan ragu untuk berkomentar jika spesifikasinya tidak jelas!

ChristopheD
sumber
@ pengguna tidak diketahui: memang ada kesalahan ketik kecil dalam aturan. Harus diperbaiki sekarang, terima kasih!
ChristopheD
Trailing whitespace diizinkan? Anda sepertinya memiliki beberapa contoh, jadi saya berasumsi demikian.
Peter Taylor
@ Peter Taylor: trailing whitespace diizinkan.
ChristopheD
Jalan bagian 3, haruskah itu '-  '(dengan dua spasi)? Sunting : Ah, kedua spasi tidak menunjukkan: P. Anda dapat menampilkan banyak ruang dengan menggunakan ASCII 255 (ruang tanpa-putus, ALT + 255 pada numpad), atau dengan menyalin dan menempel dari komentar saya di sini. Orr ... Anda malah bisa mengatakan itu adalah pengulangan ' - ':)
mellamokb
Sepertinya rentang yang valid tinggi sebenarnya [ 0 ..10]. Juga apa yang Anda maksud dengan but you must not enforce this3)? IMO, asumsi apa pun tersedia untuk dieksploitasi jika itu meningkatkan skor Anda. Jadi saya dapat menulis kode yang hanya berfungsi jika total lebar kurang dari 80 jika saya dapat memeras jumlah karakter yang lebih rendah. Misalnya, menulis output ke array buffer tampilan dengan lebar 80, sehingga akan macet pada lebar total yang lebih tinggi. Jika Anda menginginkan lebar yang didukung, maka jangan memberikan asumsi - Anda tidak dapat memiliki keduanya: P
mellamokb

Jawaban:

10

Haskell, 396 karakter

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

Contoh output:

$ 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_________|/
  -------------------------------------------------
 -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
-------------------------------------------------
hammar
sumber
5
+1 Kiriman haskell Anda baru-baru ini di codegolf.se telah memicu minat pada saya untuk belajar lebih banyak tentang haskell. Singkatnya solusinya, mereka masih tetap 'terbaca' imho.
ChristopheD
8

Python, 415 karakter

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

Gunakan irisan untuk menggambar semua bagian bangunan.

$ echo "1 2 1 1 1 0 2 4 1 3 1 5 2 1" | ./streetview.py 
                             __          
                           /__ /|        
                 ______   |   | |        
               /______ /| |   | |        
              |       | |_|   | |        
              |       |/__|   | |        
     __       |       |   |   | |        
   /__ /|     |       |   |   | |        
  |   | |__   |       |   |   | |______  
  |   |/__ /| |       |   |   |/______ /|
  |   |   | |_|       |   |   |       | |
  |_o_|_o_|/__|_o_____|_o_|_o_|_o_____|/ 
  -------------------------------------
 -  -  -  -  -  -  -  -  -  -  -  -  -
-------------------------------------
Keith Randall
sumber
+1 Sangat bagus. Solusinya sudah terlihat cukup golf ;-)
ChristopheD
2
Ada satu ruang yang hilang di `p + = j` (@ akhir dari garis panjang). Tidak yakin apakah Anda menghitungnya ;-)
ChristopheD