Terwijl je uit het raam aan het kijken bent en langzaamaan een zwaar bebost continent aan de horizon ziet verschijnen, word je onderbroken door het kind dat naast je zit. Ze is benieuwd of je kunt helpen met haar huiswerk voor wiskunde.
Helaas lijkt het alsof deze “wiskunde” andere regels volgt1 dan hoe jij het geleerd hebt.
Het huiswerk (de invoer van deze opgave) bestaat uit een reeks uitdrukkingen die bestaan uit optellingen (+
), vermenigvuldigingen (*
) en haakjes ((...)
). Net als bij gewone wiskunde moet een uitdrukking binnen de haakjes eerst geëvalueerd worden voor deze kan gebruikt worden door de uitdrukking buiten de haakjes. De optelling levert nog steeds de som op van de getallen aan beide zeiden van de bewerking, en de vermenigvuldigng levert nog stees het product op.
De regels voor de volgorde van de bewerkingen zijn echter veranderd. In plaats van de vermenigvuldiging voor de optelling te evalueren, hebben deze bewerkingen nu dezelfde prioriteit en worden ze van links naar rechts geëvalueerd, ongeacht de volgorde waarin ze voorkomen.
Dit zijn bijvoorbeeld de stappen die uitgevoerd worden om de uitdrukking 1 + 2 * 3 + 4 * 5 + 6
te evalueren:
1 + 2 * 3 + 4 * 5 + 6
3 * 3 + 4 * 5 + 6
9 + 4 * 5 + 6
13 * 5 + 6
65 + 6
71
Haakjes kunnen de volgorde beïnvloeden. Dit is bijvoorbeeld wat er gebeurt als we haakjes toevoegen en de uitdrukking omvormen tot 1 + (2 * 3) + (4 * (5 + 6))
:
1 + (2 * 3) + (4 * (5 + 6))
1 + 6 + (4 * (5 + 6))
7 + (4 * (5 + 6))
7 + (4 * 11 )
7 + 44
51
Hier zijn nog enkele voorbeelden:
2 * 3 + (4 * 5)
wordt 26
.5 + (8 * 3 + 9 + 3 * 4 * 3)
wordt 437
.5 * 9 * (7 * 3 * 3 + 9 * 3 + (8 + 6 * 4))
wordt 12240
.((2 + 4 * 9) * (6 + 9 * 8 + 6) + 6) + 2 + 4 * 2
wordt 13632
.Voor je kan helpen met het huiswerk, moet je het eerst zelf begrijpen. Evalueer de uitdrukking op elke regel van het huiswerk. Wat is de som van de waarden die je op die manier bekomt? Hiervoor ga je als volgt te werk:
evaluate
waaraan een uitdrukking moet doorgegeven worden (String
). De functie moet het resultaat (int
) van de uitdrukking teruggeven.homework
waaraan de padnaam (String
) van een tekstbestand met een reeks uitdrukkingen moet doorgegeven worden, één uitdrukking per regel. De functie moet de som (int
) van de resultaten van deze uitdrukkingen teruggeven.Deze statische functies moet zich in de klasse Submission
bevinden.
In deze interactieve sessie gaan we ervan uit dat het tekstbestand homework.txt
2 zich in de huidige directory bevindt.
> Submission.evaluate("1 + 2 * 3 + 4 * 5 + 6")
71
> Submission.evaluate("1 + (2 * 3) + (4 * (5 + 6))')
51
> Submission.evaluate("2 * 3 + (4 * 5)')
26
> Submission.evaluate("5 + (8 * 3 + 9 + 3 * 4 * 3)')
437
> Submission.evaluate("5 * 9 * (7 * 3 * 3 + 9 * 3 + (8 + 6 * 4))')
12240
> Submission.evaluate("((2 + 4 * 9) * (6 + 9 * 8 + 6) + 6) + 2 + 4 * 2')
13632
> Submission.homework("homework.txt")
26457