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.

Errore in Homework, esercizio 3 (nella decrittazione)

G
Gianluca.Scuoch (570 points)
3 8 16
in Es3 by (570 points)
closed by
Salve a tutti.

Non so se succede solo a me ma, nell'esercizio 3, questo è quello che accade. Come al solito mettendo gli input a "mano" il codice gira bene. Vorrei sapere se qualcuno sa quale potrebbe essere il problema. Qui da quello che ho capito non decodifica anche se, lo ripeto, il codice me lo fa. Non so se potrebbe essere lo stesso problema che mi riguardava anche con il primo esercizio nel quale la lista non veniva modificata a livello globale. Spero qualcuno sia di aiuto e grazie in anticipo a chi mi risponderà.

EDIT: Ho provato a mettere i print strategici e mi risulta tutto. Ho usato dei dizionari per fare la codifica e la decodifica e facendo il print dei dizionari anche loro risultano corretti.

test_codifica_1                ok chiave che contiene tutte le 26 lettere dell'alfabeto

test_decodifica_1              chiave che contiene tutte le 26 lettere dell'alfabeto

error -> AssertionError

'rqrqzbhx b rqrbhb' != 'papaveri e papere'

test_codifica_2                ok chiave che NON contiene tutte le 26 lettere dell'alfabeto, il testo contiene solo lettere della chiave, la chiave sposta tutte le lettere (nessuna mappa su se stessa)

test_decodifica_2              chiave che NON contiene tutte le 26 lettere dell'alfabeto, il testo contiene solo lettere della chiave, la chiave sposta tutte le lettere (nessuna mappa su se stessa)

error -> AssertionError

'cdacbcrcdac' != 'abracadabra'

test_codifica_3                ok il testo da codificare contiene caratteri che non appartengono alla chiave, la lettera 'e' non viene modificata (mappa su se stessa)

test_decodifica_3              il testo da codificare contiene caratteri che non appartengono alla chiave

error -> AssertionError

'Crhf! ben cfinhcf. Rraedeicr E’ un prhveie' != 'Ciao! ben tornato. Rivederti E’ un piacere'

test_codifica_4                ok la chiave contiene l'alfabeto completo una sola volta, invertito, essendo un numero pari di lettere, nessuna mappa su se stessa

test_decodifica_4              la chiave contiene l'alfabeto completo una sola volta, invertito, essendo un numero pari di lettere, nessuna mappa su se stessa

error -> AssertionError

'oz mvyyrz ztor rigr xloor' != 'la nebbia agli irti colli'
1.1k views
closed with the note: Risolto problema: non dovevo riutilizzare il return di codifica dentro il decodifica

5 Answers

Best answer
LeonardoEmili (35740 points)
14 65 155
by (35.7k points)
selected by

Buonasera!

Mi aggiungo anch'io nella discussione cosicché tu possa risolvere il tuo problema al più presto!

