Come calcolare periodo / implementare controllo biunivoco su lista.

P
PaoloT (2030 points)
3 11 17
asked Nov 16, 2020 in HW4 obbligatorio by PaoloT (2,030 points)
Mi ritrovo bloccato da molto tempo cercando di calcolare il periodo. Ho già a disposizione la prosodia e credo di aver capito cos'è il periodo in sé ed ho letto che può essere utile creare una lista di divisori della len della prosodia, ma non capisco come usarla e come poter calcolare una corrispondenza biunivoca tra le varie parti della lista, o se esista un modo più semplice per ricavare il periodo.
348 views

2 Answers

Best answer
Romitoskj (8920 points)
4 8 40
answered Nov 16, 2020 by Romitoskj (8,920 points)
selected Nov 17, 2020 by PaoloT
Purtroppo la logica da usare per calcolare il periodo non è immediata, io stesso ci ho messo circa il 70% del tempo in cui ho scritto l'intero programma. L'approccio di che hai inizialmente è corretto, cioè vedere se esso è uno dei divisori del numero di versi della poesia (ovvero la lunghezza della lista della prosodia).

A quel punto devi verificare (partendo dal più basso perché ti serve lo schema minimo) quale di questi è un periodo valido, ovvero se il primo gruppo di lunghezza uguale al periodo è ripetuto all'interno della prosodia.

Per fare questa verifica ti basta confrontare il primo gruppo con uno alla volta tutti i gruppi seguenti dove avrai ricalcolato la prosodia a partire da 0 (se no lo schema sarà lo stesso ma i valori diversi). Ad esempio se lo schema prosodico è [0,1,1,0,2,3,3,2] e stai verificando il periodo uguale a 4 allora avrai il primo gruppo uguale a [0,1,1,0] e l'unico altro gruppo da confrontare uguale a [2,3,3,2]. Calcolando nuovamente la prosodia del secondo gruppo tornerà la lista [0,1,1,0] che per l'appunto uguale allo schema base, quindi il periodo 4 è valido.

Appena trovi un gruppo diverso dal primo saprai che quel periodo non è valido e dovrai passare al successivo, se invece sono tutti uguali al primo saprai che quel periodo è corretto.
P
PaoloT (2030 points)
3 11 17
commented Nov 17, 2020 by PaoloT (2,030 points)
Grazie mille, ho fatto dei passi avanti, però mi sono bloccato di nuovo sul punto finale. Oltre a farmi la lista di divisori della lunghezza della prosodia, cioè calcolarmi i periodi possibili, ho fatto un ciclo che per ognuno dei divisori mi splitta la prosodia in frammenti di elementi tanti quanto il periodo che provo a verificare nel ciclo. A questo punto però come verifico che il primo frammento di prosodia sia uguale alla prosodia di tutti gli altri frammenti? Ho fatto delle prove ma o mi dà un errore o fallisco la maggior parte di test per timeout
Romitoskj (8920 points)
4 8 40
commented Nov 17, 2020 by Romitoskj (8,920 points)

Semplicemente puoi ciclare su tutti i frammenti successivi e verificare che la prosodia del frammento a cui stai puntando sia uguale al primo frammento. Appena trovi una disuguaglianza interrompi il ciclo e passi al periodo successivo.

P
PaoloT (2030 points)
3 11 17
commented Nov 17, 2020 by PaoloT (2,030 points)
Scusa se ti chiedo ancora aiuto, sono riuscito ad arrivare al punto in cui il programma scorre bene tra i vari periodi possibili e le sottoliste della prosodia per far sì che, se ne trova due diversa, il ciclo si spezzi, però mi ritrovo con un problema. Avendo un for loop dentro a un altro non riesco a riuscire a far ritornare il valore giusto. Se metto un semplice return invece di verificare tutte le coppie di prosodia il programma appena ne trova due che non sono diverse tra loro restituisce il primo periodo che trova, se invece cambio indentazione il programma anche se non trova alcuna coppia che non sia uguale (e quindi trova il periodo giusto), ritorna semplicemente al for loop precedente che scorre i periodi possibili.
Come posso fare per far sì che il programma ritorni il periodo solo se tutte le coppie siano uguali, e non se solo 2 lo sono?
Romitoskj (8920 points)
4 8 40
commented Nov 17, 2020 by Romitoskj (8,920 points)
Prova a tenere traccia della validità del periodo in una variabile booleana che fi default è a true, appena trovi un frammento non uguale al primo lo imposti a false e interrompi il ciclo interno. Allora passerai al numero successivo reimpostando la variabile a true, che se riesce ad arrivare alla fine del ciclo interno significa che la variabile è rimasta a true quindi il periodo è valido.
P
PaoloT (2030 points)
3 11 17
commented Nov 17, 2020 by PaoloT (2,030 points)
Grazie mille davvero, finalmente ho risolto, qualche test va in timeout ma ora penso di riuscire a risolvere.
Romitoskj (8920 points)
4 8 40
commented Nov 17, 2020 by Romitoskj (8,920 points)
Sono contento che tu ce l'abbia fatta!
Loriv3 (7970 points)
8 20 84
answered Nov 17, 2020 by Loriv3 (7,970 points)
Ciao, non so se può esserti utile ma ad esempio io per cercare questa cosa semplicemente mi ritraduco di nuovo le liste che ottengo(usando lo stesso procedimento di come mi dono trovato i diversi elementi sonori) e vedo se ogni elemento della lista tradotto sia uguale al primo elemento della lista splittata. Potrebbe essere assolutamente poco efficiente però funziona