ASCII art 3D StreetView

29

Entrada:

  1. Obtiene una serie de enteros (alimentados a través de stdin o prompt).
  2. Cada par de enteros en esta serie representa el ANCHO de un edificio [rango válido: 1..10] y ALTURA [rango válido: 0..10]
  3. Suponga que la entrada está bien formada.

Entrada de muestra (la segunda línea es solo para fines de demostración):

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

Salida de muestra correspondiente:

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

Reglas:

Los edificios

  1. Un bloque de construcción básico se ve así (1 W, 1H)
   __
 / __ / | (el cubo base se toma prestado del de esta pregunta:
El | El | El | http://stackoverflow.com/questions/1609702/code-golf-playing-cubes)
| ___ | /
  1. Nuestra vista es (ahum) ~ 3D, por lo que los edificios vecinos pueden ocultar partes de otros. Los edificios se representan 'lógicamente' de izquierda a derecha.

  2. El primer edificio está precedido por dos espacios a su izquierda.

  3. Representa cada edificio aplicando ANCHO y ALTURA a las dimensiones del cubo base (¡eche un vistazo a la salida de muestra proporcionada!). Como referencia: número de caracteres de la 'pared' de izquierda a derecha (para un edificio con W> 1): (W * 5) - (W-1).

  4. Los edificios con Altura> 0 tienen UNA puerta (que está representada por el personaje oy se encuentra a dos caracteres del muro 'izquierdo' en la fila 'inferior').

El camino:

  1. El camino consta de tres partes que llamaremos 'superior', 'medio' e 'inferior'.
  2. La parte 'superior' y la parte 'inferior' son idénticas, aparte del hecho de que la parte 'superior' está precedida por dos espacios.
  3. La parte media está precedida por un espacio y consiste en una repetición del siguiente patrón:
    '-'
  4. La longitud se determinará por el ancho total de los edificios combinados: la parte más a la derecha del camino corresponde con la posición del muro 'derecho' del 'último' edificio.

Ganadores:

Este es el código de golf! El ganador es el concursante calificado con la solución más corta (por número de código fuente). La fuente debe consistir únicamente en caracteres ASCII imprimibles. ¡Que te diviertas!

Puntos de bonificación imaginarios para ventanas (aleatorias), automóviles o peatones.

¡Siéntase libre de comentar si las especificaciones no son claras!

ChristopheD
fuente
@user unknown: de hecho, hubo un pequeño error tipográfico en las reglas. Debería arreglarse ahora, ¡gracias!
ChristopheD
¿Espacio en blanco al final permitido? Parece que tienes algunos en el ejemplo, así que supongo que sí.
Peter Taylor
@ Peter Taylor: se permite el espacio en blanco al final.
ChristopheD
Carretera parte 3, ¿debería ser '-  '(con dos espacios)? Editar : Ah, los dos espacios no se muestran: P. Puede mostrar múltiples espacios usando ASCII 255 (espacio sin interrupciones, ALT + 255 en el teclado numérico), o copiando y pegando desde mi comentario aquí. Orr ... podrías decir que es una repetición de ' - ':)
mellamokb
Parece que el rango válido de altura es en realidad [ 0 ..10]. Además, ¿qué quieres decir con but you must not enforce thisen 3)? En mi opinión, cualquier suposición está disponible para ser explotada si aumenta su puntaje. Por lo tanto, puedo escribir código que solo funciona si el ancho total es menor a 80 si puedo exprimir un recuento de caracteres más bajo. Por ejemplo, escribir la salida en una matriz de búfer de pantalla con un ancho de 80, por lo que se bloqueará en cualquier ancho total más alto. Si desea
admitir

Respuestas:

10

Haskell, 396 caracteres

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

Salida de ejemplo:

$ 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
fuente
55
+1 Tus envíos recientes de haskell en codegolf.se han despertado un interés en mí por aprender un poco más sobre haskell. Por cortas que sean las soluciones, siguen siendo bastante 'legibles' en mi humilde opinión.
ChristopheD
8

Python, 415 caracteres

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

Utiliza rebanadas para dibujar todas las partes del edificio.

$ 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
fuente
+1 Muy bien. La solución ya parece bastante atractiva ;-)
ChristopheD
2
Hay un espacio perdido en `p + = j` (@el final de la línea larga). No está seguro de si ha contado que uno ;-)
ChristopheD