Il problema da quanto vedo è localizzato nella parte di decodifica del tuo programma. Quindi non mi preoccuperei troppo! Probabilmente hai già fatto il 90% del lavoro, si tratta con tutta probabilità di un errore banale. Quindi per portarti a ragionare su quanto fatto, ti faccio le seguenti domande:

  • Ho letto che utilizzi i dizionari per la chiave, quanti ne hai utilizzati? Se ne hai utilizzato uno solo di dizionario chiave-valore hai verificato di aver invertito i chiave-valore per effettuare la procedura di decodifica (ovvero l'inversa) ?
  • Hai controllato di non aver chiamato per sbaglio la stessa funzione di codifica per decodificare? O peggio hai controllato di non aver per sbaglio "riscritto" la funzione di decodifica con quella di codifica? Perché in tal caso Python riconoscerebbe come funzione da eseguire l'ULTIMA funzione definita.
Sperando sinceramente che tu risolva il tuo problema, aspetto ulteriori notizie.
Buona serata
.
Leonardo Emili
G
Gianluca.Scuoch (570 points)
3 8 16
by (570 points)
Grazie della risposta cordiale e non presuntuosa, molto gentile. Ho usato un solo dizionario nel  quale nel processo di codifica uso due liste che nel processo di decodifica inverto. Nel processo di decodifica prendo come testo il return della funzione codifica richiamandola nel primo rigo della funzione decodifica. Per creare la chiave uso una funzione a parte che richiamo sia in codifica che in decodifica.
LeonardoEmili (35740 points)
14 65 155
by (35.7k points)
Grazie a te, e ripeto come ho già detto ad un altro ragazzo, non esitate mai a fare domande sul forum dato che è molto utile, anche perché :  ci è permesso usarlo, perché limitarci? In ogni caso per il tuo problema ho capito che tu utilizzi due liste per il processo di codifica, che hai detto che nel processo inverso inverti. Come mai 2? Posso dirti come ho fatto io, personalmente ho preferito utilizzare solo i dizionari per una questione di velocità/praticità e perché non serve mantenere un ordine in questo caso. Io per la codifica ho iterato sul testo in chiaro associando chiave-valore secondo lo schema disordinato-ordinato. Nel processo di decodifica il processo cambia di molto poco! Infatti puoi utilizzare lo stesso ragionamento semplicemente invertendo chiave-valore!
Auron (15880 points)
51 126 194
by (15.9k points)

Da quello che vedo, nelle frasi in cui ti restituisce l'errore, non effettua l'operazione di "decodifica"...
Il senso dell'AssertionError è:     "Il tuo risultato è 'oz mvyyrz ztor rigr xloor' che è DIVERSO (!=) da quello che dovrei avere io che è 'la nebbia agli irti colli'"

Considerando che il risultato che si aspetta è una frase in chiaro (non crittografata) immagino, come ti ho detto, che il problema sia sull'algoritmo di decrittografia... Ti può essere utile come risposta? :D

C'è anche scritto che i test che falliscono sono sul decrypt xD (Me ne sono reso conto ora)

Sostanzialmente: Non stai decrittografando... ti rimangono le frasi ciptate... Assicurati di fare l'operazione inversa di quella di conversione sulle frasi :D

G
Gianluca.Scuoch (570 points)
3 8 16
by (570 points)
Io ho applicato il processo di codifica e come vedi funziona. Dopodiché nella sezione decodifica al testo che ottengo con la codifica applico la procedura inversa e da terminale il risultato è quello sperato.
Auron (15880 points)
51 126 194
by (15.9k points)
Allora è un problema di restituzione della frase... Sicuro di ritornare la frase decrittografata e non quella crittografata?
G
Gianluca.Scuoch (570 points)
3 8 16
by (570 points)
Molto sicuro ma ricontrollo per scaramanzia
Auron (15880 points)
51 126 194
by (15.9k points)
Inserisci delle print in punti strategici per verificare che il processo di decodifica funzioni correttamente... io faccio così, parto con delle print molto distanti tra loro, nei punti che ritengo utili per verificare il buon funzionamento del programma... Se vedo che ci sono problemi in una sezione infittisco le print fino a trovare il punto esatto in cui c'è un funzionamento anomalo dell'algoritmo :D
Finora sono riuscito a risolvere tutti i miei problemi :D
G
Gianluca.Scuoch (570 points)
3 8 16
by (570 points)
Si ma se metto i print e quello che esce è la chiave decodificata allora che posso fare?
francesco.dev (33560 points)
23 51 129
by (33.6k points)
Auron anche questo condivido, hahahahaha! Anche io per trovare errori uso il metodo di verifica di ciò che hanno le varie variabili interessate :D
restante.giuseppe (2480 points)
7 32 49
by (2.5k points)
da quanto hai appena detto allora hai sbagliato variabile nel return
G
Gianluca.Scuoch (570 points)
3 8 16
by (570 points)
Ma nel return con input inseriti a mano mi esce corretto
francesco.dev (33560 points)
23 51 129
by (33.6k points)
Ciao!
Secondo me sbagli a fare il processo di decodifica, altrimenti il grade ti dava risultato positivo!

Rivedi bene il codice e, soprattutto, ragiona sulla logica dietro. Il processo di decodifica significa che dato un messaggio criptato deve tornare quello originale, sostituendo le lettere della chiave ordinata e disordinata in maniera inversa da quella fatta nel processo di codifica!

Controlla tutto ciò e se hai ancora problemi facci sapere.
- Francesco Pio Scognamiglio
G
Gianluca.Scuoch (570 points)
3 8 16
by (570 points)
Un solo dubbio ho: per richiamare il testo codificato posso farlo dalla funzione codifica?
francesco.dev (33560 points)
23 51 129
by (33.6k points)
Il testo codificato deve ritornare dalla funzione codifica! Quindi sì, puoi farlo
Denis (2230 points)
4 13 23
by (2.2k points)
Non so che tipo di algoritmo tu abbia utilizzato per decriptare, considera queste info e ricontrolla il codice:

La stringa è un tipo dati non mutabile.

La funzione replace non sostituisce la stringa ma ne crea una nuova.


Considera infine l'idea (che io non condivido in genere, ma in alcuni punti di questo esercizio effettivamente è utile) di non usare la stringa, ma una lista di caratteri che la formano.
G
Gianluca.Scuoch (570 points)
3 8 16
by (570 points)
Ho usato dei dizionari e delle liste..
P
Pic1 (1030 points)
9 24 31
by (1.0k points)
Hai scritto in un commento che per decifrare applichi la “procedura inversa”...potrebbe essere quello il problema.

Se invece provi ad applicare la stessa procedura usata per la cifratura, ma con la CHIAVE inversa?