paizaの恋愛SLGの水着とサンタ服がゲットできない……

先日、paizaからプログラミングで彼女を作るゲームが発表されました。
恋愛SLG: プログラミングで彼女をつくる|paizaオンラインハッカソン7
参考:プログラミングさえできれば誰でも彼女がつくれる恋愛シミュレーションゲーム「プログラミングで彼女をつくる」 – GIGAZINE

内容は出題されたプログラミングの問題を解くと、その問題にあわせて彼女用のパーツや衣装をゲットできるというもの。

とりあえずコツコツやって、全部ゲットできたらブログに「彼女ができました」というエントリーでも書こうかと思ったのですが、何度やっても「水着」と「サンタ服」をゲットできないでいます。どちらも、提出前動作確認では合格するのですが、テストケースで失敗します(サンタ服のほうなんて、テストケース3までは合格しますが、4で失敗します)。テストケースはデバッグできないのでほとほと困っています。

試したコードは下記です。

process.stdin.resume();
process.stdin.setEncoding('utf8');
// 自分の得意な言語で
// Let's チャレンジ!!
process.stdin.on('data', function (chunk) {
    var num = ~~(chunk-0);
    var kaijou = 1;
	var kazu = 1;
	
    for(var i = 2; i <= num; i++){
		kazu = i;
		// 10の累乗なら何もしない
		if((/^10+$/).test(kaijou.toString())) continue;
		// 5の倍数なら現在の数を2で割ってかける数を5で割る
		while(kazu % 5 === 0){
			kaijou /= 2;
			kazu /= 5;
		}
		kaijou *= kazu;
		// 10桁以上なら、9桁にしてる
		if(kaijou >= 1000000000){
			kaijou = kaijou % 1000000000;
		}
    }
    console.log(kaijou);
});
process.stdin.resume();
process.stdin.setEncoding('utf8');
// 自分の得意な言語で
// Let's チャレンジ!!
process.stdin.on('data', function (chunk) {
    var line = chunk.toString().split('\n');
    var x = line[0].split(' ')[0]-0;
    var y = line[0].split(' ')[1]-0;
    var z = line[0].split(' ')[2]-0;
    var n = line[0].split(' ')[3]-0;
    var xz_cut = [x], yz_cut = [y];
    var min_xz = x, min_yz = y;
    
    // 前面と側面を切り取り位置の配列を作成
    for(var i=1; i<=n; i++){
        if( line[i].split(' ')[0]-0 === 0 ){
            xz_cut.push( line[i].split(' ')[1]-0 );
        }else{
            yz_cut.push( line[i].split(' ')[1]-0 );
        }
    }
    xz_cut = xz_cut.sort( function(a,b){ return a>b } );
    yz_cut = yz_cut.sort( function(a,b){ return a>b } );
    min_xz = xz_cut[0];
    // 前面位置の最小切り取り幅を抽出
    for(i=0; i<xz_cut.length-1;i++){
        if( xz_cut[i+1]-xz_cut[i] === 0 ) continue;
        min_xz = Math.min( min_xz, xz_cut[i+1]-xz_cut[i] );
    }
    min_yz = yz_cut[0];
    // 側面位置の最小切り取り幅を抽出
    for(i=0; i<yz_cut.length-1;i++){
        if( yz_cut[i+1]-yz_cut[i] === 0 ) continue;
        min_yz = Math.min( min_yz, yz_cut[i+1]-yz_cut[i] );
    }
    console.log(min_xz*min_yz*z);
});

これを実際にブラウザ上で動作するようにしてみたのが下記のページ
paizaのサンタ服と水着ゲットチャレンジ

水着ゲットチャレンジで38を入力すると742912となりますし、サンタ服ゲットチャレンジで問題ページの入力例2を入力すると240になり、何が間違っているのか全く分からないでいます。環境がNode.jsとブラウザ(Chrome)で違うというのがあるのかもしれませんが、paiza.IOでもうまくいっているように見受けられるので、多分環境が原因ではないと思います。

誰か失敗する原因が分かる方はヒントを教えて下さい(失敗するテストケース等)。

コメント

  1. 山本八蔵 より:

    はじめまして。文字列などを使わず整数で正統派な感じでやっていて惜しいように見えたので、コメントさせてください。

    水着のコードちょろっとみただけですが、いくつか思った点を。
    多分25とか125とか、5の累乗とそこからいくつか上の数は計算に失敗すると思います。
    なぜなら、割ると有効桁数が減るからです。わかりやすく5の4乗=625の時を考えてみますと、kaijouからは2の4乗、つまり16で割られます。10以上の数で割るわけですから、どのような時でも1桁以上減ります。つまり9桁の有効桁数を保てていないように見えます。

    第二に、9桁で削ったものに対して2で割ることを、削ってないものにたいして割るのと同じように使っている点が問題だと思います。
    わかりやすい例でいうと有効数字2桁だと仮定すると
    162を2でわると81になりますが
    162を2桁にして62にしたあと2でわると31になります。
    乗算の場合は、位の高いほうに対してしか影響を与えないのでそのままかけても問題ありませんが、割り算は位の低いほうへ影響するので、有効桁数を削ったものを割る、という操作はやらないほうがよいかと思います。

    • amyu より:

      コメントありがとうございます。

      少し考えてみたら分かりそうなことなのに、全く気付きませんでした……。割り算したらそりゃ桁数減りますよね……。

      この度は本当に、ありがとうございます。助かりました。
      おかえで、水着をゲットすることができました!

タイトルとURLをコピーしました