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:

Opgave

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:

Voorbeeld

In deze interactieve sessie gaan we ervan uit dat het tekstbestand homework.txt2 zich in de huidige directory bevindt.

> evaluate("1 + 2 * 3 + 4 * 5 + 6")
71
> evaluate("1 + (2 * 3) + (4 * (5 + 6))')
51
> evaluate("2 * 3 + (4 * 5)')
26
> evaluate("5 + (8 * 3 + 9 + 3 * 4 * 3)')
437
> evaluate("5 * 9 * (7 * 3 * 3 + 9 * 3 + (8 + 6 * 4))')
12240
> evaluate("((2 + 4 * 9) * (6 + 9 * 8 + 6) + 6) + 2 + 4 * 2')
13632

> homework("homework.txt")
26457