CJam, 32 30 29 28 bajtów
ri_"/\ /"2/f*)@,\f>+_z..e>N*
Sprawdź to tutaj.
Próbowałem pomóc Reto w golfa na jego odpowiedź na CJam, ale skończyło się na rozwiązaniu, które nie miało z nim nic wspólnego, więc pomyślałem, że równie dobrze mogę to opublikować.
Wyjaśnienie
Wykorzystuje to symetrię wyjścia. W szczególności fakt, że wynik jest taki sam jak jego transpozycja.
Najpierw generujemy pierwsze N+1linie, ale bez lewej krawędzi:
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.
Teraz mamy tablicę ciągów reprezentujących następującą siatkę:
/\/\/\/\
/ / / /
/ / / /
/ / /
/ / /
Transpozycja tego wygląda następująco:
/ / /
\/ /
/ / /
\/ /
/ / /
\/ /
/ /
\/
Razem mają wszystkie potrzebne nam znaki spacji. Możemy teraz skorzystać z końcówki rad Dennisa, aby połączyć dwie siatki ASCII w jedną, biorąc maksimum z każdej pary odpowiednich znaków. We wszystkich pozycjach, w których dwie siatki się różnią, jedna będzie miała spację (lub wcale), a druga będzie miała postać, której szukamy. Gdy jedna lista w operacji wektorowej jest dłuższa od drugiej, dodatkowe elementy dłuższej listy zostaną po prostu zachowane, i właśnie tego szukamy. W pozostałych przypadkach znak spacji będzie zawsze maksymalnie dwoma znakami:
_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.
;.