Il labirinto di Kangouria

Kangourou dell’Informatica

Nel famigerato labirinto di Kangouria si perdono tutti, tranne coloro che conoscono il segreto: se siete nella stanza col numero n, imboccando la porta a sinistra vi ritroverete nella stanza col numero 2n (il doppio di n), imboccando la porta a destra finirete invece nella stanza col numero 1+2n (uno più il doppio di n).
Il guardiano vi rivela che nella stanza 69 si trova il tesoro.
Qual è il percorso per raggiungerlo partendo dalla stanza numero 1?
Fate attenzione: se sbagliate percorso sarete catturati da un mostro famelico e dovrete ripartire dall’inizio, perdendo una delle vostre 3 vite.


Vedi la discussione

1

Il codice

  1. Genera tutti i percorsi
  2. Se il percorso porta all’obiettivo verrà stampato: ['S','S','S','D','S','D']
  3. Sostituendo l’istruzione print(path) con print(str().join(path)) visualizzerà la soluzione come stringa: SSSDSD
START  = 1
FINISH = 69
path   = []
pos    = START
 
def trial(): 
    global pos 
    if(pos == FINISH): 
        print(path)      # print(str().join(path))
    elif(pos < FINISH): 
        pos = 2 * pos 
        path.append('S') 
        trial() 
        path.pop() 
        pos = pos + 1
        path.append('D') 
        trial() 
        path.pop() 
        pos = pos -  1
        pos = pos // 2
 
trial()

2

Lavorare direttamente con le stringhe semplifica il codice

  • utilizza una stringa per la soluzione: path=""
  • si ottiene come risultato la stringa SSSDSD

ma

  • è necessario cambiare le operazioni
  • il codice sarà più lento (perché la stringa è una struttura dati immutabile)
START  = 1
FINISH = 69
path   = "" 
pos    = START 
 
def trial(): 
    global path,pos 
    if(pos == FINISH): 
        print(path) 
    elif(pos < FINISH): 
        pos   = 2 * pos 
        path += 'S'
        trial() 
        path  = path[:len(path)-1] 
        pos   = pos+1
        path += 'D'
        trial() 
        path  = path[:len(path)-1] 
        pos   = pos-1
        pos   = pos//2
 
trial()

3

Dopo attenta analisi del problema…

START  = 1
FINISH = 69
path   = []
pos    = FINISH
 
while(pos != START):
    q = pos//2
    r = pos%2
 
    pos = q
 
    if(r == 0): path = ['S'] + path
    else:       path = ['D'] + path
 
print(path)