CJam, 32 30 29 28 Bytes
ri_"/\ /"2/f*)@,\f>+_z..e>N*
Teste es hier.
Ich habe versucht, Reto bei der Beantwortung seiner CJam-Frage zu helfen, aber am Ende hatte ich eine Lösung, die nichts mit seiner zu tun hatte.
Erläuterung
Dies nutzt die Symmetrie des Ausgangs. Insbesondere die Tatsache, dass die Ausgabe mit der Transponierung identisch ist.
Zuerst erzeugen wir die ersten N+1
Zeilen, aber ohne den linken Rand:
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.
Jetzt haben wir eine Reihe von Zeichenfolgen, die das folgende Raster darstellen:
/\/\/\/\
/ / / /
/ / / /
/ / /
/ / /
Die Umsetzung sieht so aus:
/ / /
\/ /
/ / /
\/ /
/ / /
\/ /
/ /
\/
Zusammen haben diese alle nicht-Leerzeichen, die wir brauchen. Wir können jetzt Dennis 'rad-Tipp verwenden , um zwei ASCII-Gitter zu einem zu kombinieren, indem wir das Maximum von jedem entsprechenden Zeichenpaar nehmen. In allen Positionen, in denen sich die beiden Gitter unterscheiden, hat eines ein Leerzeichen (oder gar nichts) und das andere den Charakter, den wir suchen. Wenn eine Liste in einer vektorisierten Operation länger als die andere ist, werden die zusätzlichen Elemente der längeren Liste einfach beibehalten, und genau das ist, wonach wir suchen. In den anderen Fällen ist das Nicht-Leerzeichen immer das Maximum der beiden Zeichen:
_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 entfernen .