http://d.hatena.ne.jp/torazuka/20130626/balls
にあった問題。
私も JavaScript で書いてみた。
とりあえず、実装例を遠ざけるために無駄に改行。
埋
草
埋
草
埋
草
埋
草
埋
草
埋
草
埋
草
埋
草
埋
草
埋
草
埋
草
埋
草
埋
草
埋
草
埋
草
埋
草
埋
草
埋
草
狸
草
埋
草
埋
草
埋
草
埋
草
埋
草
埋
草
埋
草
で。
実装例。
function sign( x )
{
return (0<x) - (x<0);
}
function solve( balls )
{
function sum( indices )
{
return indices.reduce(
function( x, y ){ return x+balls[y]; }, 0
);
}
function balance( a, b ){
return "L-R"[1+sign( sum( a ) - sum( b ) )];
}
return {
"--":"unexpected",
"-L":7, "-R":6,
"RL":1, "R-":2, "RR":0,
"LL":4, "L-":5, "LR":3,
}[ balance( [0,1,2], [3,4,5] ) + balance( [0,3,6], [1,4,7] ) ];
}
function test()
{
for( var b=0 ; b<8 ; ++b ){
for( var e=0 ; e<8 ; ++e ){
var balls=[b,b,b,b,b,b,b,b,b,b];
balls[e]+=1
var t = solve( balls );
var ok = ( t===e ) ? "ok" : "***NG***";
console.log( ok, t, e );
}
}
}
test();
今朝未明にここに書いたのがちょっと気に入らなかったので修正。
sign の実装は haker's delight からの引用。こういうところは C言語風味。
solve に埋まっている JSON のキーが汚い感じだったので、ちょっと綺麗にした。
JSON を書かずに算術的にやってもいいんだけど、わかりにくくなるのでこの実装を選んだ。
C言語なら算術的に行くところだと思う。
今朝未明の実装が気に入らなかったのは、秤 を2回しか使っていないことが伝わりにくかったところ。今回は balance という関数にしたのでわかりやすいでしょ。
テストもちょっと増強した。
それにしても function の綴りが長い。
このソースコードの非空白文字に占める function の割合は 9.5%。