ASCII art 3D StreetView


29

Ingresso:

  1. Ottieni una serie di numeri interi (alimentati tramite stdin o prompt).
  2. Ogni coppia di numeri interi in questa serie rappresenta la LARGHEZZA di un edificio [intervallo valido: 1..10] e HEIGHT [intervallo valido: 0..10]
  3. Supponiamo che l'input sia ben formato.

Input di esempio (la seconda riga è solo a scopo dimostrativo):

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

Output del campione corrispondente:

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

Regole:

Gli edifici

  1. Un blocco base di base è simile al seguente (1 W, 1H)
   __
 / __ / | (il cubo di base viene preso in prestito da quello a questa domanda:
| | | http://stackoverflow.com/questions/1609702/code-golf-playing-cubes)
| ___ | /
  1. La nostra visione è (ahum) ~ 3D, quindi gli edifici vicini possono nascondere parti di altri. Gli edifici sono "logicamente" resi da sinistra a destra.

  2. Il primo edificio è preceduto da due spazi alla sua sinistra.

  3. Rendi ogni edificio applicando WIDTH e HEIGHT alle dimensioni del cubo di base (dai un'occhiata all'output di esempio fornito!). Per riferimento: numero di caratteri da sinistra a destra 'muro' (per un edificio con W> 1): (W * 5) - (W-1).

  4. Gli edifici con altezza> 0 hanno UNA porta (che è rappresentata dal personaggio oe si trova a due personaggi dalla parete "sinistra" sulla riga "in basso").

La strada:

  1. La strada è composta da tre parti che chiameremo "top", "middle" e "bottom".
  2. La parte "superiore" e la parte "inferiore" sono identiche a parte il fatto che la parte "superiore" è preceduta da due spazi.
  3. La parte centrale è preceduta da uno spazio e consiste in una ripetizione del seguente schema:
    '-'
  4. La lunghezza deve essere determinata dalla larghezza totale degli edifici combinati: la parte più a destra della strada corrisponde alla posizione della parete "destra" dell'ultimo "edificio".

Vincitori:

Questo è code-golf! Il vincitore è il concorrente qualificato con la soluzione più breve (in base al conteggio del codice sorgente). La fonte deve essere composta esclusivamente da caratteri ASCII stampabili. Divertiti!

Punti bonus immaginari per finestre (casuali), automobili o pedoni.

Sentiti libero di commentare se le specifiche non sono chiare!


@utente sconosciuto: c'era davvero un piccolo errore di battitura nelle regole. Ora dovrebbe essere risolto, grazie!
ChristopheD,

Spazio trailing consentito? Sembra che tu ne abbia alcuni nell'esempio, quindi presumo di si.
Peter Taylor,

@Peter Taylor: è consentito lo spazio bianco finale.
ChristopheD,

Strada parte 3, dovrebbe essere '-  '(con due spazi)? Modifica : Ah, i due spazi non mostrano: P. È possibile visualizzare più spazi utilizzando ASCII 255 (spazio non interruzione, ALT + 255 sul tastierino numerico) o copiando e incollando dal mio commento qui. Orr ... potresti invece semplicemente dire che è una ripetizione di ' - ':)
mellamokb il

Sembra che l'intervallo valido in altezza sia effettivamente [ 0 ..10]. Inoltre cosa intendi per but you must not enforce this3)? IMO, ogni ipotesi è disponibile per essere sfruttata se aumenta il tuo punteggio. Quindi posso scrivere un codice che funziona solo se la larghezza totale è inferiore a 80 se riesco a ridurre un numero di caratteri inferiore. Ad esempio, scrivendo l'output su un array di buffer di visualizzazione con una larghezza di 80, quindi si arresterà in modo anomalo su qualsiasi larghezza totale più elevata. Se vuoi supportare una larghezza qualsiasi, non dare il presupposto - non puoi avere entrambi: P
mellamokb

Risposte:


10

Haskell, 396 personaggi

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

Esempio di 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_________|/
  -------------------------------------------------
 -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
-------------------------------------------------

5
+1 Le tue recenti osservazioni su haskell su codegolf.se hanno suscitato l'interesse per me per saperne di più su haskell. Per quanto brevi possano essere le soluzioni, rimangono comunque imho abbastanza "leggibili".
ChristopheD,

8

Python, 415 caratteri

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

Usa le sezioni per disegnare tutte le parti dell'edificio.

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

+1 Molto bello. La soluzione sembra già piuttosto giocata a golf ;-)
ChristopheD

2
C'è uno spazio perso in `p + = j` (@l'estremità della linea lunga). Non sono sicuro se hai contato quello ;-)
ChristopheD
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.