CodeIQ Blog

自分の実力を知りたいITエンジニア向けの、実務スキル評価サービス「CodeIQ(コードアイキュー)」の公式ブログです。

「コードゴルフ:ワールド マップ」最終ランキング発表!~1位は219バイト!Top5の最短コード公開します。 #codegolf #shortcoding

CodeIQ中の人、millionsmileです。

ついに終了しましたJSの「コードゴルフ:ワールド マップ」の最終順位の発表です。

今回は上位5位の方のコードも公開しますよ~~

じゃーん!

1位はozy4dm 様で、219バイト。1位バッチ付与します!
2位はrotary-o 様で、221バイト。2位バッチ付与します!
3位はayuzak 様で、222バイト。3位バッジ付与します!

\ ̄▽ ̄/ アッパレ

ozy4dm 様、逃げ切りましたね。1位になってモテたいとつぶやいていましたが、
そのモテるためのエネルギーといったらぱない感じです。
これできっとモテるでしょう。きっとね。
あ、ちなみにozy4dm 様は、現在、C言語でショートコーディングの問題を出題中です。
よかったら挑戦してみてくださいね。JSとは違う楽しみ方がありますよ。

rotary-o 様は途中1位でしたが、惜しかったですね。
ショートコーダーのozy4dm 様を一時的とはいえ、抜かしていたのは素晴らしい!
また次の活躍を期待してます~。

ayuzak 様も途中1位でしたね。いつも上位にランクインしていて、
ゴルファーの王者の一人でもありますので、近いうち王者となることを祈らんとすです。

そして、10位までにランクインした方は、

akiyuki 様、iehn 様、UTO 様、simbelmyn 様、beyu 様、alluser 様、Azicore 様

