Je hebt je ternauwernood in de grot in veiligheid kunnen brengen, als de walvis tegen de ingang van de grot botst waardoor die instort. De sensoren van de onderzeeër geven aan dat er zich op veel grotere diepte nog een andere uitgang is, dus heb je geen andere keuze dan door te gaan.
Terwijl je onderzeeër zich een weg baant door het grottencomplex, merk je dat de viercijferige zevensegmentendisplays1 in your submarine are malfunctioning; moeten beschadigd geraakt zijn tijdens je ontsnappingspoging. Zonder de hulp van die displays kom je zwaar in de problemen, dus kan je maar beter uitzoeken wat er aan de hand is.
Elk cijfer wordt op een zevensegmentendisplay weergegeven door zeven segmenten met labels a
tot g
op de juiste manier in of uit te schakelen:
0: 1: 2: 3: 4:
aaaa .... aaaa aaaa ....
b c . c . c . c b c
b c . c . c . c b c
.... .... dddd dddd dddd
e f . f e . . f . f
e f . f e . . f . f
gggg .... gggg gggg ....
5: 6: 7: 8: 9:
aaaa aaaa aaaa aaaa aaaa
b . b . . c b c b c
b . b . . c b c b c
dddd dddd .... dddd dddd
. f e f . f e f . f
. f e f . f e f . f
gggg gggg .... gggg gggg
Om het cijfer 1
weer te geven moeten dus enkel de segmenten c
en f
ingeschakeld worden, en de rest moet uitgeschakeld worden. Om het cijfer 7
weer te geven, moeten enkel de segmenten a
, c
, en f
ingeschakeld worden.
Het probleem is dat de signalen die de segmenten besturen op elke display door elkaar gegooid zijn. De onderzeeër probeert nog steeds cijfers weer te geven door output te produceren op signaaldraden a
tot g
, maar die draden zijn op een willekeurig manier verbonden met de segmenten. Erger nog,de draad/segmentverbindingen worden voor elk viercijferig display apart verwisseld! (Alle cijfers binnen een display gebruiken echter dezelfde verbindingen.)
Je ziet dus misschien dat enkel de signaaldraden b
en g
zijn ingeschakeld, maar dat betekent niet dat de segmenten b
en g
ingeschakeld zijn: het enig cijfer dat twee segmenten gebruikt is 1
, dus dat moet betekenen dat segmenten c
en f
aan zouden moeten staan. Met alleen maar die informatie kun je dus nog steeds niet zien welke draad (b
/g
) aangesloten is op welk segment (c
/f
). Daarvoor moet je meer informatie zien te verzamelen.
Voor elke display kijk je een tijdje naar de veranderende signalen, noteer je de tien unieke signaalpatronen die je ziet, en noteer je dan één enkele viercijferige uitgangswaarde (de invoer van deze opgave). Aan de hand van de signaalpatronen zou je moeten zien te achterhalen welk patroon bij welk cijfer hoort.
Dit zou bijvoorbeeld één regel kunnen zijn die je in je notitieboek hebt opgeschreven:
acedgfb cdfbe gcdfa fbcad dab cefabd cdfgeb eafb cagedb ab | cdfeb fcadb cdfeb cdbaf
Elke regel bestaat uit tien unieke signaalpatronen, een verticale streep (|
) en daarna de viercijferige uitgangswaarde. Binnen één regel worden dezelfde draad/segmentverbindingen gebruikt (maar je weet niet welke draad met welk segment verbonden is.) De unieke signaalpatronen komen overeen met de tien verschillende manieren waarop de onderzeeër probeert een cijfer weer te geven met behulp van de huidige draag/segmentverbindingen. Omdat 7
het enige cijfer is dat drie segmenten gebruikt, betekent dab
in het voorgaande voorbeeld dat om een 7
weer te geven, de signaaldraden d
, a
, en b
ingeschakeld zijn. Omdat 4
het enige cijfer is dat vier segmenten gebruikt, betekent eafb
dat om een 4
weer te geven, signaaldraden e
, a
, f
, en b
ingeschakeld zijn.
Aan de hand van deze informatie zou je moeten kunnen bepalen welke combinatie van signaaldraden overeenkomt met elk van de tien cijfers. Daarna kan je de viercijferige uitgangswaarde decoderen. Helaas gebruiken in het voorgaande voorbeeld alle cijfers in de uitgangswaarde (cdfeb fcadb cdfeb cdbaf
) vijf segmenten en zijn dus moeilijker te decoderen.
Voorlopig concentreren we ons op de makkelijke cijfers. Neem dit grotere voorbeeld:
be cfbegad cbdgef fgaecd cgeb fdcge agebfd fecdb fabcd edb | fdgacbe cefdb cefbgd gcbe
edbfga begcd cbg gc gcadebf fbgde acbgfd abcde gfcbed gfec | fcgedb cgb dgebacf gc
fgaebd cg bdaec gdafb agbcfd gdcbef bgcad gfac gcb cdgabef | cg cg fdcagb cbg
fbegcd cbd adcefb dageb afcb bc aefdc ecdab fgdeca fcdbega | efabcd cedba gadfec cb
aecbfdg fbg gf bafeg dbefa fcge gcbea fcaegb dgceab fcbdga | gecf egdcabf bgf bfgea
fgeab ca afcebg bdacfeg cfaedg gcfdb baec bfadeg bafgc acf | gebdcfa ecba ca fadegcb
dbcfg fgd bdegcaf fgec aegbdf ecdfab fbedc dacgb gdcebf gf | cefg dcbef fcge gbcadfe
bdfegc cbegaf gecbf dfcage bdacg ed bedf ced adcbefg gebcd | ed bcgafe cdgba cbgef
egadfb cdbfeg cegd fecab cgb gbdefca cg fgcdab egfdb bfceg | gbdfcae bgc cg cgb
gcafb gcf dcaebfg ecagb gf abcdeg gaef cafbge fdbac fegbdc | fgae cfgab fg bagce
Omdat de cijfers 1
, 4
, 7
, en 8
elk een uniek aantal segmenten gebruiken, zou je moeten kunnen zien welke combinaties van signalen overeenkomen met die cijfers. Door alleen maar cijfers in de uitgangswaarden te tellen (het deel na |
op elke regel), zijn er in het voorgaande voorbeeld 26
gevallen van cijfers die een uniek aantal segmenten gebruiken (in het vet aangeduid in het voorbeeld).
Hoe vaak komen de cijfers 1
, 4
, 7
, of 8
voor in de uitgangswaarden? Bepaal dit op de volgende manier:
search
waaraan de padnaam (str
) moet doorgegeven worden van een tekstbestand met je notities over de displays van de onderzeeër. Elke regel van het bestand bevat de volgende tokens, die door spaties van elkaar gescheiden worden: tien unieke signaalpatronen, een verticale streep (|
) en een viercijferige uitgangswaarde. De functie moet teruggeven hoe vaak (int
) de cijfers 1
, 4
, 7
, of 8
voorkomen in de uitgangswaarden.In deze interactieve sessie gaan we ervan uit dat de tekstbestanden displays01.txt
2 en displays02.txt
3 zich in de huidige directory bevinden.
>>> search('displays01.txt')
26
>>> search('displays02.txt')
534