2016-05-30 5 views
1

CodeWarsのこのカタレベル6の問題については、のうち9つのテストが合格となりました。奇妙なこと:CodeWarsはどのテストケースが失敗したか教えてくれませんでした。行1のテストケースでチケットの変更が失敗したかどうかを確認します

ここに私のコードです。多分、ここの誰かが助けることができますか?どうもありがとうございます。

function tickets(peopleInLine) { 
    var totalChange = 0; 
    for (var i = 0; i < peopleInLine.length; i++) { 
    if (peopleInLine[i] === 25) totalChange += 25; 
    if (peopleInLine[i] > 25) { 
     var change = peopleInLine[i] - 25; 
     if (totalChange < change) return "NO"; 
     if (totalChange >= change) totalChange -= change;  
    } 
    } 
    return "YES"; 
} 

そしてここは質問です:

新しい "アベンジャーズ" の映画がちょうどリリースされました!映画館の興行場には、巨大なラインの中にたくさんの人がいます。それぞれ100ドル、50ドルまたは25ドルの請求書があります。 「アベンジャーズ」のチケットは25ドルかかります。

現在Vasyaは書記官として働いています。彼はこの行のすべての人にチケットを売りたがっています。

Vasyaは当初、お金がなく、人々がラインに従うように厳密にチケットを売っていれば、各人にチケットを販売し、変更を与えることができますか?

返信YES、Vasyaが各人にチケットを販売して変更を行うことができる場合は、それ以外の場合はNOを返します。

例:

tickets([25, 25, 50]) // => YES 
tickets([25, 100]) // => NO. Vasya will not have enough money to give change to 100 dollars 
+1

私はあなたが持っている*請求書*を把握する必要があると思います。 – Pointy

答えて

3

あなたが持っているそれぞれの法案をカウントする必要があります:誰かがあなたに100を与えた場合、あなただけの1 100法案で彼バック75を与えることはできません。 tickets([25,25,25, 100,100])ここ"NO" を返す必要があり素朴なソリューションです、

function tickets(peopleInLine) { 
    //var totalChange = 0; not needed 
    var total25bill = 0; 
    var total50bill = 0; 
    var total100bill = 0; 
    for (var i = 0; i < peopleInLine.length; i++) { 
    //totalChange += peopleInLine[i] 
    if (peopleInLine[i] === 25) { 
     total25bill += 1; 
    } else if (peopleInLine[i] === 50) { 
     if (total25bill >= 1) { 
      total25bill =-1; //gives back 1 25$ bill 
      total50bill += 1; 
     } else { 
      return "NO"; 
     } 
    } else if (peopleInLine[i] === 100) { 
     if ((total50bill >= 1) && (total25bill >= 1)){ 
      total25bill =-1; //gives back 1 25$ bill 
      total50bill =-1; //gives back 1 50$ bill 
      total100bill += 1; 
     } else if (total25bill >= 3){ 
      total25bill =-3; //gives back 3 25$ bill 
      total100bill += 1; 
     } else { 
      return "NO"; 
     } 
    } 
    } 
    return "YES"; 
} 
1

ウォーリーは、各法案を追跡する必要がありますあなたを指します。以下は、3つの状態変数a,b、およびcを持つ再帰的定義です.1つは各請求タイプを記録しています。

function isEmpty(xs) { return xs.length === 0; } 
function first(xs) { return xs[0]; } 
function rest(xs) { return xs.slice(1); } 

function tickets(xs) { 
    function loop(a,b,c,xs) { 
    // validate drawer, a=$25, b=$50, c=$100 
    if (a < 0 || b < 0 || c < 0) 
     return "NO"; 

    // if the drawer is valid and the line of people is empty... 
    else if (isEmpty(xs)) 
     return "YES"; 

    // otherwise, process the next person in line 
    else 
     switch (first(xs)) { 
     case 25:         
      return loop(a+1, b, c, rest(xs)); // give back $0 
     case 50: 
      return loop(a-1, b+1, c, rest(xs)); // give back $25 
     case 100: 
      return b > 0       // if drawer has a $50.. 
      ? loop(a-1, b-1, c+1, rest(xs))  // give back $25 + $50 
      : loop(a-3, b, c+1, rest(xs))  // give back 3 * $25 
      ; 
     } 
    } 
    // start the loop with 0 of each bill in the drawer 
    return loop(0,0,0,xs); 
} 

私はロジックの重複がなく、ループ内の各ブランチに対して1つの有益な戻り値しかないので、この関数が気に入っています。

ケース分析が各請求タイプのトランザクションのように見えることも好きです。

// in the case of someone paying with a $50 
// give 1 a 
// gain 1 b 
// c stays the same 
return loop(a-1, b+1, c, rest(xs)) 

このような状態の変更により、プログラムの動作について非常に簡単に判断できます。


、最も簡単な場合、$ 50と$ 25

tickets([25]) 
=> 'YES' 

1人と1人。彼を与えるために何の変化:($ 100と

tickets([50]) 
//=> 'NO' 

1人はありません。また、この人

tickets([100]) 
//=> 'NO' 

2人のための変更は、最初の$ 25に。$ 50の二人目は$ 25の変更を受け取ります

tickets([25,50]) 
//=> 'YES' 

3人。まず25ドル。第2の人物は、第1の人物の$ 25を変更します。 3人目の人は引き出しに50ドルのみで変更することはできません。

tickets([25,50,100]) 
//=> 'NO' 

上記と同じシナリオですが、$ 100請求を処理する前に追加の$ 25があります。今回は適切な変更があります。

tickets([25,50,25,100]) 
//=> 'YES' 

3 * $図25($ 75)$ 100のための有効な変更であるため、3倍の$ 25、$ 100札の前に来た場合も動作します。

tickets([25,25,25,100]) 
//=> 'YES' 
関連する問題