4位:mtym 様 のコード (214文字)
元のコード
整形コード
for(
i=r=[4];
i--;
)
for(
p=[w=y=x=40],
h=t=0;
y;
p[h++]='_%\n'[
x+w
?
x--<t&~x<t
:
(
t+=--y%8?1:-3,
x=w,
2
)
]
)
for(
r[i]=p.join(c='');
c<160;
)
for(
n=5,
f=(i+c)*c++*49999-5537&65535,
o=f%78+f%38*81;
n--;
p[
o+=n%3?1:80
]=
'|-*-|'[n]
);
return r
解説付きコード
for(
i=r=[4]; // 戻り値の配列rを初期化
// iは要素数1の配列
// 要素数1の数値配列は数値計算を行うと
// 数値変数として動作する(要素数2以上
// ではNaN(Not a Number)になる)
// 同様の処理は文字列でも行える
i--; // 戻り値用の配列4つ分を計算
)
for(
p=[w=y=x=40], // pは配列として初期化
// w, y, x は40で初期化
// ※ y は座標位置ではなく行数分
// 処理をするカウンタでしかない
h=t=0; // h, t は0で初期化
y; // y が0になったら(全行走査
// したら終了)
p[h++]='_%\n'[ // h で文字位置を指定
x+w // 「x+40」とすることで
// アスキーアートを
// 0になるまで80回描画可能
?
x--<t&~x<t
// 「(x--<t)&(~x<t)」
// 左辺は x の値がt以下
// 右辺は x-1 の反転なので
// 元の x の -x に等しい
// なので 右辺は -x の値がt以下
// 満たすなら1で「%」を参照
// 満たさないなら0で「_」を参照
:
// 改行位置
(
t+=--y%8?1:-3, // 改行位置なのでyを減算
// 「y%8」が0(false)になる時は、木のジグザグ
// が発生する場所なので変化量は-3
// 通常の場合は、1段y軸が変化するごとに
// 変化量は1
// その値をtに加える
x=w, // xを40に戻す
2 // 文字列の改行位置を参照
)
]
)
for(
// ここで、戻り値用の配列に結合した文字列を入れる
r[i]=p.join(c=''); // c を''で初期化し0とみなす
// joinは''の空文字列で結合
c<160; // イルミネーションの計算
)
for(
n=5, // イルミネーションの文字数5
f=(i+c)*c++*49999-5537&65535,
// 0xFFFF = 65535
// 59999-(0x10000)=-5537
// →「+59999 & 0xFFFF」と「-5537 & 0xFFFF」は等価
// 例)0xF = 15 = b1111
// 9 の場合は 9+(0x10) = 9+16 = 25
// 9 の場合は 9-(0x10) = 9-16 = -7
// 10+ 25 & 15 → 35 & 15 →b100011 & b1111 → b11
// 10+ 9 & 15 → 19 & 15 → b10011 & b1111 → b11
// 10- 7 & 15 → 3 & 15 → b11 & b1111 → b11
// マスクする値+1を足したり引いたりした値でも
// 同じ結果になる
o=f%78+f%38*81; // 中心の左上を基準点に
n--; // nが0になるまで実行
p[
o+=n%3?1:80
// 改行があるので横81文字
// なので、80をy軸の移動量に取ると
// 斜めに移動することになる
// そのため、星の上部(@の位置)から
// 移動を開始して、右(1)、下(80)、
// 右(1)、右(1)、右(1)、下(80)と
// 移動する
// @|
// -*-
// |
]=
'|-*-|'[n] // nで取得位置を指定
);
return r