De opgave van een Letter Boxed1 puzzel bestaat uit een vierkant met één of meer letters langs elke zijde. Daarbij komt dezelfde letter nooit meer dan één keer voor.
Je vindt een oplossing door de letters rond het vierkant met elkaar te verbinden en zo een reeks woorden te vormen waarvoor geldt dat:
de reeks is volledig: alle letters rond het vierkant worden gebruikt
de reeks is opeenvolgend: de laatste letter van elk woord (behalve het laatste) is gelijk aan de eerste letter van het volgende woord
de reeks is kruisend: opeenvolgende letters van een woord staan telkens langs twee verschillende zijden
Dezelfde letter mag in de oplossing wel meerdere keren gebruikt worden. Zo vormen de drie kleuren MYSTIC, CORAL en LIVER een oplossing van bovenstaande puzzel.
Opeenvolgende letters van deze woorden zijn verbonden met een lijn waarvan de kleur correspondeert met het woord van de oplossing waarin de twee letters na elkaar voorkomen. Ook de cirkels bij de beginletters van elk woord zijn ingekleurd met die kleur.
Zowel de opgave als een mogelijke oplossing voor een Letter Boxed puzzel worden voorgesteld als een reeks woorden: een string (str) met één of meer woorden die van elkaar gescheiden worden door koppeltekens (-). Daarbij bestaat een woord uit één of meer hoofdletters.
Bij de opgave van een puzzel bestaan de woorden uit de letters die langs dezelfde zijde staan. Zo stellen we de opgave van de puzzel uit de inleiding voor als YOI-RCM-VSA-LTE en de oplossing van die puzzel als MYSTIC-CORAL-LIVER. De zijden van het vierkant worden vanaf nul genummerd op basis van de voorstelling van de opgave. Voor de opgave YOI-RCM-VSA-LTE staat de letter O bijvoorbeeld op zijde 0, de letter V op zijde 2 en de letter E op zijde 3.
Gevraagd wordt:
Schrijf een functie zijde waaraan twee argumenten moeten doorgegeven worden: i) een hoofdletter $$l$$ (str) en ii) de opgave van een puzzel. De functie moet het nummer (int) van de zijde van het vierkant teruggeven waarlangs letter $$l$$ staat in de opgave van de puzzel, of de waarde -1 (int) als letter $$l$$ niet voorkomt in de opgave van de puzzel.
Schrijf een functie isvolledig waaraan twee argumenten moeten doorgegeven worden: i) een mogelijke oplossing van een puzzel en ii) de opgave van de puzzel. De functie moet een Booleaanse waarde (bool) teruggeven die aangeeft of de mogelijke oplossing volledig is.
Schrijf een functie isopeenvolgend waaraan een mogelijke oplossing van een puzzel moet doorgegeven worden. De functie moet een Booleaanse waarde (bool) teruggeven die aangeeft of de mogelijke oplossing opeenvolgend is.
Schrijf een functie iskruisend waaraan twee argumenten moeten doorgegeven worden: i) een mogelijke oplossing van een puzzel en ii) de opgave van de puzzel. De functie moet een Booleaanse waarde (bool) teruggeven die aangeeft of de mogelijke oplossing kruisend is.
Schrijf een functie isoplossing waaraan twee argumenten moeten doorgegeven worden: i) een mogelijke oplossing van een puzzel en ii) de opgave van de puzzel. De functie moet een Booleaanse waarde (bool) teruggeven die aangeeft of de mogelijke oplossing effectief een oplossing is.
>>> zijde('O', 'YOI-RCM-VSA-LTE')
0
>>> zijde('V', 'YOI-RCM-VSA-LTE')
2
>>> zijde('E', 'YOI-RCM-VSA-LTE')
3
>>> zijde('X', 'YOI-RCM-VSA-LTE')
-1
>>> isvolledig('MYSTIC-CORAL-LIVER', 'YOI-RCM-VSA-LTE')
True
>>> isvolledig('DENIM-MAIZE-EGGPLANT', 'GND-IET-MZL-AP')
True
>>> isvolledig('GAINSBORO-ONYX-PEAR', 'BGY-NXE-PAO-SRI')
True
>>> isvolledig('KOBI-PLATINUM-ZOMP', 'TML-OZB-IUK-APN')
True
>>> isvolledig('DESERT-TEAL-LIVID', 'SIT-EVW-ADC-KLR')
False
>>> isvolledig('RUFOUS-SKOBELOFF', 'FL-XUM-SKE-BOR')
False
>>> isvolledig('DENIM-OPAL-MANDARIN', 'NMO-AI-LDR-EYP')
False
>>> isvolledig('BONE-SEPIA-BROWN', 'ODI-VAR-BEP-SNW')
False
>>> isopeenvolgend('MYSTIC-CORAL-LIVER')
True
>>> isopeenvolgend('DENIM-MAIZE-EGGPLANT')
True
>>> isopeenvolgend('GAINSBORO-ONYX-PEAR')
False
>>> isopeenvolgend('KOBI-PLATINUM-ZOMP')
False
>>> isopeenvolgend('DESERT-TEAL-LIVID')
True
>>> isopeenvolgend('RUFOUS-SKOBELOFF')
True
>>> isopeenvolgend('DENIM-OPAL-MANDARIN')
False
>>> isopeenvolgend('BONE-SEPIA-BROWN')
False
>>> iskruisend('MYSTIC-CORAL-LIVER', 'YOI-RCM-VSA-LTE')
True
>>> iskruisend('DENIM-MAIZE-EGGPLANT', 'GND-IET-MZL-AP')
False
>>> iskruisend('GAINSBORO-ONYX-PEAR', 'BGY-NXE-PAO-SRI')
True
>>> iskruisend('KOBI-PLATINUM-ZOMP', 'TML-OZB-IUK-APN')
False
>>> iskruisend('DESERT-TEAL-LIVID', 'SIT-EVW-ADC-KLR')
True
>>> iskruisend('RUFOUS-SKOBELOFF', 'FL-XUM-SKE-BOR')
False
>>> iskruisend('DENIM-OPAL-MANDARIN', 'NMO-AI-LDR-EYP')
True
>>> iskruisend('BONE-SEPIA-BROWN', 'ODI-VAR-BEP-SNW')
False
>>> isoplossing('MYSTIC-CORAL-LIVER', 'YOI-RCM-VSA-LTE')
True
>>> isoplossing('DENIM-MAIZE-EGGPLANT', 'GND-IET-MZL-AP')
False
>>> isoplossing('GAINSBORO-ONYX-PEAR', 'BGY-NXE-PAO-SRI')
False
>>> isoplossing('KOBI-PLATINUM-ZOMP', 'TML-OZB-IUK-APN')
False
>>> isoplossing('DESERT-TEAL-LIVID', 'SIT-EVW-ADC-KLR')
False
>>> isoplossing('RUFOUS-SKOBELOFF', 'FL-XUM-SKE-BOR')
False
>>> isoplossing('DENIM-OPAL-MANDARIN', 'NMO-AI-LDR-EYP')
False
>>> isoplossing('BONE-SEPIA-BROWN', 'ODI-VAR-BEP-SNW')
False
Als we zeggen dat de lengte van een oplossing het aantal letters is van alle woorden in de oplossing, dan heeft de puzzel uit de inleiding een kortste oplossing met 13 letters: MYSTICAL-LOVER. Dat in het geval dat we Engelse woorden gebruiken. Met Nederlandse woorden heeft de puzzel een kortste oplossing met 14 letters: TACTVOL-LYRISME.