De code van een cijferslot bestaat uit $$n$$ cijfers, waarbij elk cijfer de waarde $$0$$ t.e.m. $$9$$ kan aannemen. In deze oefening wensen we alle mogelijke codes te genereren, waarbij vooraf gegeven is dat de code voldoet aan een aantal randvoorwaarden. Deze randvoorwaarden worden vastgelegd via een woordenboek $$w$$. De sleutels in het woordenboek zijn de gehele getallen 0 t.e.m. 9, en de waarden zijn telkens een tuple $$(a, b)$$. Indien een sleutel $$k$$ in het woordenboek voorkomt, met bijhorden waarde $$(a, b)$$, dan betekent dit dat het cijfer $$k$$ minstens $$a$$ een hoogstens $$b-1$$ keer voorkomt in de code. Indien een cijfer niet in het woordenboek voorkomt, dan zijn er geen voorwaarden verbonden aan het al dan niet voorkomen van dit cijfer.

Schrijf de functie genereer_codes() met als argumenten:

Het resultaat van de functie is een lijst van strings, waarbij elke string bestaat uit $$n$$ karakters, en elk karakter een cijfer '0' t.e.m. '9' voorstelt. Elke genereerde code moet aan de voorwaarden gedefinieerd in het woordenboek voldoen, en de lijst is gesorteed in opklimmende numerieke waarde van de code.

Voorbeeld

genereer_codes(3, {0:(1, 4), 1:(0, 1), 2:(0, 1), 3:(0, 1), 4:(1, 3), 5:(0, 1), 6:(0, 1), 7:(0, 1), 8:(0, 1)}) 
= ['004', '040', '044', '049', '094', '400', '404', '409', '440', '490', '904', '940']