Please ignore secret bonuses. Secret tests do NOT award bonus. Max hw grade is 30+2 bonus efficiency

Do you need help?

Notice Board

Per partecipare al corso di Fondamenti di programmazione 2023-24 loggatevi e attivatelo nella vostra pagina dei corsi preferiti. A quel punto il corso appare nel menù personale cliccando sul proprio avatar. Per i materiali degli anni precedenti seguite lo stesso metodo.

To join the Programming/Lab 2023-24 course, log-on and select it on the my courses page. It will appear on the personal menu of your avatar. For earlier years use the same method.

Consigli HW8

E
Elenith (400 points)
7 13 15
in HW8 by (400 points)
closed by
Ciao a tutti, ho iniziato da poco a fare l'hm8 perché purtroppo ho avuto problemi di salute fino a poco fa, quindi volevo chiedere consigli su come svolgere l'homework. Io personalmente avevo pensato a una funzione che prendesse la stringa encrypted_text e la dividesse e rimischiasse più volte e successivamente utilizzare il dizionario pharaohs_cypher per tradurre le varie parti. Tuttavia non so se potrebbe essere una soluzione efficace.
139 views
closed

2 Answers

Best answer
AL1990 (28120 points)
3 6 142
by (28.1k points)
selected by

Fai attenzione, non devi dividere e rimischiare la stringa encrypted_text. 
Quello che la tua funzione deve fare è controllare se nella stringa encrypted_text che gli viene passata, ci sono delle sottostringhe "quasi-anagrammi".
Un "quasi-anagramma" è una sottostringa che ha lunghezza len(chiave)+1; è infatti formata da tutti i caratteri di una delle chiavi del dizionario pharaohs_cypher (che viene passato alla funzione) + un carattere spurio in più, il carattere spurio si può trovare all'inizio, alla fine o all'interno della sottostringa e può essere anche uguale ad uno dei caratteri della chiave (in pratica togliendo il carattere spurio ottieni un anagramma della chiave). Una volta individuato il quasi-anagramma, devi sostituirlo con il valore associato alla chiave che trovi nel dizionario, finché trovi nuovi quasi-anagrammi nella stringa devi continuare ad effettuare le sostituzioni. Guarda l'esempio inserito dal professore nella pagina dell'homework e la successione delle sostituzioni, forse può chiarirti il concetto: https://q2a.di.uniroma1.it/29562/hw-homework-8-obbligatorio-prima-scadenza-ore-23-59-del-16-12?course=hw8/homeworks/fondamenti-di-programmazione-23-24
Inoltre riguardati la lezione su ricorsione e alberi di gioco, infatti in base sia all'ordine delle sostituzioni che effettui sia a dove cominci a sostituire all'interno della stringa, arriverai a più risultati: devi immaginare che ogni volta che esamini una stringa, questa stringa è un nodo dell'albero, ogni sostituzione che effettui creerà una nuova stringa che sarà una foglia, a sua volta ogni foglia andrà esaminata e diventerà un nodo se ci saranno all'interno delle sostituzioni da effettuare. Alla fine devi raccogliere tutte le foglie create e restituire in un set solo quelle più corte.

AL1990 (28120 points)
3 6 142
by (28.1k points)
Metti che hai come stringa iniziale 'lezione di python' e stai controllando la coppia chiave-valore 'zeio': 'an', cominci a controllare la stringa per vedere se trovi quasi-anagrammi della chiave, per fare questo devi controllare tutte le sottostringhe che hanno lunghezza len(chiave)+1, perché il quasi-anagramma è formato dai caratteri della chiave più un carattere spurio.
N.b. le chiavi possono avere lunghezza diversa tra di loro, inoltre possono avere caratteri uguali all'interno.
Prendi la prima sottostringa di lunghezza 5 che trovi in 'lezione di python': 'lezio'. Come individui il carattere spurio? Puoi procedere a costruire n nuove sottostringhe, per esempio tramite slice e concatenazione, andando a togliere di volta in volta un carattere. Non puoi sapere qual è il carattere spurio, quindi devi valutare se almeno una sottostringa che ottieni è un anagramma della chiave. Quindi da 'lezio' ottieni le sottostringhe 'ezio', 'lzio', 'leio', 'lezo' e 'lezi' che hanno la stessa lunghezza della chiave, controlli a questo punto se una delle sottostringhe è anagramma della chiave, trovi che 'ezio' è anagramma di 'zeio', quindi 'lezio' è un quasi-anagramma di 'zeio', perché ha al suo interno l'anagramma della chiave + il carattere spurio 'l'. Hai trovato una sostituzione da fare, devi prendere il quasi-anagramma 'lezio' e sostituirlo con il valore della chiave, in questo caso 'an', ottieni la nuova stringa 'anne di python' (questa nuova stringa dovrà essere sottoposta di nuovo a controllo per ogni coppia chiave-valore).
Prendiamo ora la seconda sottostringa che trovi di lunghezza 5 in 'lezione di python': 'ezion', ripetendo il procedimento sopra, trovi che anche questa sottostringa è un quasi-anagramma della chiave, perché ha al suo interno l'anagramma della chiave 'zeio' + il carattere spurio 'n', quindi puoi effettuare la sostituzione anche qui ed ottieni la nuova stringa 'lane di python' (anche questa da ricontrollare).
Prendiamo ora la terza sottostringa che trovi di lunghezza 5 in 'lezione di python': 'zione', ripetendo il procedimento sopra, trovi che anche questa sottostringa è un quasi-anagramma della chiave, perché ha al suo interno l'anagramma della chiave 'zeio' + il carattere spurio 'n', quindi puoi effettuare la sostituzione anche qui ed ottieni la nuova stringa 'lean di python' (anche questa da ricontrollare).
Prendiamo ora la quarta sottostringa che trovi di lunghezza 5 in 'lezione di python': 'ione ', ripetendo il procedimento sopra, trovi che questa sottostringa non può essere quasi-anagramma di 'zeio'.
E così via...
Tutto questo da fare per qualsiasi coppia chiave-valore del dizionario.
Ogni sostituzione che fai genera una nuova stringa che dovrai trattare come se fosse la stringa iniziale del tuo programma. Devi raccogliere poi tutte le stringhe all'interno delle quali non si possono fare più sostituzioni e restituire un set con quelle più corte.
Cerca di implementare la ricorsione per controllare le nuove stringhe che ottieni.