読者です 読者をやめる 読者になる 読者になる

CodeIQ Blog

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

「コードゴルフ:バイリニア補間法」の最終順位の発表!+上位5位のコードの公開やってます

ランキング 問題解説

CodeIQ中の人、millionsmileです。

コードゴルフ:バイリニア補間法」の最終順位の発表です!

事前にアナウンスしていたとおり、
今回は上位5位までのコードの公開と、上位10位までの方へバッジ付与があります。

まずは順位から。

第1位は、171バイトでiehn 様です!

前回の1位は、iehn 様とrotary-o 様が並んでいたのですが、
最後の最後で、iehn 様が単独1位でゴールを切りました!スゴイ。

第2位は、177バイトでrotary-o 様。

惜しかったですね!

そして第3位は、180バイトでakiyuki 様。

最後の最後に1つ順位を上げてTOP3入りです!

よって、

「1位バッジ」はiehn 様、
「2位バッジ」はrotary-o 様、
「3位バッジ」はakiyuki 様、

にぞれぞれ付与いたします!
一人に1個しか付与されないバッジですのであなただけのバッジになります。

そして4位から10位に入った以下のみなさまには「TOP10入りバッジ」を付与します!
yammaboo 様、simbelmyn 様、beyu 様、sapics 様、ixxa 様、hogeover30 様、NOOKUMA 様、antimon2 様、ciel 様

バッジの付与はこのブログ掲載後、後日行ないます。

バッジがもらえるみなさま、おめでとうございます!!

参加してくださったみなさま、おつかれさまでした!


1位(171バイト):iehn 様
2位(177バイト):rotary-o 様
3位(180バイト):akiyuki 様
4位(185バイト):yammaboo 様
5位(192バイト):simbelmyn 様
6位(193バイト):beyu 様
7位(197バイト):sapics 様、ixxa 様
8位(201バイト):hogeover30 様、NOOKUMA 様
9位(211バイト):antimon2 様
10位(215バイト):ciel 様
11位(226バイト):hanaclone 様
12位(230バイト):catfish 様、ozy4dm 様
13位(232バイト):teruki 様
14位(249バイト):konourami 様
15位(252バイト):晋作 様
16位(255バイト):kinodjnz 様
17位(256バイト):nod 様
18位(260バイト):hid.miy 様
19位(269バイト):sch 様
20位(270バイト):setchi_ 様
21位:ayuzak 様
22位:alluser 様
23位:hirokazu 様
24位:やよい 様
25位:choro3 様、kento_r1 様
26位:suppy193 様
27位:saotome 様
28位:UTO 様
29位:kusano 様、hogefu 様
30位:koba-e964 様
31位:yatt 様、tnkayu 様
32位:Orisano 様
33位:ゆうな 様
34位:eiji_345 様
35位:kyo_ago 様
36位:dotnsf 様
37位:kumojima 様
38位:siman 様
39位:ケント 様
40位:long_long_float 様
41位:tono
42位:カツマサ 様
43位:miura 様
44位:kamiseto 様
45位:Rime0wata 様
46位:ぺーぺーSE 様
47位:taku1981 様
48位:yama3 様
49位:WizFox 様

そしてお待ちかねの上位5位のコードの公開です。

5位(192バイト):simbelmyn 様のコード

for(R=N=255,a=z=0,i=4;i||++z-80000;i%4||(a&=R+="//,\n//"[i/2|!s]+~~a))s=z%400/200,t=(z/400|0)/(40/3)%2,a+=(i&1^t?t%1:1-t%1)*(i/2&1^s?s%1:1-s%1)*(2665-N*~~s>>i++&1)*((i%=12)?N:155)+1/8;return R


4位(185バイト):yammaboo 様のコード

for(t=y=x=c=0;y<200;t=t+~~a+["\n/,"[(c=++c%3)?1:++x<400?2:++y<200?x=0:3]])for(i=4,a=.5;i--;a+=(i%2?p++%1:1-p%1)*(i<2?q++%1:1-q%1)*(p%c&q?155:q%2^~~p==c&&255))p=x/200,q=y/(40/3);return t


3位(180バイト):akiyuki 様のコード

for(i=t=r="";x=(++i/15|0)%400/200,y=i/6e3|0,y/=40/3,y<15;i%5?t+=(i&2?x++%1:1-x%1)*(i&1?y%1:1-y%1)*(x^1|n^2?255:155)*(!(n^x)^y&1^i&1):r+=~~t+"/,\n"[t=.5,!n*-~!x])n=i/5%3;return r+20


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

for(r=255,z=0;i=(++z/3%400|0)/200,j=z/1200|0,j/=40/3,a=j<15;r+=",\n/"[z%3?2:+!i]+~~s)for(s=.5;~a--;s+=(a?~i+i:~~i-i)*(k%4>0^j%2?~~j-j:~j+j)*(k-5?255:155))k=z%3-3*(~i-a);return r


1位(171バイト):iehn 様のコード

