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.

[AVVISO] Homework 3 opzionale (senza scadenza)

andrea.sterbini (207920 points)
749 1267 2373
in Avvisi by (208k points)
edited by

ATTENZIONE

  • Come fatto notare più sotto, l'esempio inserito nel testo dell'esercizio non è corretto, dovrebbe mostrare tutti i valori con frequenze da 1 in poi (n=20 è maggiore del numero di frequenze contate per cui dovevano apparire tutte). Fanno fede i test che contengono il numero di valori corretti nell'ordine giusto (gli N con frequenza maggiore, ordinati dal più piccolo al più grande).
  • ATTENZIONE: DOVETE INSTALLARE LA LIBRERIA stopit usando il comando (nella finestra Anaconda Prompt)
    • conda install -c conda-forge stopit
    • Questo per permettere di spostare la misura del tempo attorno alla chiamata della vostra funzione.
  • eventuali correzioni verranno inserite qui
  • NOTA: il programma test_01.py DISATTIVA la funzione print, quindi non vedrete stampe. Per riattivare le stampe seguite le istruzioni all'inizio dello HW1

Istruzioni

Per svolgere l'homework:

  • Installate le librerie necessarie compreso stopit
  • Scaricate il file HW3opz.zip e scompattatelo in una directory
    • Lo zip contiene
      • l'esercizio da svolgere, descritto all'inizio del file program01.py
        • l'esercizio consiste nel realizzare, se necessario definendo funzioni ausiliarie, la funzione descritta all'inizio del file, completandone il codice
      • altre librerie e file necessari ad eseguire i test sulla vostra macchina
  • Posizionatevi nella directory HW3opz creata unzippando l'archivio ed editate il file program01.py completando la funzione indicata
  • ATTENZIONE: il programma NON DEVE eseguire nessun input() o print(), infatti riceve tutte le informazioni di cui ha bisogno tramite i parametri della funzione che dovete completare e torna il risultato con return.
  • ATTENZIONE: SONO VIETATE le variabili globali.
  • ATTENZIONE: SONO VIETATE tutte le altre librerie a parte quelle già importate nel testo.
  • ATTENZIONE: E' VIETATO copiare codice dalle librerie di sistema.
  • ATTENZIONE: i vostri programmi NON DEVONO sfruttare eventuali periodicità o caratteristiche strutturali degli input, ma devono essere applicabili a qualsiasi input valido.
  • ATTENZIONE: NON LASCIATE ISTRUZIONI DI TEST NEL PROGRAMMA, A MENO CHE NON SIANO DOPO UNA RIGA
    • if __name__ == '__main__':
      • vostre istruzioni di test che in questo modo non vengono eseguite durante l'import del file
  • Per eseguire i test
    • aprite una finestra "Anaconda Prompt" e posizionatevi nella directory HW1opz ottenuta scompattando lo zip
    • NOTA: i test ora vengono sempre eseguiti con il timeout, per disattivarlo eliminate il blocco with nel metodo do_test
    • eseguite il comando
      • pytest test_01.py -v -rA
    • oppure (test con una stampa dei tempi impiegati per eseguire ciascun test)
      • pytest test_01.py -v -rA --durations 0
    • oppure (test che stampa dei tempi spesi dal programma nelle 20 funzioni complessivamente più lente)
      • pytest test_01.py -v -rA --profiling
    • Per far fermare i test al primo errore aggiungete l'opzione -x
    • Per chi usa Spyder:
      • è possibile eseguire i test direttamente da dentro Spyder installando il plugin spyder-unittest (ma senza timeout o parametri aggiuntivi)
      • è possibile ottenere i tempi spesi in ciascuna funzione direttamente da dentro Spyder installando il plugin spyder-line-profiler

NOTA: per aprire i file di testo in formato utf8 NON usate Notepad che non riconosce gli accapi Unix ('\n') ma usate Spyder o Notepad++

Consegna

Dovrete consegnare:

  • program01.py: il programma da voi realizzato

