Challenges funzioni

Scarica zip esercizi

Naviga file online

Proponiamo ora degli esercizi senza soluzione, accetti la sfida?

Sfida - I numeri di Pacman

✪ Requisiti: funzioni

Pacman è a lezione di matematica, e gli viene spiegato che per ottenere il quadrato di un numero bisogna moltiplicarlo per se stesso. Aiutalo a imparare questo concetto scrivendo una funzione che permetterà al nostro famelico amico di ottenere il quadrato di innumerevoli numeri. Però ha imparato solo a fare moltiplicazioni di numeri inferiori a 20 e NON E’ quindi capace di moltiplicare numeri sopra il 20, per i quali risponderà lo stesso numero.

  • NON scrivere print nella funzione!

Esempio 1:

>>> y = numnum(10)
>>> y
100

Esempio 2:

>>> z = numnum(33)
>>> z
33
[1]:

def numnum(num):
    # sostituisci pass (che non fa niente) con il codice della funzione
    pass




# NON TOCCARE, queste linee devono funzionare
x = numnum(3)       # Deve RITORNARE 9
print(x)

y = numnum(10)      # Deve RITORNARE 100
print(y)

z = numnum(33)      # Deve RITORNARE 33
print(z)
9
100
33

Sfida - Pacman e i bulli

✪✪ Requisiti: funzioni, stringhe, for, if

Uscito da scuola il nostro eroe dei labirinti incontra un gruppo di ragazzini che per prenderlo in giro iniziano a cantilenargli il suo iconico verso, storpiandolo:

INVECE di "waka waka waka waka waka"

i bulli gli cantano "waekai waekai waekai waekai"

ed altre storpiature simili ottenute AGGIUNGENDO lettere al verso normale.

I bulli non aggiungono mai lettere corrette. Perchè sono bulli.

Aiuta PacMan scrivendo una funzione nobulli che pulisca dalle storpiature i versi dei bulli.

  • NON scrivere print nella funzione!

Esempio:

>>> bullo1 = "waekai waekai waekai waekai"
>>> res1 = nobulli(bullo1)
>>> print(res1)
waka waka waka waka
  1. scrivi una prima versione nobulli(stringa) che assume che i caratteri desiderati da mantenere siano sempre ‘w’,’a’,’k’,’a’

  2. scrivi una seconda versione nobulli2(stringa, mantieni) che prende anche in ingresso una stringa coi caratteri da mantenere

[2]:
# scrivi la funzione



# NON TOCCARE, queste linee devono funzionare
bullo1 = "waekai waekai waekai waekai"
bullo2 = "bwaka rwaka swaka twaka zwaka mmmwatka"
bullo3 = "eweaekea zwxarkma qwoagkpa"
res1 = nobulli(bullo1)   # Deve RITORNARE il verso pulito "waka waka waka waka"
print(res1)
res2 = nobulli(bullo2)   # Deve RITORNARE il verso pulito "waka waka waka waka waka waka"
print(res2)
res3 = nobulli(bullo3)   # Deve RITORNARE il verso pulito "waka waka waka"
print(res3)
waka waka waka waka
waka waka waka waka waka waka
waka waka waka

Sfida - I biscotti danesi

✪✪ Tornato a casa, per consolarsi dalle offese, PacMan si butta su una scatola di biscotti (di quelle con la confezione di latta rotonda).

Nella scatola ci sono 8 diversi tipi di biscotti e dopo averne mangiati un po’ si accorge con orrore che ha lasciato che rimanesse un numero dispari di biscotti per alcune tipologie.

Ovviamente l’offesa va sanata: scrivi una funzione mangia che data una lista la MODIFICA per mangiare (e quindi togliere) un biscotto di tutti i tipi rimasti dispari.

  • NON scrivere returnprint nella funzione!

Esempio:

>>> scatola = [2, 5, 3, 8, 6, 24, 5, 3, 9]
>>> mangia(scatola)
>>> print(scatola)
[2, 4, 2, 8, 6, 24, 4, 2, 8]
[3]:
# scrivi la funzione




# NON TOCCARE, queste linee devono funzionare
scatola1 = [3, 3, 3, 3, 3]
scatola2 = [1, 3, 5, 7, 9]
scatola3 = [19, 3, 14, 1, 10, 9, 2, 16, 8, 7, 13, 11, 18, 17, 6, 5, 4, 12, 20, 15]

mangia(scatola1)  # deve MODIFICARE scatola1
mangia(scatola2)
mangia(scatola3)

