LoginSignup
3
3

More than 5 years have passed since last update.

あなたは8つの同じサイズのボールを持っています(JavaScript)

Last updated at Posted at 2013-06-26

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%。

3
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3