Challenges funzioni
Scarica zip esercizi
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
scrivi una prima versione
nobulli(stringa)
che assume che i caratteri desiderati da mantenere siano sempre ‘w’,’a’,’k’,’a’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
return
nèprint
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 problemaUSA 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)