2016-05-30 89 views
1

對於CodeWars上的此Kata Level 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目前是一名職員。他想把票賣給這條線上的每一個人。

Can Vasya可以向每個人出售一張門票,如果他最初沒有錢,並且按照人們遵循的順序嚴格銷售門票,那麼可以給予更改?

返回,如果Vasya可以賣票給每個人並給予改變。否則返回

例子:

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,你不能給他帶回75只用一個100法案。 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

WALLE點你,你將不得不跟蹤每個法案。下面是一個遞歸定義,其中有3個狀態變量,分別爲a,bc,其中一個用於跟蹤每個賬單類型。

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); 
} 

我喜歡這個函數,因爲沒有邏輯重複,並且循環中每個分支只有一個合理的返回值。

我也喜歡案例分析看起來像每個賬單類型的交易。

// 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)) 

這些狀態變化使得很容易推斷出程序的行爲。


最簡單的情況下,1人以$ 25

tickets([25]) 
=> 'YES' 

1人用$ 50。有沒有變化給他:(

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

1人用$ 100。也因爲這個人

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

2人沒有變化,先用$ 25。50美元的第二人得到25美元的變化

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

3人。首先是25美元。第二個人獲得第一個人的25美元的變化。我們不能爲抽屜裏只有50美元的第三人做出改變。

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

相同的情況之上,但有一個額外的$ 25我們處理$ 100的法案之前。這一次我們有足夠的改變。

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

它也可以工作,如果3美元25美元來到100美元的賬單之前,因爲3美元25美元(75美元)是100美元的有效變化。

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