CJam, 32 30 29 28 bytes
ri_"/\ /"2/f*)@,\f>+_z..e>N*
Teste aqui.
Eu estava tentando ajudar Reto a responder sua resposta de CJam, mas acabei tendo uma solução que não tinha nada a ver com a dele, então achei que seria melhor eu mesma publicá-la.
Explicação
Isso faz uso da simetria da saída. Em particular, o fato de que a saída é igual à sua transposição.
Primeiro, geramos as primeiras N+1
linhas, mas sem a borda esquerda:
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.
Agora, temos uma matriz de seqüências de caracteres representando a seguinte grade:
/\/\/\/\
/ / / /
/ / / /
/ / /
/ / /
A transposição disso é assim:
/ / /
\/ /
/ / /
\/ /
/ / /
\/ /
/ /
\/
Juntos, eles têm todos os caracteres não espaciais de que precisamos. Agora podemos usar a dica de radar de Dennis para combinar duas grades ASCII em uma, obtendo o máximo de cada par de caracteres correspondente. Em todas as posições em que as duas grades diferem, uma terá um espaço (ou nada) e a outra terá o personagem que estamos procurando. Quando uma lista em uma operação vetorizada é maior que a outra, os elementos adicionais da lista mais longa serão simplesmente mantidos, e é exatamente isso que estamos procurando. Nos outros casos, o caractere não espacial será sempre o máximo dos dois 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.