1位:tompng 様 のコード (194文字)
元のコード
整形コード
for(
u=[i=4];
i--;
)
for(
x=y=s=j=c="";
y<40;
j++<160
?
c=
(
p=1+r%78-x
)*p+(
q=1+r%38-y
)*q
<2
?
2-!p+!q
:
c
:
j=
c&=
s+=
"\n|*-_%"[
x++<80
?
c
||
2*Math.abs(x-41)
<
y+y%8
|4
:
x&=
u[
y++,
i
]=s
]
)
r=(i+j)*j*49999-5537&65535;
return u
解説付きコード
/*
* アニメの制御
*/
for(
u=[i=4]; // 配列数と4要素の配列を初期化
i--; // 配列数分の処理を行い、iが0になれば終了
)
/*
* 各マスとイルミネーションの制御
*/
for(
x=y=s=j=c=""; // 変数を初期化 0値の変数は""で初期化を統合
y<40; // 高さの回数計算
j++<160 // 160はイルミネーションの個数
// 全てのイルミネーションの位置を確認
?
/*
* イルミネーションの個数以下の場合は、現在XY位置に対応した
* イルミネーションが存在するか確認する
*/
c=
(
p=1+r%78-x // 「1+r%78」はイルミネーションXの位置
// 「-x」することで、距離を求める
)*p+(
q=1+r%38-y // 「1+r%38」がイルミネーションYの位置
// 「-y」することで、距離を求める
)*q
<2 // イルミネーションの中心座標からの距離
// 距離が2未満ならばイルミネーションの一部が
// 現在走査中の座標に差し掛かっていると判断
?
/*
* イルミネーションの場所である
*/
2-!p+!q
// 中心か否かを判定 「!」を使うことで0か1を生成
// 中心なら2、上下なら1、左右なら3
:
/*
* イルミネーションの場所ではない
*/
c // 初期値の0か、上記で判定した1~3の値になる
:
/*
* イルミネーションを全て確認したら描画を行う
*/
j= // jを初期化(cと同じ値)
c&= // cを初期化(数値以外とビット演算して0を生成)
s+= // 文字列をアスキーアート1枚分連結していく
"\n|*-_%"[
x++<80
?
/*
* 通常の行位置
*/
c // イルミネーションであるなら、
// その位置の文字を取得
|| // cが0だった(イルミネーションでない)
// 場合は以下を計算
2*Math.abs(x-41) // 「2*Math.abs(x-41)」が
< // 「y+y%8」より小さければ(trueなら)
y+y%8 // 「1」になる、falseなら0になる
// 「y+y%8」で、以下のように増え、
// 元の式と同じになる
// 1+1=2, 2+2=4, 3+3=6, ... 7+7=14,
// 8+0=8, 9+1=10, 10+2=12, ...
|4 // 0|4で 0|b100なのでb100 つまり4→「_」
// 1|4で 1|b100なのでb101 つまり5→「%」
:
/*
* 改行位置
*/
x&= // xを初期化(数値以外とビット演算して0化)
u[
y++, // 行を1行加算
i // uの配列の現在位置iに対して
]=s // 連結し続けているsを格納
]
) // 内側のfor文の「)」
r=(i+j)*j*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を足したり引いたりした値でも
// 同じ結果になる
return u