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.
;
с.