print(scatola1) # Deve stampare la lista [2, 2, 2, 2, 2]
print(scatola2) # Deve stampare la lista [0, 2, 4, 6, 8]
print(scatola3) # Deve stampare la lista [18, 2, 14, 0, 10, 8, 2, 16, 8, 6, 12, 10, 18, 16, 6, 4, 4, 12, 20, 14]


print(mangia([2,4,5,7])) # DEVE stampare None. Perchè ?
[2, 2, 2, 2, 2]
[0, 2, 4, 6, 8]
[18, 2, 14, 0, 10, 8, 2, 16, 8, 6, 12, 10, 18, 16, 6, 4, 4, 12, 20, 14]
None

Sfida - Raggi cosmici

✪✪✪ Requisiti: credere nella sfortuna

In questi tempi di distanziamento sociale ci viene offerto di lavorare da remoto. Per organizzare il lavoro, ci viene comunicato un calendario con una serie di date per i meeting, espresso come lista di stringhe, nel formato gg/mm/aaaa. Per importare la lista nel nostro calendario preferito, vogliamo costruire un programma che analizzi le stringhe per estrarre come tupla di interi. Quindi per esempio la stringa "29/05/2020" deve essere riconosciuta e trasformata nella tupla (29,5,2020)

Purtroppo, il calendario ci viene trasmesso dall’altro capo del pianeta, proprio durante una tempesta solare. I raggi cosmici interferiscono senza pietà nella comunicazione, cambiando caratteri a caso.

Sapendo che la comunicazione potrebbe non essere completamente affidabile, decidiamo di scrivere un programma resistente agli errori, in modo che riesca a riconoscere quantomeno le date ben formattate e con numeri dei giorni, mesi e anni ragionevoli.

  • Per giorni e mesi sappiamo che i limiti sono 31 e 12

  • per gli anni supponiamo che è impossibile vi siano eventi fissati prima del 2020 e dopo il 2023.

  • Quando trovi un errore: solleva un’Exception che descrive il problema

  • USA un blocco try except per catturare le eccezioni sollevate (anche e soprattutte quelle non previste !)

Esempi di output atteso (ce ne sono tantissimi che se ne possono fare, qua trovate solo una selezione):

Parsing 08/11/2023
   Riconosciuto! (8, 11, 2023)    <-- notate che vogliamo la conversione a interi !
Parsing 02/1012028
   ERRORE: Formato non valido!
Parsing 02/(0/2021
   ERRORE: invalid literal for int() with base 10: '(0'
Parsing 50/04(2920
   ERRORE: Formato non valido!
Parsing 30/04/1803
   ERRORE: Anno non valido!
Parsing 05/72/2021
   ERRORE: Mese non valido!
Parsing 49/02/2022
   ERRORE: Giorno non valido!
[4]:
import random
import string

# FUNZIONE GIA' COMPLETA, NON TOCCARE !
def raggi_cosmici(flusso_dati):
    for x in range(random.randint(1,min(3,len(flusso_dati)))):
        i = random.randint(0,len(flusso_dati)-1)
        #print('i',i)
        lista = list(flusso_dati[i])
        for c in range(random.randint(1,3)):
            #print('lista',lista)
            lista[random.randint(0,len(lista)-1)] = random.choice('0123456789$/()')
            #print('flusso_dati[i]=',flusso_dati[i])
            #print('modifico',flusso_dati[i])
            flusso_dati[i] = ''.join(lista)

# IMPORTANTE: dopo un primo round di testing, SCOMMENTA queste istruzioni random.seed
#             per cambiare gli errori casuali introdotti  e verificare
#             che il tuo programma gestisca anche quelle
# NOTA: Il numero del parametro non influisce sul numero o tipo di errori,
# determina solo  quale sequenza di errori viene generata.
# Se non imposti il seed otterrai errori completamente casuali diversi
# ad ogni esecuzione del programma!

random.seed(7)
#random.seed(6)   # scommenta
#random.seed(9)   # scommenta


calendario = [
    '07/11/2020',
    '30/04/2020',
    '02/10/2022',
    '08/11/2023',
    '25/01/2021',
    '29/05/2023',
]

raggi_cosmici(calendario)  # modifica calendario con errori casuali !


# scrivi qui


Parsing 97/81/2020
    ERRORE: Giorno non valido: 97
Parsing $0/04/2010
    ERRORE: invalid literal for int() with base 10: '$0'
Parsing 02/10/2022
    Riconosciuto! (2, 10, 2022)
Parsing 08/11/2023
    Riconosciuto! (8, 11, 2023)
Parsing 25/01/2021
    Riconosciuto! (25, 1, 2021)
Parsing 29/05/2023
    Riconosciuto! (29, 5, 2023)