CJam、 48 46バイト
li(_S*"/\\":T+\{_N@S+TW%/S2**" /"/"\ "f/:+T*}*
問題の観測1および2に基づく単純な再帰的アプローチ。
オンラインでお試しください。
使い方
li( " L := int(input()) - 1 ";
_S* " A := L * ' ' ";
"/\\":T+ " A += (T := '/\') ";
\{ " do L times: ";
_N " push A, '\n' ";
@S+ " A += ' ' ";
TW%/ " B := A.split(reverse(T)) ";
S2** " A := ' '.join(B) ";
" /"/ " B := A.split(' /') ";
"\ "f/ " C := { X.split('\ ') : X ∊ B } ";
:+T* " A := T.join(sum(C, [])) ";
}* " ";
CJam、51バイト
li__2mL,1a\{2_@##)1$f*+}/<f{2b_" /\\"2/f=@@,-S*\N}
私はこのアプローチの方が好きですが、再帰的なアプローチと競合することはできません。2mL
(少なくともO(2 n)実行時間になる)を除去した後でも、私はまだ48バイトです...
このアプローチは、/\
「1」をエンコードし、「0」としてそれらの間の二重スペースをエンコードします。結果の配列の2進数を考慮すると、n行目の構成は、異なるフェルマー数(2 2 k +1の整数)の積として表現できる1より大きいn番目の整数に対応することがわかります。
使い方
li__2mL,1a " push L := int(input()), L, R := range(log(L)/log(2)), A := [1] ";
\{2_@##)1$f*+}/ " for I in R: A += { a × 2**(2**I) : a ∊ A } ";
< " A := A[:L] ";
f{ " for I in R: push L, I ";
2b_" /\\"2/ " push (B := base(I, 2)), B, S := [ ' ' '/\' ] ";
f= " for J in I: J := S[J] ";
@@,-S*\N " push (L - len(B)) * ' ', J, '\n' ";
} " ";