Do you need any help?

Notice Board

Per partecipare al corso di Fondamenti di programmazione 2021-22 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 2021-22 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.

VIDEOLEZIONI DEL CORSO DI FONDAMENTI DI PROGRAMMAZIONE AA20-21

PROGRAMMING COURSE VIDEOCONFERENCES AY20-21

Aiuto con l'Hw2obb

L
LorenzoLaccone (1020 points)
5 7 10
asked Oct 29, 2019 in HW2 obbligatorio by LorenzoLaccone (1,020 points)

Buongiorno a tutti,

E' da qualche giorno ormai che sono bloccato nella realizzazione dell'HW2obb. Ho effettuato una prima stesura e una prima consegna che tutto sommato mi va bene in quanto non supera solamente 2 test su 16 (esempio4 ed esempio5), ma vorrei comunque migliorare il mio codice per provare a fare di meglio.

Ho capito che solamente con le liste non si può riuscire a concludere nulla perché il problema sorge nel momento in cui vado a cercare l'indice dell'elemento da scambiare e ho capito che una soluzione possono i essere i dizionari o i set, il problema è che non capisco proprio come fare per impostare queste altre strutture dati in modo utile per migliorare il programma, ho fatto qualche prova ma riesco solo ad aumentare i tempi piuttosto che diminuirli.

Chiedo gentilmente, se qualcuno è riuscito a risolvere questo problema, di darmi qualche dritta concettuale su come impostare i dizionari o i set o qualche consiglio per riuscire a sbloccarmi e per poter andare avanti da solo.

Ringrazio in anticipo tutti coloro che proveranno a darmi qualche consiglio.

4 Answers

Best answer
LucianoBlasetti (800 points)
2 2 6
answered Oct 29, 2019 by LucianoBlasetti (800 points)
selected Oct 30, 2019 by LorenzoLaccone
Prova ad impostare un dizionario in modo che per ciascun pilota tieni traccia di chi lo precede e di chi lo insegue. Non dovrai rimuovere fisicamente un pilota dal dizionario in caso di abbandono, ma agire solo sui "puntatori" del predecessore e del successore. Cosa analoga quando avviene un sorpasso, lavora solo sui puntatori. E alla fine sarai in grado di attraversare il grafo e ricostruire la classifica finale.
n
n.rossi (650 points)
3 4 9
commented Oct 31, 2019 by n.rossi (650 points)
In questo modo per i sorpassi ok, ma per gli eliminati? Devo cambiare tutti i successivi e precedenti di chi precede l'eliminato quindi il valore dei dizionari per intenderci?
LucianoBlasetti (800 points)
2 2 6
commented Oct 31, 2019 by LucianoBlasetti (800 points)
Mi sembra che sei sulla buona strada. (però quando dici "tutti" parliamo, nel caso di abbandono, di al massimo due piloti)
n
n.rossi (650 points)
3 4 9
commented Oct 31, 2019 by n.rossi (650 points)
Quindi in sostanza se devo eliminare vado a toccare le posizioni di due piloti precendente e successivo , e quello in questione lo marco come eliminato , per i sorpassi ne devo toccare 4 perché cambiano i piloti adiacenti
LucianoBlasetti (800 points)
2 2 6
commented Oct 31, 2019 by LucianoBlasetti (800 points)
Direi proprio di si. Considera sempre che meno cose si fanno e meglio è, quindi domandati sempre se è proprio necessario fare una qualche operazione, fra quelle che hai detto forse ce ne è una un po' superflua...
n
n.rossi (650 points)
3 4 9
commented Nov 2, 2019 by n.rossi (650 points)
Calcola sul mio pc li passo tutti mentre sulla VM il test 5 mi fa 1.5 secondi ma deve essere inferiore quindi fallisce...per gli spostamenti sono obbligato a effettuare 3 modifiche...una sul pilota precedente una su quello successivo uno su quello dell'evento, posso eliminare qualche passaggio secondo voi ?
Simone.A (3750 points)
13 16 26
answered Oct 29, 2019 by Simone.A (3,750 points)
Anche io non passo l'esempio 4 e 5
Luca_12_3 (580 points)
4 4 9
answered Oct 29, 2019 by Luca_12_3 (580 points)
prova a ragionare utilizzando 2 dizionari, ti risolvi alcuni problemi così
L
LorenzoLaccone (1020 points)
5 7 10
commented Oct 29, 2019 by LorenzoLaccone (1,020 points)
Si mi era venuto in mente di usare un dizionario per tenere traccia dei successori di ogni concorrente e uno per tenere traccia dei precedenti di ogni concorrente.

