ASCII art 3D StreetView

29

Wkład:

  1. Otrzymasz serię liczb całkowitych (podawanych przez standardowe wejście lub monit).
  2. Każda para liczb całkowitych z tej serii reprezentuje SZEROKOŚĆ budynku [prawidłowy zakres: 1..10] i WYSOKOŚĆ [prawidłowy zakres: 0..10]
  3. Załóżmy, że dane wejściowe są dobrze sformułowane.

Przykładowe dane wejściowe (drugi wiersz służy wyłącznie do celów demonstracyjnych):

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

Odpowiadająca próbka wyjściowa:

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

Zasady:

Budynki

  1. Podstawowy element konstrukcyjny wygląda tak (1 W, 1H)
   __
 / __ / | (podstawowa kostka jest zapożyczona z tej na to pytanie:
| | | http://stackoverflow.com/questions/1609702/code-golf-playing-cubes)
| ___ | /
  1. Nasz widok to (ahum) ~ 3D, więc sąsiednie budynki mogą ukrywać części innych. Budynki są „logicznie” renderowane od lewej do prawej.

  2. Pierwszy budynek poprzedza dwie spacje po lewej stronie.

  3. Renderujesz każdy budynek, stosując SZEROKOŚĆ i WYSOKOŚĆ do wymiarów kostki podstawowej (spójrz na dostarczone dane wyjściowe!). Dla porównania: liczba znaków od lewej do prawej „ściany” (dla budynku o W> 1): (W * 5) - (W-1).

  4. Budynki o wysokości> 0 mają JEDEN drzwi (które są przedstawione przez postać oi znajdują się przy dwóch znakach od „lewej” ściany w „dolnym” rzędzie).

Droga:

  1. Droga składa się z trzech części, które nazwiemy „górną”, „środkową” i „dolną”.
  2. Część „górna” i „dolna” są identyczne, z wyjątkiem tego, że „górna” część poprzedzona jest dwoma spacjami.
  3. Środkowa część poprzedzona jest jedną spacją i składa się z powtórzenia następującego wzoru:
    „-”
  4. Długość określa się na podstawie całkowitej szerokości połączonych budynków: najbardziej wysunięta na prawo część drogi odpowiada położeniu „prawej” ściany „ostatniego” budynku.

Zwycięzcy:

To jest golf golfowy! Zwycięzcą zostaje zakwalifikowany zawodnik z najkrótszym rozwiązaniem (według liczby kodów źródłowych). Źródło musi składać się wyłącznie z drukowalnych znaków ASCII. Baw się dobrze!

Wyimaginowane punkty bonusowe za (losowe) okna, samochody lub pieszych.

Jeśli specyfikacje nie są jasne, możesz komentować!

ChristopheD
źródło
@ użytkownik nieznany: rzeczywiście w regułach rzeczywiście była mała literówka. Teraz powinno zostać naprawione, dzięki!
ChristopheD
Czy dozwolone są końcowe białe znaki? Wygląda na to, że masz trochę w tym przykładzie, więc zakładam, że tak.
Peter Taylor
@Peter Taylor: końcowe białe znaki są dozwolone.
ChristopheD
To powinna być część drogi 3 '-  '(z dwoma spacjami)? Edycja : Ach, dwie spacje nie pokazują: P. Możesz wyświetlić wiele spacji, używając ASCII 255 (spacja niełamliwa, ALT + 255 na klawiaturze numerycznej) lub kopiując i wklejając z mojego komentarza tutaj. Orr ... zamiast tego możesz po prostu powiedzieć, że to powtórzenie ' - ':)
mellamokb,
Wygląda na to, że prawidłowy zakres wysokości to w rzeczywistości [ 0 ..10]. Co rozumiesz przez but you must not enforce this3)? IMO, każde założenie jest dostępne do wykorzystania, jeśli zwiększy twój wynik. Mogę więc napisać kod, który działa tylko wtedy, gdy całkowita szerokość jest mniejsza niż 80, jeśli mogę wycisnąć mniejszą liczbę znaków. Na przykład zapisywanie danych wyjściowych do tablicy buforów wyświetlania o szerokości 80, aby zawiesić się na dowolnej większej szerokości całkowitej. Jeśli chcesz, aby jakakolwiek szerokość była obsługiwana, nie zakładaj - nie możesz mieć obu: P
mellamokb

Odpowiedzi:

10

Haskell, 396 znaków

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

Przykładowe dane wyjściowe:

$ 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
źródło
5
+1 Twoje ostatnie zgłoszenia Haskell na codegolf.se wzbudziły we mnie zainteresowanie, aby dowiedzieć się nieco więcej o haskell. Krótkie, jakkolwiek mogą być rozwiązania, wciąż pozostają imho „czytelnym”.
ChristopheD
8

Python, 415 znaków

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

Wykorzystuje plastry do narysowania wszystkich części budynku.

$ 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
źródło
+1 Bardzo miło. Rozwiązanie wygląda już dość golfowo ;-)
ChristopheD
2
Jest jedna zagubiona spacja w `p + = j` (@ koniec długiej linii). Nie jestem pewien, czy to policzyłeś ;-)
ChristopheD