CJam, 32 30 29 28 байт
ri_"/\ /"2/f*)@,\f>+_z..e>N*
Перевірте це тут.
Я намагався допомогти Ретто гольфу його відповідь CJam, але закінчився рішенням, яке не мало нічого спільного з його, тож я зрозумів, що міг би також розмістити його сам.
Пояснення
Це використовує симетричність виводу. Зокрема, той факт, що вихід такий же, як і його транспозиція.
Спочатку ми генеруємо перші N+1
рядки, але без лівого краю:
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.
Тепер у нас є масив рядків, що представляють таку сітку:
/\/\/\/\
/ / / /
/ / / /
/ / /
/ / /
Транспонування цього виглядає приблизно так:
/ / /
\/ /
/ / /
\/ /
/ / /
\/ /
/ /
\/
Разом у них є всі непросторові символи, які нам потрібні. Тепер ми можемо скористатися радіс-наконечником Денніса, щоб поєднати дві сітки ASCII в одну, взявши максимум кожної відповідної пари символів. У всіх положеннях, де дві сітки відрізняються, одна матиме пробіл (або взагалі нічого), а друга матиме характер, якого ми шукаємо. Коли один список векторизованої операції довший за інший, додаткові елементи більш тривалого списку просто зберігатимуться, що саме ми шукаємо. В інших випадках непробільний символ завжди буде максимум двома символами:
_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.