Terwijl je naar alweer een volgende vlucht aan het wandelen bent, kom je tot het besef dat één van de volgende etappes van je omgeleide reis per hogesnelheidstrein verloopt. Het treinticket dat je hebt gekregen, is echter in een voor jou onbegrijpelijke taal. Voordat je na de volgende vlucht naar het trainstation gaat, zal je waarschijnlijk moeten uitzoeken wat er precies staat.

Helaas kan je de woorden op het ticket niet echt lezen. Wat je wel kan lezen zijn de getallen, waardoor je kan uitzoeken welke velden er op de tickets moeten staan en welke mogelijke waarden deze velden kunnen hebben.

Je verzamelt de regels voor de velden op de tickets, de getallen op jouw ticket en de getallen op andere naburige tickets voor dezelfde reisroute (via de beveiligingscamera’s van de luchthaven), en zet die samen in één enkel document (de invoer van deze opgave).

De regels voor de velden op de tickets vormen een lijst met velden die ergens op het ticket voorkomen en de mogelijke waarden voor elk veld. Zo betekent de regel class: 1-3 or 5-7 bijvoorbeeld dat één van de velden op elk ticket de naam class heeft en dat elke waarde in de intervallen 1-3 of 5-7 moet liggen (grenzen inbegrepen, waardoor zowel 3 als 5 mogelijke waarden zijn voor dit veld, maar 4 niet).

Elk ticket wordt voorgesteld door één enkele regel met waarden die van elkaar gescheiden worden door komma’s. De waarden zijn de getallen op het ticket, in de volgorde waarop ze op het ticket staan. Elk ticket heeft hetzelfde formaat. Nemen we bijvoorbeeld dit ticket:

.--------------------------------------------------------.
| ????: 101    ?????: 102   ??????????: 103     ???: 104 |
|                                                        |
| ??: 301  ??: 302             ???????: 303      ??????? |
| ??: 401  ??: 402           ???? ????: 403    ????????? |
'--------------------------------------------------------'

Hierbij staat ? voor tekst in een taal die je niet begrijpt. Dit ticket kan voorgesteld worden als 101,102,103,104,301,302,303,401,402,403. Uiteraard zijn de werkelijke treintickets die jij moet bekijken veel gecompliceerder. Maar in elk geval heb je de getallen zo verzameld dat het eerste getal altijd uit hetzelfde specifieke veld komt, het tweede getal altijd uit een ander specifiek veld, enzoverder. — je weet gewoon niet wat elke positie eigenlijk betekent!

Begin eerst met bepalen welke tickets zeker ongeldig zijn. Dit zijn tickets die waarden bevatten die voor geen enkel veld geldig zijn. Je eigen ticket mag je voorlopig negeren.

Stel dat je bijvoorbeeld de volgende gegevens verzameld hebt:

class: 1-3 or 5-7
row: 6-11 or 33-44
seat: 13-40 or 45-50

your ticket:
7,1,14

nearby tickets:
7,3,47
40,4,50
55,2,20
38,6,12

Het doet er niet toe welke positie overeenkomt met welk veld. Je kan ongeldige naburige tickets identificeren door te kijken of ze waarden bevatten die voor geen enkel veld geldig zijn. In dit voorbeeld zij alle waarden op het eerste naburige ticket geldig voor ten minste één veld. Dit geldt niet voor de drie andere naburige tickets: de waarden 4, 55 en 12 zijn ongeldig voor elk veld. Als je alle ongeldige waarden bij elkaar optelt, dan krijg je het foutpercentage voor het scannen van tickets: 4 + 55 + 12 = 71.

Opgave

Controleer de geldigheid van de naburige tikets die je gescand hebt. Wat is het foutpercentage bij het scannen van die tickets? Hiervoor ga je als volgt te werk:

Voorbeeld

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

> errorRate("tickets.txt")
71