Terwijl je buur vrolijk geniet van haar computerspel, richt je je aandacht op de open datapoort naast het kleine schermp op de stoel voor je.

Hoewel het geen standaard poort is, slaag je erin om hem op je computer aan te sluiten door slim gebruik te maken van een aantal paperclips. Na het aansluiten komt er uit de poort een reeks cijfers.

De gegevens blijken versleuteld te zijn met het eXchange-Masking Addition System (XMAS) dat — handig voor jou — een oude codeersleutel is met een belangrijk zwak punt.

XMAS begint met het verzenden van een preambule van 25 getallen. Daarna moet elk getal dat je ontvangt de som zijn van twee van de getallen die er onmiddellijk aan voorafgaan. De twee getallen hebben verschillende waarden en er kan meer dan één paar getallen zijn die als som het getal opleveren.

Stel bijvoorbeeld dat de preambule bestaat uit de getallen 1 tot en met 25 in een willekeurige volgorde. Om geldig te zijn, moet het volgende getal de som zijn van twee van die getallen:

Stel dat het 26e getal 45 is en het eerste getal (dat niet langer in aanmerking komt, omdat het meer dan 25 getallen geleden is) was 20. Opdat het volgende getal geldig zou zijn, moet er tussen 1-19, 21-25 of 45 een paar getallen voorkomen die als som het getal opleveren:

Hier is een groter voorbeeld dat enkel rekening houdt met de vorige 5 getallen (en dus een preambule heeft van lengte 5):

35
20
15
25
47
40
62
55
65
95
102
117
150
182
127
219
299
277
309
576

In dit voorbeeld is na de preambule van 5 getallen bijna elk getal de som van twee van de voorgaande 5 getallen. Het enige getal dat hier niet aan voldoet, is 127.

Opgave

De eerste stap om de zwakte in de XMAS-gegevens uit te buiten, is het eerste getal in de lijst te vinden (na de preambule) dat niet de som is van twee van de \(m\) getallen ervoor, met \(m\) de lengte van de preambule. Wat is het eerste getal dat deze eigenschap niet bezit? Hiervoor ga je als volgt te werk:

Voorbeeld

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

> findError("numbers.txt", 5)
127