Reputation: 38155
I have found the following code in CodeWars and have written the description too. It says my code passes 8 testcases and not the 9th one. Can someone give me an idea what is wrong or how should I proceed to this? I had only access to the four testcases I have in answer. https://www.codewars.com/kata/555615a77ebc7c2c8a0000b8/discuss#label-issue
'''
The new "Avengers" movie has just been released! There are a lot of people at the cinema
box office standing in a huge line. Each of them has a single 100, 50 or 25 dollars bill.
A "Avengers" ticket costs 25 dollars. Vasya is currently working as a clerk. He wants to
sell a ticket to every single person in this line. Can Vasya sell a ticket to each person
and give the change if he initially has no money and sells the tickets strictly in the
order people follow in the line? Return YES, if Vasya can sell a ticket to each person
and give the change. Otherwise return NO.
Examples:
### Python ###
tickets([25, 25, 50]) # => YES
tickets([25, 100])
# => NO. Vasya will not have enough money to give change to 100 dollars
'''
def tickets(people):
sum = 0
for p in people:
if p < 25:
return 'NO'
if p == 25:
sum += p
elif p > 25:
if (sum - p) <0 :
return 'NO'
else:
sum += p
return 'YES'
print(tickets([25, 25, 50])) #YES
print(tickets([25, 100])) #NO
print(tickets([25, 25, 50, 50, 50])) #YES
print(tickets([25, 25, 25, 25, 50, 100, 50])) #YES
Upvotes: 0
Views: 697
Reputation: 1663
To answer the question "not sure which test cases fail"; I'm guessing you mean what you are seeing in the test console is simply:
Test Results:
Test Passed
Test Passed
Right? You can see exactly what lists are being passed into the tickets
function as people
by adding a print statement:
def tickets(people):
print(people)
...
When the tests run, the console will print out what's being passed into it.
Test Results:
Log
[25, 25, 50]
Test Passed
These are all the test cases anyway:
[25, 25, 50]
[25, 100]
[25, 25, 25, 25, 25, 25, 25, 25, 25, 25]
[50, 50, 50, 50, 50, 50, 50, 50, 50, 50]
[100, 100, 100, 100, 100, 100, 100, 100, 100, 100]
[25, 25, 25, 25, 50, 100, 50]
[50, 100, 100]
[25, 25, 100]
[25, 25, 25, 25, 25, 25, 25, 50, 50, 50, 100, 100, 100, 100]
[25, 25, 50, 50, 100]
[25, 50, 50]
[25, 25, 25, 100]
[25, 50, 25, 100]
[25, 25, 25, 25, 25, 100, 100]
Upvotes: 0
Reputation: 15204
The if statement is also wrong. Think about the testcase [25, 50, 100] for the sum += p mistake and the following scenario [25, 50] for the if statement mistake. With the code bellow, both issues should be fixed.
def tickets(people):
register = {'25s': 0, '50s': 0, '100s': 0}
cash_in_register = 0
for p in people:
if p < 25:
return 'NO'
elif p == 25:
cash_in_register += p
register['25s'] += 1
else:
if (p - cash_in_register) <= 25: # do you have enough money for change?
if p == 50 and register['25s'] >= 1:
register['50s'] += 1
register['25s'] -= 1
cash_in_register += 25
elif (p == 100 and register['50s'] >= 1 and register['25s'] >= 1):
register['100s'] += 1
register['50s'] -= 1
register['25s'] -= 1
cash_in_register += 25
elif (p == 100 and register['25s'] >= 3):
register['100s'] += 1
register['25s'] -= 3
cash_in_register += 25
else:
return 'NO'
else:
return 'NO'
return 'YES'
Let me know! ☺
Upvotes: 2
Reputation: 118
I think the problem is that you don't look at the actual bills you have.
look at the testcase [25, 25, 50, 50, 50]: It should produce a "NO", but if I understand your Code correctly, yours answers "YES".
After the second 50, there is 50$ in your sum, but its one 50$ Bill. So when another customer comes in with 50$, the cashier can't give 25$ back.
Upvotes: 1