Può essere corretto come ragionamento?

Grazie
s
simone.moriconi (280 points)
0 0 2
commented Oct 29, 2019 by simone.moriconi (280 points)
Il ragionamento può andar bene, ma ad una chiave del dizionario si può associare un qualsiasi tipo di variabile... quindi si può tener traccia dei successori e dei precedenti  con un solo dizionario e risulta molto più semplice ricostruire la lista finale.
AlessandraIzzo (6010 points)
6 6 30
answered Oct 29, 2019 by AlessandraIzzo (6,010 points)
edited Oct 29, 2019 by AlessandraIzzo
Come mai è stata flaggata sia la domanda che la risposta di Luciano? Cosa c'è che non va? Se c'è qualcosa che non va perché non dirlo? ...

Comunque, prima di ciclare sugli eventi, potresti implementare una lista di dizionari* dove all'indice i della lista c'è un dizionario contenente l'indice del pilota precedente e quello del pilota successivo al pilota di id pari a i. In questo modo quando ciclerai sugli eventi potrai accedere direttamente agli id dei piloti adiacenti, senza dover usare il metodo index (per trovare prima la posizione del pilota sorpassato). Dovrebbe essere abbastanza facile a questo punto capire anche come evitare l'uso del metodo remove.

In sostanza una struttura dati in cui conosci le relazioni tra i piloti, ma non le posizioni esatte. Solo alla fine, costruirai una lista finale, da dare in output, in cui i piloti ancora in gara sono inseriti nella posizione che spetta loro.
Con questo approccio passerai facilmente il test 4, ma per il test 5 dovrai comunque stare attento ad evitare ogni piccola perdita di tempo.

* va bene anche una lista di mini-liste, ma una lista di dizionari è altrettanto efficiente e meglio leggibile
L
LorenzoLaccone (1020 points)
5 7 10
commented Oct 29, 2019 by LorenzoLaccone (1,020 points)
Si mi chiedo anche io il motivo del flag, considerando che ho specificato un aiuto esclusivamente concettuale e che Luciano non ha mandato nessun frammento di codice.

Sarà stato qualcuno che voleva divertirsi cliccando le icone a suo piacimento? Nel caso invece sia stato un flag ritenuto opportuno invito il "responsabile" a indicare in un commento il motivo del suo flag di modo che io possa nel caso modificare la domanda o se necessario anche nasconderla.
AlessandraIzzo (6010 points)
6 6 30
commented Oct 29, 2019 by AlessandraIzzo (6,010 points)

Infatti, come dicevo, perché non dire cos'è che non va?
Ieri avevo anche chiesto quanto fosse concesso aiutare i colleghi, e non sembra affatto che qui ci sia qualche violazione.
Quindi, o sarà qualcuno che non sa cosa è ammesso, o qualcuno che per interesse personale non vuole che ci si aiuti...

Sta a vedere che mi becco il flag pure io :)

a
a.pietroluongo (11250 points)
15 38 131
commented Oct 29, 2019 by a.pietroluongo (11,250 points)
Più la seconda.
andrea.sterbini (172780 points)
513 935 1789
commented Oct 29, 2019 by andrea.sterbini (172,780 points)
SUGGERIMENTO: invece di dire direttamente il vostro algoritmo cercate di far pensare i vostri colleghi
Christian (15220 points)
2 4 77
commented Oct 29, 2019 by Christian (15,220 points)
Curiosità.. mi sfugge una cosa qui su Q2A: come si vede una risposta/commento flaggato? Il post all'apparenza mi sembra come gli altri..

Comunque grazie Luciano, consiglio molto utile ;)
E
Edward (25950 points)
2 4 172
commented Oct 29, 2019 by Edward (25,950 points)

Adesso è stato tolto/nascosto il flag. Prima si poteva vedere.

a
a.pietroluongo (11250 points)
15 38 131
commented Oct 29, 2019 by a.pietroluongo (11,250 points)
Forse lo ha tolto il prof.
Christian (15220 points)
2 4 77
commented Oct 29, 2019 by Christian (15,220 points)
Grazie mille! Non riuscivo a capire
AlessandraIzzo (6010 points)
6 6 30
commented Nov 1, 2019 by AlessandraIzzo (6,010 points)
Edward ha pure a disposizione screen di cose che non si possono più vedere!