Je vraagt de onderzeeër om de beste route uit de diepzeegrot te bepalen, maar zijn antwoord luidt:
Syntax error in navigation subsystem on line: all of them
Allemaal?! De schade is erger dan je dacht. Je opent de code van het navigatie-subsysteem (de invoer van deze opgave).
De syntaxis van het navigatie-subsysteem bestaat uit meerdere regels die chunks bevatten. Elk regel bestaat uit één of meer blokken, en blokken bevatten nul of meer andere blokken. Aangrenzende blokken worden niet van elkaar gescheiden door een scheidingsteken: als een blok stop dan kan er daarna onmiddellijk een nieuw blok beginnen. Elk blok moet openen en sluiten met één van de vier geldige paren van overeenkomstige karakters:
(
, dan moet het sluiten met )
.[
, dan moet het sluiten met ]
.{
, dan moet het sluiten met }
.<
, dan moet het sluiten met >
.Op die manier is ()
een geldig blok dat geen andere blokken bevat, net als []
. Complexere maar eveneens geldige blokken zijn onder andere ([])
, {()()()}
, <([{}])>
, [<>({}){}[([])<>]]
, en zelfs (((((((((())))))))))
.
Sommige regels zijn onvolledig, maar andere zijn beschadigd. Zoek eerst de beschadigde regels en gooi ze weg.
Een beschadigde regel is er een waar een blok sluit met het verkeerde karakter - dat wil zeggen, waarbij de karakters die het blok openen en sluiten niet één van de vier geldige paren van overeenkomstige karakters vormen zoals we die hierboven gegeven hebben.
Voorbeelden van beschadigde blokken zijn (]
, {()()()>
, (((()))}
, en <([]){()}[{}])
. Zo’n blok kan overal op een regel voorkomen, en de aanwezigheid ervan zorgt ervoor dat we de hele regel als beschadigd beschouwen.
Neem bijvoorbeeld het volgende navigatie-subsysteem:
[({(<(())[]>[[{[]{<()<>>
[(()[<>])]({[<{<<[]>>(
{([(<{}[<>[]}>{[]{[(<()>
(((({<>}<{<{<>}{[]{[]{}
[[<[([]))<([[{}[[()]]]
[{[{({}]{}}([{[{{{}}([]
{<[[]]>}<{[{[{[]{()[[[]
[<(<(<(<{}))><([]([]()
<{([([[(<>()){}]>(<<{{
<{([{{}}[<[[[<>{}]]]>[]]
Sommige van die regels zijn niet beschadigd, alleen maar onvolledig. Je kunt de onvolledige regels voorlopig negeren. De overige vijf regels zijn beschadigd.
{([(<{}[<>[]}>{[]{[(<()>
- Verwachtte ]
, maar vond in plaats daarvan }
.[[<[([]))<([[{}[[()]]]
- Verwachtte ]
, maar vond in plaats daarvan )
.[{[{({}]{}}([{[{{{}}([]
- Verwachtte )
, maar vond in plaats daarvan ]
.[<(<(<(<{}))><([]([]()
- Verwachtte >
, maar vond in plaats daarvan )
.<{([([[(<>()){}]>(<<{{
- Verwachtte ]
, maar vond in plaats daarvan >
.Stop bij het eerst verkeerd sluitend karakter op elke beschadigde regel.
Wist je dat syntaxis-checkers eigenlijk wedstrijden houden om te zien wie de hoogste score kan halen voor het opsporen van syntaxisfouten in een bestand? Het is echt waar! Om de score van de syntaxisfout voor een beschadigde regel te berekenen, bepaal je het eerste verkeerd sluitend karakter op de regel en zoekt de bijhorende score op in de volgende tabel:
)
: 3
punten.]
: 57
punten.}
: 1197
punten.>
: 25137
punten.In bovenstaand voorbeeld werd twee keer een verkeerd )
gevonden (\(2 \times 3 = 6\) punten), één keer een verkeerd ]
(57
punten), één keer een verkeerde }
(1197
punten), en één keer een verkeerd >
(25137
punten). De totale score voor de syntaxisfouten in dit bestand is dus \(6 + 57 + 1197 + 25137 = 26397\) punten!
Zoek het eerste verkeerd sluitende karakter op elke beschadigde regel van het navigatie-subsysteem. Wat is de totale score voor al die syntaxisfouten? Bepaal dit op de volgende manier:
score
waaraan de padnaam (str
) moet doorgegeven worden van een tekstbestand met de code van een navigatie-subsysteem. De functie moet de totale score (int
) voor alle syntaxisfouten in het navigatie-subsysteem teruggeven.In deze interactieve sessie gaan we ervan uit dat de tekstbestanden subsystem01.txt
1 en subsystem02.txt`2 zich in de huidige directory bevinden.
>>> score('subsystem01.txt')
26397
>>> score('subsystem02.txt')
389589
We vroegen de Elfen om wat tips & tricks waarmee deze opgave kan opgelost worden, maar ze stuurden alleen deze GIF terug.