Python - taartprobleem, beginnersvraag

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • HWI17
  • Registratie: Oktober 2017
  • Laatst online: 08-05-2019
Onlangs stond in de NRC een leuk raadseltje:

"Voor een taart staan 100 mensen in de rij. De eerste krijgt 1/100 stukje taart, De tweede krijgt 2/100 van de rest van de taart. De derde krijgt daarna 3/100 en zo door. Op welke plek krijg je het grootste stuk?

Met het volgende stukje pythoncode wordt duidelijk dat nummer 10 het grootste stuk krijgt en dat klopt ook met artikeltje in de krant:

Python:
1
2
3
4
5
6
grootste = 0
taart = 100
for i in range (1,100):
    deel = i/100 * taart
    taart=taart - deel
    print (i, deel, taart, taart+deel)


Maar als ik probeer mbv python de persoon die het grootste stuk krijg er uit te filteren krijg ik steeds 8 als resultaat:

grootste = 0
taart = 100
for i in range (1,100):
deel = i/100 * taart
taart = taart - deel
if deel > grootste:
grootste = i
print (grootste)

Is er iemand die aan kan geven wat hier fout gaat? Ik ben echt heel benieuwd.

[ Voor 1% gewijzigd door Creepy op 08-10-2017 21:29 . Reden: Opgeleukt met code tags. ]

Beste antwoord (via HWI17 op 12-10-2017 09:41)


  • Z-Dragon
  • Registratie: December 2002
  • Laatst online: 10:19
Je gebruikt de variable 'grootste' dubbel. In je vergelijking verwacht je dat hij een grootte bevat en in je toekenning stop je er de index van de persoon in. Je hebt dus een extra variabele nodig om zowel bij te houden wie het grootste deel heeft gekregen als hoe groot dat deel is.

^ Wat hij zegt.

Alle reacties


Acties:
  • +1 Henk 'm!

  • Illusion
  • Registratie: November 2000
  • Nu online

Illusion

(the art of)

Wat vertegenwoordigd de variabele grootste? En wat vertegenwoordigd de variabele deel? En i?

Dus wat gaat er mis als je zegt:
Als deel > grootste
En daarna:
grootste=i

Soms ben ik er wel, en soms ook weer niet.


Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • Z-Dragon
  • Registratie: December 2002
  • Laatst online: 10:19
Je gebruikt de variable 'grootste' dubbel. In je vergelijking verwacht je dat hij een grootte bevat en in je toekenning stop je er de index van de persoon in. Je hebt dus een extra variabele nodig om zowel bij te houden wie het grootste deel heeft gekregen als hoe groot dat deel is.

^ Wat hij zegt.


Acties:
  • 0 Henk 'm!

  • Elijan9
  • Registratie: Februari 2004
  • Laatst online: 08-10 15:52
Gebruik je Python 2 of Python 3? Want voor die i/100 maakt dat heel veel uit... (Tip: voor Python 3 heb je i//100 en i/100 met verschillende resultaten.)

War is when the young and stupid are tricked by the old and bitter into killing each other. - Niko Bellic


Acties:
  • 0 Henk 'm!

  • Z-Dragon
  • Registratie: December 2002
  • Laatst online: 10:19
Elijan9 schreef op maandag 9 oktober 2017 @ 07:29:
Gebruik je Python 2 of Python 3? Want voor die i/100 maakt dat heel veel uit... (Tip: voor Python 3 heb je i//100 en i/100 met verschillende resultaten.)
Dat moet wel Python 3 zijn, want anders was er van zijn werkende stukje code ook niks terecht gekomen.

^ Wat hij zegt.


Acties:
  • 0 Henk 'm!

  • Elijan9
  • Registratie: Februari 2004
  • Laatst online: 08-10 15:52
Z-Dragon schreef op maandag 9 oktober 2017 @ 12:30:
[...]

Dat moet wel Python 3 zijn, want anders was er van zijn werkende stukje code ook niks terecht gekomen.
Ja ik zag het later pas :D Maar dan wel weer iets om als beginner in de gaten te houden, daarom had ik het toch maar laten staan...

Om te vinden wat er precies fout gaat met deze code, kun je het beste de code eens "debuggen", even stap voor stap kijken wat je verwacht en wat er daadwerkelijk gebeurt. Open jouw code (bijvoorbeeld) eens in Idle en zet dan een breakpoint op de regel "grootste = i" om te kijken wat daar elke keer gedaan wordt...

War is when the young and stupid are tricked by the old and bitter into killing each other. - Niko Bellic


Acties:
  • 0 Henk 'm!

  • Basomanb
  • Registratie: Februari 2012
  • Laatst online: 29-07-2022
In je if statement zet je grootste gelijk aan i, maar die moet je gelijk zetten aan piece. Dus zoiets:

Python:
1
2
3
4
5
6
7
8
9
10
11
12
largestPiece = 0
personWithLargestPiece = 0
cake = 100

for i in range(1,100):
    piece = i/100 * cake
    cake = cake - piece
    if piece > largestPiece:
        largestPiece = piece
        personWithLargestPiece = i

print(personWithLargestPiece)

Acties:
  • 0 Henk 'm!

  • Twieka
  • Registratie: Oktober 2010
  • Laatst online: 01-03 17:06
meer python-esque:
code:
1
2
import numpy as np
print(np.argmin(np.diff(np.cumprod([1.0-x/100.0 for x in range(0,100)])))+1)

Acties:
  • +1 Henk 'm!

  • armageddon_2k1
  • Registratie: September 2001
  • Laatst online: 27-07 10:18
Twieka schreef op dinsdag 10 oktober 2017 @ 22:39:
meer python-esque:
code:
1
2
import numpy as np
print(np.argmin(np.diff(np.cumprod([1.0-x/100.0 for x in range(0,100)])))+1)
Wat is hier Pythonesque aan? Zoveel mogelijk list comprehensions?

Een deel van PEP 20:
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Dan is het stuk van @Basomanb een stuk beter.

[ Voor 7% gewijzigd door armageddon_2k1 op 11-10-2017 07:56 ]

Engineering is like Tetris. Succes disappears and errors accumulate.


Acties:
  • 0 Henk 'm!

  • HWI17
  • Registratie: Oktober 2017
  • Laatst online: 08-05-2019
Dit was zeer leerzaam voor mij, iedereen bedankt voor de input! Het was inderdaad een kwestie van een extra variabele toevoegen, met die tip lukte het meteen om de code werkend te krijgen. De variant die gebruikt maakt van de NumPy library gaat me ver boven de pet.
Zo te zien vonden meer mensen het een leuk raadsel.
Pagina: 1