CJam, 32 30 29 28 bayt
ri_"/\ /"2/f*)@,\f>+_z..e>N*
Burada test et.
Reto'ya CJam'ın cevabını golf atmaya yardım etmeye çalışıyordum ama onunla hiçbir ilgisi olmayan bir çözüm buldum, bu yüzden kendim de gönderebilirim diye düşündüm.
açıklama
Bu, çıkışın simetrisini kullanır. Özellikle, çıktının devriyle aynı olduğu gerçeği.
İlk önce, ilk N+1
satırları üretiriz, ancak sol kenarı olmadan:
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.
Şimdi aşağıdaki ızgarayı temsil eden bir dizi dizgimiz var:
/\/\/\/\
/ / / /
/ / / /
/ / /
/ / /
Bunun devrik gibi görünüyor:
/ / /
\/ /
/ / /
\/ /
/ / /
\/ /
/ /
\/
Birlikte bunlar, ihtiyacımız olan tüm boşluk olmayan karakterlere sahip. Artık iki ASCII ızgarasını bir bir araya getirerek, karşılık gelen her karakter çiftinden en fazlasını alarak Dennis'in rad ucunu kullanabiliriz. İki şebekenin farklı olduğu tüm pozisyonlarda, biri boşluk bırakacak (ya da hiçbir şey olmayacak) ve diğeri aradığımız karaktere sahip olacaktır. Bir vektörlü işlemdeki bir liste diğerinden daha uzun olduğunda, daha uzun listenin ek öğeleri basitçe tutulur; bu tam olarak aradığımız şeydir. Diğer durumlarda, boşluksuz karakter her zaman iki karakterin maksimumunda olacaktır:
_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.
;
.