2016-05-13 21 views
1
// require '04_wonky_coins' 
// require 'rspec' 
// 
// # Catsylvanian money is a strange thing: they have a coin for every 
// # denomination (including zero!). A wonky change machine in 
// # Catsylvania takes any coin of value N and returns 3 new coins, 
// # valued at N/2, N/3 and N/4 (rounding down). 
// # 
// # Write a method `wonky_coins(n)` that returns the number of coins you 
// # are left with if you take all non-zero coins and keep feeding them 
// # back into the machine until you are left with only zero-value coins. 
// # 
// # Difficulty: 3/5 
// 
// describe "#wonky_coins" do 
// it "handles a coin of value 1" do 
//  wonky_coins(1).should == 3 
// end 
// 
// it "handles a coin of value 5" do 
//  wonky_coins(5).should == 11 
//  # 11 
//  # => [2, 1, 1] 
//  # => [[1, 0, 0], [0, 0, 0], [0, 0, 0]] 
//  # => [[[0, 0, 0], 0, 0], [0, 0, 0], [0, 0, 0]] 
// end 
// 
// it "handles a coin of value 6" do 
//  wonky_coins(6).should == 15 
// end 
// 
// it "handles being given the zero coin" do 
//  wonky_coins(0).should == 1 
// end 
// end 
function check_coins(hand){ 
    for(var i=0; i<hand.length; i++){ 
    var coin = hand[i] 
    if(coin !==0){ 
     return i; 
    } else { 
     return null; 
    } 
    } 
    return false; 
} 


function wonkyCoins(n){ 
    var hand = []; 

    hand.push(Math.floor(n/2)); 
    hand.push(Math.floor(n/3)); 
    hand.push(Math.floor(n/4)); 




while(check_coins(hand){ 

    var indx = check_coins(hand); 


    var value = hand[indx]; 

    var index1 = hand.indexOf(hand[indx]); 

    if (index1 > -1) { 
    hand.splice(index1, 1); 
    } 


    hand.push(Math.floor(value/2)); 
    hand.push(Math.floor(value/3)); 
    hand.push(Math.floor(value/4)); 

} 

return hand.length; 

} 

プログラムは動作していますが、何らかの理由でwhileループがループしていません。私は条件に何か問題があると思う。私はjavaScriptがそのような条件を受け入れるかどうかはわかりません。しかし、Rubyではそれがうまくいきました。 誰かがなぜ私のために説明してくださいできないのですか?whileループは実行されていないか、ループしていませんか?

+1

while条件に括弧がありませんか? – joshuanapoli

答えて

2

whileループ条件パラメータを閉じるためにかっこの括弧が欠けています。あなたのコードは実際には次のようになります:

while(check_coins(hand)){ 

    ... 

} 

これはうまくいかない場合は、おそらく状態そのものでしょう。試してください:

while(check_coins(hand) !== null){ 

... 

} 
+0

ありがとう、それは第二の選択肢でした。 –

0

while文は次のように固定する必要があります。

while (check_coins(hand)) { 

またcheck_coins機能のみ、最初のコインをチェックしているように見える、とそれらすべてをチェックするために変更する必要があります。また、条件に応じて整数、ブール値、またはヌル値のいずれかを返します。整数(最初のゼロ以外のコインのインデックス)またはヌル(ゼロ以外のコインなし)を返します。

固定コードは次のようになります。

function check_coins(hand){ 
    for (var i=0; i < hand.length; i++) { 
     if (hand[i] > 0) { 
      return i; 
     } 
    } 
    return null; 
} 

function wonkyCoins(n) { 
    var hand = []; 

    hand.push(Math.floor(n/2)); 
    hand.push(Math.floor(n/3)); 
    hand.push(Math.floor(n/4)); 

    while ((indx = check_coins(hand)) != null) { 
     var value = hand[indx]; 
     var index1 = hand.indexOf(hand[indx]); 

     if (index1 > -1) { 
      hand.splice(index1, 1); 
     } 

     hand.push(Math.floor(value/2)); 
     hand.push(Math.floor(value/3)); 
     hand.push(Math.floor(value/4)); 
    } 

    return hand.length; 
} 

コードはJavascriptそれをより読みやすく、慣用的にするためにクリーンアップされています。しかし、テストされていません。

関連する問題