Do you need any help?

Aiuto sul funzionamento dei test esponenziali

K
Kiltei (Michele) (590 points)
2 7 10
asked Dec 15, 2020 in HW8 obbligatorio by Kiltei (Michele) (590 points)
edited Dec 16, 2020 by Kiltei (Michele)
Gli unici test che non riesco a passare sono i test esponenziali.

Non riesco a capire come approcciarmici in quanto non ho ben capito come 'leggerli'

Mi è stato detto che il numero di elementi deve essere 3^n°indizi(la)...perchè?

Non riesco a capire poi i percorsi come andrebbero seguiti, cioe in 'esempio.txt' roma+la porta a parigi e poi sono certo che dovrò seguire parigi+bocca e cosi via, ma nel caso degli esponenziali come dovrei regoarmi?

La mia funzione smette di iterare nel caso in cui ho esaurito le istruzioni del file (ossia citta+indizio+destinazione+segreto), ma in questo caso come dovrei comportarmi?

EDIT: Ho notato dalle risposte che mi sono spiegato male, io non elimino le informazioni. Salvo il contenuto del file in una matrice che scorro con enumerate, quando un'istruzione l'ho già usata la salvo in una lista a parte. Inoltre conto quante  volte citta+indizio fa partire dei percorsi (come in esempio.txt, roma-la ha 3 percorsi) questo per gestirmi le varie ramificazioni.
283 views

3 Answers

Best answer
twgever (15190 points)
7 27 105
answered Dec 15, 2020 by twgever (15,190 points)
selected Dec 16, 2020 by Kiltei (Michele)
3^n è il numero di elementi che avrà l'insieme finale. sono 3^n perchè come vedi sono 6 istruzioni. Devi considerare queste 6 istruzioni come 2 blocchetti da 3. Ogni elemento del primo blocchetto (quelli con ROMEla), si collega ai tre del secondo blocchetto. Ogni elemento del secondo blocchetto (MILANla) si collega a tutte 3 le informazioni del primo blocchetto. e così via, quindi ogni informazione ha 3 successori, ognuna di queste avrà altri 3 successori ecc... tutto questo per n volte, dove n è il numero di "la".

I percorsi vanno seguiti esattamente come vanno seguiti in esempio.txt, non cambia niente. Appena hai ROMElaMILANtoc, aggiungi toc ai segreti e MILAN diventa la città successiva. Poi avrai MILANlaROMEbang, allora aggiungi bang ai segreti e ROME sarà la città successiva.

Hai sbagliato il caso base, non devi ASSOLUTAMENTE togliere le istruzioni del file. Nessuna parte della traccia dice che le istruzioni, una volta usate, poi non possano essere RIutilizzate. Quindi ti conviene porre come caso base quando finisci gli indizi.

Fatti questi accorgimenti, non dovrebbe essere troppo difficile completare il programma.
K
Kiltei (Michele) (590 points)
2 7 10
commented Dec 16, 2020 by Kiltei (Michele) (590 points)
Ho quasi capito, credo. Mi confonde il fatto: perchè da toc arrivi a bang? non dovresti arrivare a bong? Assumendo che tic porti verso bing.

Potresti farmi l'esempio della prima iterazione, magari cosi mi sarà più chiaro.

Perdonami sono evidentemente io il problema ma non riesco a capire XD :(
twgever (15190 points)
7 27 105
commented Dec 16, 2020 by twgever (15,190 points)
tic non porta verso bing. TIC porta sia verso bong, che verso bing che verso bang. così come toc, così come tac.

per il primo la i segreti saranno
((tic,MILAN),(toc,MILAN),(tac,MILAN))

per il secondo la, invece

((tic bang, ROME),(toc bang, ROME),(tac bang, ROME),(tic bing, ROME),(toc bing, ROME),(tac bing, ROME),(tic bong,ROME),(toc bong,ROME),(tac bong,ROME))

come vedi sono 9, cioè 3^2

per il terzo la saranno 27, perchè sono tutte le combinazioni di due parole, che possono essere anche le stesse, prese da (tic toc tac), e di una parola presa da (bing bong bang)

è un più chiar adesso?
K
Kiltei (Michele) (590 points)
2 7 10
commented Dec 16, 2020 by Kiltei (Michele) (590 points)
Si più chiaro ora.

Ovviamente nel caso di exponential con 10 la, il mio set dovrà contenere tutti elementi di questo tipo (tic,toc,bang,tic ,bang,tic,tac,bang,toc,citta)

Ossia con 10 segreti più la citta per N volte. (I valori sono inseriti a caso è giusto per capirci)
twgever (15190 points)
7 27 105
commented Dec 16, 2020 by twgever (15,190 points)
sì, ma attnto che tic/tac/toc si alterna con bing/bang/bong, non avrai mai due elementi di (tic,toc,tac) consecutivi in un segreto. Chiaramente perchè ti alterni dal gruppo dei tic al gruppo dei bang.
se non si alternassero, allora avresti elementi come (tic tic tic tic tic tic tic tic tic tic, citta), invece possono solo essere (tic bang tic bang tic bang tic bang tic bang, città)
K
Kiltei (Michele) (590 points)
2 7 10
commented Dec 16, 2020 by Kiltei (Michele) (590 points)
Grazie mille proverò a tirare fuori qualcosa XD
A
Andrea420 (580 points)
1 2 5
commented Dec 16, 2020 by Andrea420 (580 points)
bene,allora il mio programma nemmeno sbaglia,mi raggiunge il limite massimo di ricorsione però, sia nel costruire la stringa del segreto completo,che nel trovare i figli....io non capisco
twgever (15190 points)
7 27 105
commented Dec 16, 2020 by twgever (15,190 points)
non saprei. Può essere che hai costruito la ricorsione in maniera tale che viene chiamata ogni singola volta, molto più di quanto dovrebbe? considera che il massimo di "profondità" che dovrebbe raggiungere nell'expo 10 dovrebbe essere tipo 10/11, quindi è molto difficile che si raggiunga il limite di chiamate.
alessio. (2780 points)
1 5 14
answered Dec 15, 2020 by alessio. (2,780 points)
Penso dipenda da come hai impostato il caso base.Può essere che non scorri veramente l'albero fino alle foglie(era cosi per me).Prova a farti uno schema su carta e concentrati sul tuo caso base,ti aiuta molto a visualizzare questa cosa del non entrare nelle foglie
d
digiorgioalessio (560 points)
0 0 3
answered Dec 16, 2020 by digiorgioalessio (560 points)
Nell'exponential il programma continua a fare la ritorsione finché non arriva all'ultimo indizio. Per spiegare il 3^n basta immaginare un albero che parte dalle 3 citta+indizi iniziali e scende ad ogni indizio nuovo. ogni volta che 'scende' il programma ha altre tre nuove frasi da vedere e cosi via. Quindi ogni "ramo" può andare su altri 3 rami, fino ad arrivare alle 3 foglie finali che ci si arriva con l'ultimo indizio. Parte fondamentale è non modificare gli indizi con un .pop() o .remove()