[AVVISO] Homework 3 opzionale (senza scadenza)

andrea.sterbini (172680 points)
511 927 1776
asked Oct 30, 2019 in Avvisi by andrea.sterbini (172,680 points)
edited Oct 31, 2019 by andrea.sterbini

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,530 views

    1 Answer

    E
    Edward (25950 points)
    2 4 172
    answered Oct 31, 2019 by Edward (25,950 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)
    0 3 32
    commented Oct 31, 2019 by alex_err (5,800 points)
    In realtà si intendono il numero massimo di tuple che devono essere restituite nella lista.
    andrea.sterbini (172680 points)
    511 927 1776
    commented Oct 31, 2019 by andrea.sterbini (172,680 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)
    2 4 172
    commented Oct 31, 2019 by Edward (25,950 points)
    edited Oct 31, 2019 by Edward

    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 (18730 points)
    6 12 118
    commented Oct 31, 2019 by AndreaGasparini (18,730 points)
    edited Oct 31, 2019 by AndreaGasparini
    Confermo che il risultato "restituito" nella traccia è errato, inizialmente infatti pensavo di aver compreso male io
    andrea.sterbini (172680 points)
    511 927 1776
    commented Oct 31, 2019 by andrea.sterbini (172,680 points)
    Ora ho capito. Ho aggiunto una nota all'inizio della pagina.