でした~~~(*゜▽゜ノノ゛☆パチパチ
ベスト10入りバッジを付与しますね!

全体の順位はこちら。

1位 (219バイト):ozy4dm 様
2位 (221バイト):rotary-o 様
3位 (222バイト):ayuzak 様
4位 (226バイト):akiyuki 様
5位 (229バイト):iehn 様
6位 (230バイト):UTO 様
7位 (235バイト):simbelmyn 様
8位 (238バイト):beyu 様
9位 (239バイト):alluser 様
10位 (242バイト):Azicore 様
11位 (244バイト):teruki 様
12位 (245バイト):ciel 様、hogeover30 様
13位 (248バイト):yammaboo 様
14位 (250バイト):flowlight 様
15位 (257バイト):ixxa 様
16位 (270バイト):saidie 様
17位 (272バイト):sch 様
18位 (277バイト):kumojima 様
19位 (289バイト):Rika Sigma 様
20位 (297バイト):setchi_ 様
21位:はんど 様
22位:koba-e964 様
23位:YK 様、wanabe 様
24位:superstring04 様
25位:チェシャ猫 様
26位:tono
27位:v416 様
28位:shunter1112 様
29位:Murao 様

さてさて、おまちかね、Top5のコードです。

5位(229バイト):iehn 様のコード

for(b=r=256,c=a=160,n=i=-1;n=++n%17||(r+=","+a,k=++i>>8)<c;m=n+5,a=u|=n^1?m++/m*a+1/m*~~d:d)for(t=d=0;t<4;d+=((j=~~y*x--+~~(x*=i/b%1)+t++%2)*j*4999+8999)/b/(t&2?b:-b)%1*255*(t%2-x%1)*(!u-y%1))x=11*n,y=k/c*(7*n-1)+(u=t<2);return r

4位(226バイト):akiyuki 様のコード

for(r=[w=256,h=160],t=i=c=n=0;c<w*h;i++%5?t+=(i&1?x++%1:1-x%1)*(i&2?y++%1:1-y%1)*(u=~~x+~~y*v,(u*u*4999+8999)/w/w%1)*255:c+=t=!(r[2+c]=m=++n<3?~~t:1/e*~~t+~-e/e*m|0,n%=17))e=n+6,v=11*n,x=c%w*~-v/w,y=(c>>8)*(7*n-1)/h;return''+r

3位(222バイト):ayuzak 様のコード

r=[u=256,v=160];for(m=0;n=m%16,i=m++>>4,q=i>>8,q<v;r[2+i]=k=n?(n+=6)/++n*k+1/n*e|0:e)w=11*~n,p=i%u/u*~w,q/=v/(7*n+6),s=~~p+~q*w,p%=1,q%=1,e="+(s*s++*4999+8999)/u/u%1*255*(p=1-p)*q",e|=eval(e+=e)-eval(e,s+=w-2,q--);return r

2位(221バイト):rotary-o 様のコード

for(r=[w=256,h=160],i=n=0;y=i>>8,t=y<h;s=r[i+2]=~n?1/(d=6-n)*~t+~-d/d*s|0:~t,n%=16,i+=!n)for(x=i%w/w*~(a=11*--n),y/=h/~(7*n),j=3;~j;t=(c*c*4999+8999)/w/w%1*255*(x%1-j--%2)*(y%1-b)+(j?-t:t))b=j<2,c=~x+j%2-(~y+b)*a;return r

1位(219バイト):ozy4dm 様のコード

R=[W=256,H=160];for(k=0;n=k%16,y=(l=k++>>4)>>8,j=y<H;R[l+2]=w=n?(n+=6)/++n*w+1/n*~D|0:~D)for(y*=~(7*~n)/H,x=l%W/W*~(c=11*~n),i=c*~y-~x,x%=D=-1;j+3;x=1-x,i-=j--?1:~c)D-=(i*i*4999+8999)/W%W/W*255*x*(j<0?1-y:y%=1);return R

いかがだったでしょうか。

JavaScriptでコードを短縮するコツについては、
出題者の柳井さんが技術評論社のサイトにて解説記事を書いていますので参考にしてみてください。
http://gihyo.jp/dev/serial/01/codeiq/0010

最後にワールド マップの問題文を掲載します。

「コードゴルフ」は、ゴルフがカップインまでの打数を競うように、
プログラムのソースコードの文字数を削って、なるべく短くプログラムを書く遊びです。

ここでは、JavaScriptを使って、このコードゴルフにチャレンジしてください。

 今回のテーマは、ゲームで使える「ワールド マップ自動生成」です。

 この自動生成方法は、前回のコードゴルフの「バイリニア補間法」の応用です。サイズの違う複数のランダムな画像を引き延ばして、重みを付けて重ね合わせています。

 こういった簡単なプログラムで、RPGなどのランダムなワールドマップを自動生成することができます。

参考リンク:
ワールド マップ自動生成
http://crocro.com/html5/world_map/index.html

 以下の関数yourCode()に書かれているコードと同じ文字列を返す処理を、なるべく短いバイト数で書いてください。

 まずは約半分の800バイト以下になるように、頑張ってください。どこまで短くできるか、頭を柔らかくして考えてください。

 短いほど評価が高いです。ただし、関数外から直接答えを取ったり、通信で答えを得るなどした場合は、ランキング外になってしまいますので、おこなわないでください。

 コードの確認は、その時点で最新のIE、Chrome、FireFoxで行います。その内、1つでもエラーが出た場合はエラーとみなします。

● 解答方法

 yourCode()で作成したコードは、テキストファイルに保存して、アップロードしてください。

(「yourCode(){★}」の、★部分だけをファイルに保存してください。無駄な文字を含めると、その文字もカウントされて不利になります)

● フィードバックと上位者のコード

 フィードバックは、文字数の判定、エラー確認、集計時点の順位を中心に行います。

 上位5位までのコードは、ランキング最終時点で、CodeIQブログ上で公開いたします。

 また今回は、上位10位までに入った方に、CodeIQ上で表示されるバッジが発行されます。頑張って上位を目指してください。

● コード
function yourCode() {
// マップ用の画素
var destW = 256;
var destH = 160;
var resArr = [];
var nMax = 8;
var nMax = 16;
var pile = (nMax * 0.4)|0;

var srcWU = (destW / 20 - 1)|0;
var srcHU = (destH / 20 - 1)|0;

for (var n = 0; n < nMax; n ++) {
	// 元の画素
	var srcW = srcWU * (n + 1);
	var srcH = srcHU * (n + 1);
	var srcArr = [];
	for (var i = 0; i < srcW * srcH; i ++) {
		// 疑似ランダム
		srcArr[i] =  ((i * i * 4999 + 8999 & 0xFFFF) / 0x10000) % 2 * 255;
	}

	// バイリニア補間後の画素
	var destArr = [];
	var scaleX = destW / (srcW - 1);
	var scaleY = destH / (srcH - 1);

	// バイリニア補間法
	for (var y = 0; y < destH; y ++) {
		for (var x = 0; x < destW; x ++) {
			var x0 = Math.floor(x / scaleX);
			var y0 = Math.floor(y / scaleY);

			var x1 = x / scaleX - x0;
			var y1 = y / scaleY - y0;

			var col0 = srcArr[x0     + (y0    ) * srcW];
			var col1 = srcArr[x0 + 1 + (y0    ) * srcW];
			var col2 = srcArr[x0     + (y0 + 1) * srcW];
			var col3 = srcArr[x0 + 1 + (y0 + 1) * srcW];

			destArr[x + y * destW] = Math.floor(
				  (1 - x1) * (1 - y1) * col0
				+      x1  * (1 - y1) * col1
				+ (1 - x1) *      y1  * col2
				+      x1  *      y1  * col3
			);
		}
	}

	// 重ね比率
	var plRes = (n + pile) / (n + pile + 1);
	var plDest = 1 / (n + pile + 1);

	// マップの合成
	for (var i = 0; i < destW * destH; i ++) {
		if (n == 0) {
			resArr[i] = destArr[i];
		} else {
			resArr[i] = Math.floor(
				resArr[i] * plRes + destArr[i] * plDest
			);
		}
	}
}

// 戻り値結合
var res = resArr.join(",");
return destW + "," + destH + "," + res;
}

【暫定順位の履歴】
暫定ランキング2013年4月29日23時時点
http://codeiq.hatenablog.com/entry/2013/04/30/002807
暫定ランキング2013年4月24日14時時点
http://codeiq.hatenablog.com/entry/2013/04/24/170649
暫定ランキング2013年4月13日16時時点
http://codeiq.hatenablog.com/entry/2013/04/13/222541

おしまい
https://codeiq.jp/ace/yanai_masakazu/q276
f:id:codeiq:20130508192250j:plain

CodeIQ中の人の一言:豚組の時間です。