[HOMEWORK] Homework 7 opzionale

andrea.sterbini (167800 points)
488 897 1728
asked Nov 26, 2020 in Avvisi by andrea.sterbini (167,800 points)
edited Nov 26, 2020 by andrea.sterbini

ATTENZIONE

  • eventuali correzioni verranno inserite qui
  • NOTA: per eseguire i test SENZA i controlli ed il timeout modificate test_01.py settando la variabile DEBUG=True

Istruzioni

Per svolgere l'homework:

  • Installate le librerie necessarie (compreso stopit)
  • Scaricate il file HW7opt.zip e scompattatelo in una directory
    • Lo zip contiene
      • l'esercizio da svolgere, descritto all'inizio del file program01.ita.py (in italiano) oppure program01.eng.py (in inglese)
        • 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 creata unzippando l'archivio ed rinominate il file program01.ita/eng.py che preferite con il nome program01.py
    • Editate il file program01.py implementando le funzioni necessarie a risolvere l'esercizio.
    • 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: 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 ottenuta scompattando lo zip
      • 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 con stampa dei tempi spesi dal programma nelle 20 funzioni complessivamente più lente)
        • pytest test_01.py -v -rA --profile
      • 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++

    Scadenze: questo homework non ha scadenza

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

    Potete consegnare più volte, vale l'ultima.

    2 Answers

    s
    stefanocali (1230 points)
    1 2 9
    answered Nov 26, 2020 by stefanocali (1,230 points)
    edited Nov 26, 2020 by stefanocali

    Buonasera, sto eseguendo l'hw, per il momento passo tutti i test tranne gli ultimi 4 (per il timeout) e il primo, nel primo, test_data_01 mi dice che "l'insieme non è corretto", quello che ottengo io è {'2 1 3', '1 2 3'}, quello del test è { '1 2 3', '2 1 3' }, mi chiedevo, se fosse percaso sbagliato il risultato del test, perchè essendo un insieme, il risultato che dobbiamo ritornare, non è possibile ordinarlo giusto? Grazie

    Edit. Non so perchè adesso che ho riaperto Python funziona.. frown

    andrea.sterbini (167800 points)
    488 897 1728
    commented Nov 26, 2020 by andrea.sterbini (167,800 points)
    E' molto strano, a me funziona. Hai provato a debuggare? Se vuoi che ci dia un'occhiata consegnalo.
    D
    Davide (650 points)
    3 13 16
    commented Nov 27, 2020 by Davide (650 points)

    Buongiorno prof,

    premetto che il mio algoritmo non è ancora funzionante ma anche a me qualche test fallisce in modo "strano":

    • AssertionError: Items in the second set but not the first, sequence = '1 1 1 1 1 1 1 1 2', expected = {'2'}    --->  il mio risultato è {'2'}
    • Exception: Recursion not present, sequence = '2 2 1 2 3', expected = {'1 2 3', '2 1 3'}    --->  il mio risultato è {'2 1 3', '1 2 3'}
    • Exception: Recursion not present, sequence = '1 1 1 1 1 4 4 2 2 2 2 2 3 3 3 3 3 4 4 4 6', expected = {'1 2 3 4 6', '1 4 2 3 6'} --->  il mio risultato è {'1 2 3 4 6', '1 4 2 3 6'}
    G
    Giordano_Dionisi (3100 points)
    12 38 58
    commented Nov 27, 2020 by Giordano_Dionisi (3,100 points)
    Le due ultime eccezioni si hanno, come è scritto, perchè non hai usato la ricorsione nel tuo programma, almeno questo ha individuato il programma di test (probabilmente non hai messo la funzione ricorsiva esterna a tutto o qualcosa del genere)

    Risolto questo problema poi ci si può concentrare sul primo (magari è solo una conseguenza di quest'altro)
    G
    Giordano_Dionisi (3100 points)
    12 38 58
    answered Nov 26, 2020 by Giordano_Dionisi (3,100 points)
    Salve prof,

    Le scrivo per una banalissima curiosità (per capire il significato) che non c'entra molto con l'homework... Stavo eseguendo i test (li ho quasi completati tutti !!) e mi sono accorto che sul file di test compare questa scritta nel campo @data:

    Primo Test:
    (False, ' '.join(['1']*1), ......

    Quinto Test:
    (True,  '2 2 1 2 3', ......

    Ora la mia domanda è: Quel true e quel false per cosa starebbero ?? Ho pensato che servissero per disattivare i test (False per disattivare) ma quei test con False vengono effettivamente eseguiti... Quindi cosa significano effettivamente, così giusto per una mia semplicissima curiosità

    Grazie mille per l'attenzione e la pazienza prof !!
    andrea.sterbini (167800 points)
    488 897 1728
    commented Nov 27, 2020 by andrea.sterbini (167,800 points)
    Leggi test_01.py e lo scoprirai
    G
    Giordano_Dionisi (3100 points)
    12 38 58
    commented Nov 27, 2020 by Giordano_Dionisi (3,100 points)

    Si effettivamente ora lo ho trovato, sarebbe praticamente il parametro "doRecTest" quando viene passato al test per prendere tutti i vari dati... Infatti si passa quell'argomento (che è true o false), poi si passa la sequenza ed il risultato aspettato... Perciò, se ho ben capito, in pratica quel parametro sempre a fare il test se il nostro programma scritto è ricorsivo o meno, ovvero che se ho:

    true -> allora il programma di test testa anche se il nostro programma scritto è ricorsivo o meno

    false -> allora il programma di test NON testa se il nostro programma scritto è ricorsivo o meno

    Però che strano, cioè si testa se il nostro programma è ricorsivo o meno solo per certi test... Forse forse ho capito male prof sad

    andrea.sterbini (167800 points)
    488 897 1728
    commented Nov 27, 2020 by andrea.sterbini (167,800 points)
    Guarda per quali test non viene controllata la ricorsione e capirai :-)
    G
    Giordano_Dionisi (3100 points)
    12 38 58
    commented Nov 27, 2020 by Giordano_Dionisi (3,100 points)
    Quanto è criptico prof, dopo al massimo glielo chiedo a lezione ahahahahahahh (sto "impazzendo" cercando di capire il perchè :) )
    andrea_25 (6070 points)
    2 2 24
    commented Nov 27, 2020 by andrea_25 (6,070 points)
    Credo che il prof intenda dire che la ricorsione non viene controllata quando viene dato un test che ti porta immediatamente al caso base, quindi non viene effettivamente iniziato il processo ricorsivo per quei test
    G
    Giordano_Dionisi (3100 points)
    12 38 58
    commented Nov 27, 2020 by Giordano_Dionisi (3,100 points)
    Si si esattissimo, glielo ho chiesto poco fa a lezione e la risposta è proprio questa... Grazie mille lo stesso !!!