La pagina di consegna è https://q2a.di.uniroma1.it/homeworks/delivery?homework=3

    1.7k views

    1 Answer

    E
    Edward (25950 points)
    3 4 172
    by (26.0k points)

    Salve Professore,

    Nella traccia c'è scritto:

    - n: l'intero che indica il numero di frequenze massime cui siamo interessati. 
        e restituisce una lista di tuple.

    Ad esempio  es1('ft1.txt', 2, 4, 20) restituisce la lista:
        
        [ (4, ['0001', '0011', '1100' ]), 
          (5, ['011', 1000', '110' ]),
          (6, ['0000', '111']),
          (7, ['0010','1001' ]),
          (8, ['0100']),
          (10,['010']),
          (11,['000', '001', '11']),
          (12,['100']),
          (15,['01','10']),
          (23,['00'])
        ]

    Però nel file test_01.json il risultato expected è:

    "expected":[[1, ["1011", "1101"]], [2, ["0101", "0110", "1010"]], 

                    [3, ["0111", "101", "1110", "1111"]], [4, ["0001", "0011", "1100"]], 

                    [5, ["011", "1000", "110"]], [6, ["0000", "111"]], [7, ["0010", "1001"]], 

                    [8, ["0100"]], [10, ["010"]], [11, ["000", "001", "11"]], [12, ["100"]], 

                    [15, ["01", "10"]], [23, ["00"]]

                    ],

    Sono infatti presenti più di n sequenze in entrambi gli expected di test_01.json.

    Non so se vale lo stesso per test_random.json perchè se provo ad aprirlo mi crasha tutto :D

    a
    alex_err (5800 points)
    1 3 32
    by (5.8k points)
    In realtà si intendono il numero massimo di tuple che devono essere restituite nella lista.
    andrea.sterbini (207920 points)
    749 1267 2373
    by (208k points)
    Come detto a lezione, in json le tuple non esistono e vengono rappresentate da liste.
    Il codice dei test le converte in tuple prima di chiamare la vostra funzione
    Inoltre ha ragione Alex
    E
    Edward (25950 points)
    3 4 172
    by (26.0k points)
    edited by

    Salve professore, lo so come funzionano i json. Anche io sono arrivato alla conclusione che n indica il numero di tuple nella lista. Stavo solo segnalando che l'esempio della traccia mostra un risultato, mentre l'expected del test fatto con i dati di input dell'esempio ne mostra un altro (non in termini di tuple e liste, proprio i dati sono diversi)

    EDIT:
    Per spiegarmi meglio, nell'esempio della traccia c'è scritto:

        Ad esempio  es1('ft1.txt', 2, 4, 20) restituisce la lista:
        
        [ (4, ['0001', '0011', '1100' ]), 
          (5, ['011', 1000', '110' ]),
          (6, ['0000', '111']),
          (7, ['0010','1001' ]),
          (8, ['0100']),
          (10,['010']),
          (11,['000', '001', '11']),
          (12,['100']),
          (15,['01','10']),
          (23,['00'])
        ]

    Il risultato corretto in realtà è:

    [(1, ['1011', '1101']),
     (2, ['0101', '0110', '1010']),
     (3, ['0111', '101', '1110', '1111']),
     (4, ['0001', '0011', '1100']),
     (5, ['011', '1000', '110']),
     (6, ['0000', '111']),
     (7, ['0010', '1001']),
     (8, ['0100']),
     (10, ['010']),
     (11, ['000', '001', '11']),
     (12, ['100']),
     (15, ['01', '10']),
     (23, ['00'])]

    AndreaGasparini (18850 points)
    7 12 120
    by (18.9k points)
    edited by
    Confermo che il risultato "restituito" nella traccia è errato, inizialmente infatti pensavo di aver compreso male io
    andrea.sterbini (207920 points)
    749 1267 2373
    by (208k points)
    Ora ho capito. Ho aggiunto una nota all'inizio della pagina.