ASCII art 3D StreetView

29

Contribution:

  1. Vous obtenez une série d'entiers (alimentés via stdin ou prompt).
  2. Chaque paire d'entiers de cette série représente la LARGEUR [plage valide: 1..10] et la HAUTEUR [plage valide: 0..10] d'un bâtiment
  3. Supposons que l'entrée soit bien formée.

Exemple d'entrée (la deuxième ligne est uniquement à des fins de démonstration):

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

Exemple de sortie correspondante:

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

Règles:

Les immeubles

  1. Un bloc de construction de base ressemble à ceci (1 W, 1H)
   __
 / __ / | (le cube de base est emprunté à celui de cette question:
| | | http://stackoverflow.com/questions/1609702/code-golf-playing-cubes)
| ___ | /
  1. Notre vue est (ahum) ~ 3D afin que les bâtiments voisins puissent cacher des parties des autres. Les bâtiments sont rendus «logiquement» de gauche à droite.

  2. Le premier bâtiment est précédé de deux espaces à gauche.

  3. Vous effectuez le rendu de chaque bâtiment en appliquant la LARGEUR et la HAUTEUR aux dimensions du cube de base (jetez un œil à l'exemple de sortie fourni!). Pour référence: nombre de caractères de gauche à droite 'mur' (pour un bâtiment avec W> 1): (W * 5) - (W-1).

  4. Les bâtiments avec une hauteur> 0 ont UNE porte (qui est représentée par le personnage oet est située à deux caractères du mur 'gauche' sur la rangée 'inférieure').

La route:

  1. La route se compose de trois parties que nous appellerons «haut», «milieu» et «bas».
  2. La partie "supérieure" et la partie "inférieure" sont identiques à part le fait que la partie "supérieure" est précédée de deux espaces.
  3. La partie centrale est précédée d'un espace et consiste en une répétition du motif suivant:
    «-»
  4. La longueur doit être déterminée par la largeur totale des bâtiments combinés: la partie la plus à droite de la route correspond à la position du mur «droit» du «dernier» bâtiment.

Gagnants:

C'est du code-golf! Le gagnant est le candidat éligible avec la solution la plus courte (par nombre de codes source). La source doit être constituée uniquement de caractères ASCII imprimables. S'amuser!

Points bonus imaginaires pour des fenêtres (aléatoires), des voitures ou des piétons.

N'hésitez pas à commenter si les spécifications ne sont pas claires!

ChristopheD
la source
@user unknown: il y avait bien une petite faute de frappe dans les règles. Devrait être corrigé maintenant, merci!
ChristopheD
Espace de fuite autorisé? Vous semblez en avoir dans l'exemple, donc je suppose que oui.
Peter Taylor
@Peter Taylor: les espaces de fin sont autorisés.
ChristopheD
Route partie 3, cela devrait-il être '-  '(avec deux espaces)? Edit : Ah, les deux espaces ne montrent pas: P. Vous pouvez afficher plusieurs espaces en utilisant ASCII 255 (espace insécable, ALT + 255 sur le pavé numérique), ou en copiant et collant à partir de mon commentaire ici. Ou bien ... vous pourriez plutôt dire que c'est une répétition de ' - ':)
mellamokb
Il semble que la plage valide de hauteur soit en fait [ 0 ..10]. Et qu'entendez-vous également but you must not enforce thisen 3)? OMI, toute hypothèse est disponible pour être exploitée si elle augmente votre score. Je peux donc écrire du code qui ne fonctionne que si la largeur totale est inférieure à 80 si je peux extraire un nombre de caractères inférieur. Par exemple, l'écriture de la sortie dans un tableau de tampons d'affichage d'une largeur de 80, il se bloquera donc sur toute largeur totale supérieure. Si vous voulez que n'importe quelle largeur soit prise en charge, alors ne donnez pas l'hypothèse - vous ne pouvez pas avoir les deux: P
mellamokb

Réponses:

10

Haskell, 396 caractères

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

Exemple de sortie:

$ 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
la source
5
+1 Vos récentes soumissions haskell sur codegolf.se ont suscité un intérêt pour moi d'en savoir un peu plus sur haskell. Quelles que soient les solutions, elles restent à mon humble avis assez «lisibles».
ChristopheD
8

Python, 415 caractères

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

Utilise des tranches pour dessiner toutes les parties du bâtiment.

$ 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
la source
+1 Très sympa. La solution semble déjà assez golfée ;-)
ChristopheD
2
Il y a un espace perdu à `p + = j` (@la fin de la longue ligne). Je ne sais pas si vous l'avez compté ;-)
ChristopheD