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.

[HOMEWORK] Homework 8 (obbligatorio) - prima scadenza per TUTTI: ore 23:59 del 27/12/22

andrea.sterbini (208020 points)
756 1270 2377
in Avvisi by (208k points)
edited by

ATTENZIONE

  • È permesso importare la libreria tree inclusa nello zip ma non è obbligatorio 
  • Le scacchiere possono essere rettangolari di qualsiasi dimensioni maggiori di 0
  • Il primo giocatore è sempre B anche se le scacchiere sono parzialmente piene
  • eventuali correzioni verranno inserite qui, tenete d'occhio questa pagina
  • NOTA: il programma test_01.py DISATTIVA la funzione print ed aggiunge alcuni controlli. Per disattivarli e usare print assegnate la variabile DEBUG=True in test_01.py

Istruzioni

Per svolgere l'homework:

  • Installate le librerie necessarie
  • Scaricate il file HW8req.zip e scompattatelo in una directory. Il compito consiste nel:
    • descrivere in un file di testo algorithm.txt l'algoritmo che avete realizzato (o state realizzando, senza inserire info personali, dev'essere anonimo)
    • Lo zip contiene:
      • il file program01.ita.py, il programma da realizzare, in cui trovate all'inizio la descrizione del problema da risolvere, se necessario definendo funzioni ausiliarie,
      • 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.py col nome program01.py
    • analizzate il problema spezzandolo in funzioni piccole e descrivetelo nel file algorithm.txt (createlo con un editor di testo come Notepad++ o Spyder se non c'è)
    • implementatelo editando il file program01.py
  • 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 che viene fatto dai test
  • 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-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

  • Prima scadenza per TUTTI: ore 23:59 del 27/12/22 (consegnate entrambi i file algoritmo.txt e program01.py)
  • Il giorno seguente vi verranno assegnati 3 algoritmi anonimi da valutare entro le 23:59 del 30/12/22
  • Una volta ricevuti i suggerimenti dai compagni, dopo averli valutati tutti, potrete riconsegnare un programma migliore entro le 23:59 del 6/1/23

Dovrete consegnare entrambi i file:

  • program01.py
  • algorithm.txt (file di testo utf8, usate Spyder o Notepad++)

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

Potete consegnare più volte, vale l'ultima, dopo l'ultima scadenza tutti i codici sorgenti diverranno visibili a tutti.

1 Answer

l.vitale3 (6010 points)
10 22 83
by (6.0k points)
edited by

Prof. volevo chiederle una cosa. La libreria che analizza se si utilizza la ricorsione o meno, da un esito positivo se è presente la funzione ricorsiva, anche eventualmente senza essere entrare in ricorsione,  oppure deve eseguire almeno una chiamata ricorsiva? Perchè se la funzione deve eseguire almeno una chiamata ricorsiva penso ci sia un problema con la specifica :

  • Le scacchiere possono essere rettangolari di qualsiasi dimensioni maggiori di 0

Perchè, io ad esempio uso la ricorsione per generare tutte le evoluzioni (penso sia la cosa più logica, altrimenti diventa complicato calcolare tutte le evoluzioni), ma prendendo il caso di una scacchiera fatta da una sola casella vuota, per via dei casi base la mia funzione non entra in ricorsione e mi calcola il pareggio perchè nessuno può fare mosse. Quindi sarebbe opportuno che la specifica sia che in qualsiasi scacchiera ci sia almeno una possibile mossa.

PS: se la libreria da esito positivo anche se la funzione non entra in ricorsione allora il problema non sussiste.

EDIT: Ho appena appena testato il caso citato ed effettivamente non supero il test perchè non è presente la ricorsione "RecursionDetectedError". Quindi penso sia ragionevole modificare la specifica per i motivi sopracitati.

andrea.sterbini (208020 points)
756 1270 2377
by (208k points)
Per quei casi disattiveremo il test di ricorsione (come abbiamo fatto l'anno scorso)
l.vitale3 (6010 points)
10 22 83
by (6.0k points)
Ok la ringrazio per il chiarimento.