CJam, 32 30 29 28 bytes
ri_"/\ /"2/f*)@,\f>+_z..e>N*
Pruébalo aquí.
Estaba tratando de ayudar a Reto a responder su respuesta de CJam, pero terminé con una solución que no tenía nada que ver con la suya, así que pensé que podría publicarla yo mismo.
Explicación
Esto hace uso de la simetría de la salida. En particular, el hecho de que la salida es la misma que su transposición.
Primero, generamos las primeras N+1
líneas, pero sin el borde izquierdo:
ri e# Read input and convert to integer N.
_ e# Duplicate.
"/\ /"2/ e# Push an array with two strings: ["/\" " /"]
f* e# Repeat each of the two strings N times. That gives the first two rows.
) e# Detach the second row.
@, e# Pull up the other copy of N and turn into range [0 1 ... N-1].
\f> e# For each element i in that range, discard the first i characters of
e# the second row.
+ e# Add all those lines back to the first row.
Ahora tenemos una serie de cadenas que representan la siguiente cuadrícula:
/\/\/\/\
/ / / /
/ / / /
/ / /
/ / /
La transposición de eso se ve así:
/ / /
\/ /
/ / /
\/ /
/ / /
\/ /
/ /
\/
Juntos, estos tienen todos los caracteres no espaciales que necesitamos. Ahora podemos usar la punta de rad de Dennis para combinar dos cuadrículas ASCII en una, tomando el máximo de cada par de caracteres correspondiente. En todas las posiciones en las que las dos cuadrículas difieren, una tendrá un espacio (o nada) y la otra tendrá el personaje que estamos buscando. Cuando una lista en una operación vectorizada es más larga que la otra, los elementos adicionales de la lista más larga simplemente se mantendrán, que es justo lo que estamos buscando. En los otros casos, el carácter sin espacio siempre será el máximo de los dos caracteres:
_z e# Duplicate the grid and transpose it.
..e> e# For each pair of characters in corresponding positions, pick the maximum.
N* e# Join the lines by linefeed characters.
;
s.