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