ASCII art 3D Sokak Görünümü


29

Giriş:

  1. Bir dizi tamsayı elde edersiniz (stdin ya da istemi ile beslenir).
  2. Bu serideki her bir tam sayı çifti bir binanın GENİŞLİĞİ [geçerli aralığı: 1..10] ve HEIGHT [geçerli aralığı: 0..10]
  3. İyi biçimlendirilmiş bir girdi kabul edin.

Numune girişi (ikinci satır sadece tanıtım amaçlıdır):

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

Karşılık gelen örnek çıktı:

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

Kurallar:

Binalar

  1. Temel bir yapı bloğu şöyle görünür (1 W, 1H)
   __
 / __ / | (temel küp bu sorudan birinden ödünç alınmıştır:
| | | http://stackoverflow.com/questions/1609702/code-golf-playing-cubes)
| ___ | /
  1. Bizim görüşümüz (ahum) ~ 3D yani komşu binalar başkalarının parçalarını gizleyebilir. Binalar 'mantıksal olarak' soldan sağa oluşturulur.

  2. İlk binadan önce kalan iki boşluk var.

  3. Her bir binayı, temel küpün boyutlarına GENİŞLİK ve YÜKSEKLİK uygulayarak yaparsınız (sağlanan örnek çıkışa bir göz atın!). Başvuru için: soldan sağa 'duvar' karakter sayısı (W> 1 olan bir bina için): (W * 5) - (W-1).

  4. Yükseklik> 0 olan binalarda TEK kapı bulunur (bu, karakter tarafından tasvir edilmiştir ove 'alt' sıradaki 'sol' duvardan iki karakterde bulunur).

Yol:

  1. Yol, 'üst', 'orta' ve 'alt' olarak adlandırdığımız üç bölümden oluşuyor.
  2. 'Üst' kısmı ve 'alt' kısmı, 'üst' kısmının iki boşluktan önce gelmesi gerçeğinden ayrı olarak aynıdır.
  3. Orta kısım bir boşluktan önce gelir ve aşağıdaki modelin tekrarından oluşur:
    '-'
  4. Uzunluk, birleşik binaların toplam genişliğine göre belirlenecektir: yolun en sağ kısmı 'son' bina duvarının 'sağ' duvarının konumuna karşılık gelir.

Kazananlar:

Bu kod golf! Kazanan en kısa çözüme sahip olan yarışmacı (kaynak koduna göre). Kaynak yalnızca yazdırılabilir ASCII karakterlerinden oluşmalıdır. İyi eğlenceler!

(Rastgele) pencereler, arabalar veya yayalar için hayali bonus puanları.

Özellikler açık değilse yorum yapmaktan çekinmeyin!


@ user unknown: Kurallarda gerçekten küçük bir yazım hatası vardı. Şimdi düzeltilmeli, teşekkürler!
ChristopheD

İzleyen boşlukta izin var mı? Örnekte bazı var gibi görünüyor, öyleyse öyle sanıyorum.
Peter Taylor

@ Peter Taylor: sondaki boşluklara izin verilir.
ChristopheD

Yol bölüm 3, bu olmalı '-  '(iki boşlukla)? Düzenleme : Ah, iki boşluk göstermez: P. ASCII 255 (aralıksız alan, numpad üzerinde ALT + 255) kullanarak veya buradaki yorumumdan kopyalayıp yapıştırarak birden çok alanı görüntüleyebilirsiniz. Orr ... bunun yerine sadece bunun bir tekrarı olduğunu söyleyebilirsin ' - ':)
mellamokb

Geçerli yükseklik aralığı aslında [ 0 ..10] gibi görünüyor . Ayrıca 3 ile ne demek istiyorsun but you must not enforce this? IMO, puanınızı arttırırsa yararlanabileceğiniz her türlü varsayım için uygundur. O kod yazmak olabilir Yani sadece toplam genişliği az 80 daha uzunsa çalışır ben daha düşük bir karakter sayısı dışarı sıkmak eğer. Örneğin, 80 genişliğinde bir ekran tampon dizisine çıktı yazmak, böylece daha yüksek toplam genişlikte çökmesine neden olur. Desteklenen herhangi bir genişliği istiyorsanız, o zaman varsayımı
vermeyin

Yanıtlar:


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

Örnek çıktı:

$ 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 hakkındaki son haskell önerileri, haskell hakkında biraz daha fazla şey öğrendiğim için ilgimi çekti. Çözümler olabildiğince kısa, hala oldukça 'okunabilir'.
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

Binanın tüm kısımlarını çizmek için dilimler kullanır.

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

+1 Çok hoş. Çözüm zaten oldukça golf gibi görünüyor ;-)
ChristopheD

2
'P + = j`'da bir boşluk var (@ uzun çizginin sonunda). Bunu saydı mı emin değilim ;-)
ChristopheD
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.