e="*(h==c^y&1?1-p:p)*(h++&c>1?155:255)+";for(r=255,z=0;(y=++z/75>>4,y/=40/3)<15;r+=",\n/"[c?2:+!x]+~~eval(1-q+e+q+e+.5))c=z%3,x=z%1200-c,p=y-~~y,h=x>600,q=x/600-h;return r

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

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

また現在掲載中のコードゴルフの問題は、このバイリニア補間法の応用編となっていますので、
上記の上位5位の方のコードを参考にしつつ、チャレンジしてみてはどうでしょうか。

新しいコードゴルフ問題はこちらから。「コードゴルフ:ワールド マップ」
https://codeiq.jp/ace/yanai_masakazu/q276

最後に今回のバイリニア補間法の問題文を以下に掲載します。

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

ここでは、JavaScriptを使って、このコードゴルフにチャレンジしてください。
今回のテーマは、画像の拡大縮小方法の1つである「バイリニア補間法」です。

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

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

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

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

● 解答方法

yourCode()で作成したコードは、テキストファイルに保存して、アップロードしてください。
(「yourCode(){★}」の、★部分だけをファイルに保存してください。
無駄な文字を含めると、その文字もカウントされて不利になります)

● コード

function yourCode() {
// 元の画素
var col = 3;
var srcW = 3;
var srcH = 16;
var srcArr = [
	[[255,  0,  0], [  0,255,  0], [  0,  0,255]],
	[[  0,255,255], [255,  0,155], [255,255,  0]],
	[[255,  0,  0], [  0,255,  0], [  0,  0,255]],
	[[  0,255,255], [255,  0,155], [255,255,  0]],
	[[255,  0,  0], [  0,255,  0], [  0,  0,255]],
	[[  0,255,255], [255,  0,155], [255,255,  0]],
	[[255,  0,  0], [  0,255,  0], [  0,  0,255]],
	[[  0,255,255], [255,  0,155], [255,255,  0]],
	[[255,  0,  0], [  0,255,  0], [  0,  0,255]],
	[[  0,255,255], [255,  0,155], [255,255,  0]],
	[[255,  0,  0], [  0,255,  0], [  0,  0,255]],
	[[  0,255,255], [255,  0,155], [255,255,  0]],
	[[255,  0,  0], [  0,255,  0], [  0,  0,255]],
	[[  0,255,255], [255,  0,155], [255,255,  0]],
	[[255,  0,  0], [  0,255,  0], [  0,  0,255]],
	[[  0,255,255], [255,  0,155], [255,255,  0]]
];

// バイリニア補間後の画素
var destW = 400;
var destH = 200;
var destArr = [];
for (var y = 0; y < destH; y ++) {
	destArr[y] = new Array(destW);
	for (var x = 0; x < destW; x ++) {
		destArr[y][x] = new Array(col);
	}
}
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[y0    ][x0    ];
		var col1 = srcArr[y0    ][x0 + 1];
		var col2 = srcArr[y0 + 1][x0    ];
		var col3 = srcArr[y0 + 1][x0 + 1];

		for (var c = 0; c < col; c ++) {
			destArr[y][x][c] = Math.round(
				  (1 - x1) * (1 - y1) * col0[c]
				+      x1  * (1 - y1) * col1[c]
				+ (1 - x1) *      y1  * col2[c]
				+      x1  *      y1  * col3[c]
			);
		}
	}
}

// 戻り値結合
for(var y = 0; y < destH; y ++) {
	for (var x = 0; x < destW; x ++) {
		destArr[y][x] = destArr[y][x].join("/");
	}
	destArr[y] = destArr[y].join(",");
}
var res = destArr.join("\n");
return res;
}

お詫び:
3月29日(金)にフィードバックが届いた13名の方に、誤って別の方のバイト数と暫定順位が届いてしまっていました。
※バイト数と暫定順位のみで、お名前など個人情報は一切書かれておりません。

誠に申し訳ありませんでした。
同様の事態を繰り返さぬよう、再発防止に努めます。

なお、その時点でCodeIQ公式ブログに掲載した順位およびバイト数は正しいものです。

2013年3月29日17時までの暫定順位
http://codeiq.hatenablog.com/entry/2013/03/29/231703

ほか、ご不明な点がありましたら、お手数ですが、
お問い合わせページよりご連絡ください。
https://codeiq.jp/inquiry.php


【暫定順位の履歴】
2013年3月29日17時までの暫定順位
http://codeiq.hatenablog.com/entry/2013/03/29/231703
2013年3月25日16時までの暫定順位
http://codeiq.hatenablog.com/entry/2013/03/26/171618
2013年3月19日10時までの暫定順位
http://codeiq.hatenablog.com/entry/2013/03/19/115652
2013年3月11日21時までの暫定順位
http://codeiq.hatenablog.com/entry/2013/03/11/220809
2013年3月7日19時までの暫定順位
http://codeiq.hatenablog.com/entry/2013/03/07/212216


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

CodeIQ中の人の一言:ネコ耳を買ってみました。