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
Cronus Crown(クロノス・クラウン)のトップページに戻る
(c)2002-2024 Cronus Crown (c)1997-2024 Masakazu Yanai
ご意見・お問い合わせはサイト情報 弊社への連絡までお願いします
個人情報の取り扱い、利用者情報の外部送信について