Esercizi di ripasso

Problemi in preparazione alla verifica

prof. Matteo Lugli

Created: 2024-02-09 ven 10:15

Table of Contents

Disclaimer

In verifica saranno presenti almeno 3 esercizi Easy, piu' 1 o 2 Medium.

Se risolti in modo elegante con le list comprehension, gli esercizi easy vi possono portare tranquillamente al 7.5.

Se volete superare la verifica, esercitatevi al computer, non leggete solamente le slide!

Morale della favola: provate a fare i medium! (Sono piu' divertenti, trovatevi con gli amici e provate a risolverli in preparazione alla verifica)

Easy

Esercizio 1

Dato un intero \(n\), generare una lista che contenga tutti i numeri pari nell'intervallo \((1,n]\)

Soluzione 1

n = 11
l = []
for i in range(1,n+1):
        if i % 2 == 0:
                l.append(i)
print(l)

Soluzione 2

n = 11
l = [i for i in range(2,n+1) if i%2 == 0 ]
print(l)

Esercizio 2

Data una lista di interi \([x_0, x_1, ..., x_i, ... ,x_n]\) generare una lista di valori \([y_0, y_1, ..., y_i, ..., y_n]\) in cui:

  • \(y_i = x_i\) se i = 0;
  • \(y_i = x_i + x_{i-1}\) altrimenti;

Soluzione 1

l = [1,2,3,4,5]
sol = []
for i,x in enumerate(l):
        if i == 0:
                sol.append(x)
        else:
                sol.append(l[i-1] + x)
print(sol)

Soluzione 2

l = [1,2,3,4,5]
sol = [x if i == 0 else x + l[i-1] for i,x in enumerate(l)]
print(sol)

Esercizio 3

In Lapponia gli elfi di Babbo Natale stanno cercando di stimare quanti regali dovranno essere consegnati a Correggio(RE) nella notte di Natale 2024.

L'elfo informatico ha scritto su una pergamena la sua predizione, da recapitare al reparto produzione. Il contenuto della pergamena e' il seguente: \(2312545123\)

Al reparto produzione capiscono che deve esserci stato un errore.

Chiedendo aiuto all'elfo informatico, in reparto produzione capiscono che il vero numero di regali corrisponde alla somma di ogni cifra moltiplicata per \(1000\) presa singolarmente.

Quanti regali sara' necessario incartare in previsione del Natale 2024?

Soluzione 1

n = "2312545123"
s = 0
for x in n:
        s += int(x)*1000
print(s)

Soluzione 2

n = "2312545123"
print(sum([int(x)*1000 for x in n]))

Medium

AOC 2023 D1 P1

AOC 2022 D1 P1, P2

AOC 2021 D1 P1, P2

AOC 2015 D2 P1, P2

Il tizio che fa i fumetti ha iniziato nel 2021 :(

Soluzione P1

with open("test.txt") as f:
        grid = f.read().splitlines()
        dimensions = [[int(y) for y in x.split("x")] for x in grid]
        carta = 0
        for h,l,w in dimensions:        
                carta = carta + 2*h*l + 2*h*w + 2*l*w
                carta += min([h*l, h*w, l*w])
        print(carta)

Per la soluzione della seconda parte, vedremo un piccolo esempio relativo alla funzione sorted, che prende in input una lista di valori e ritorna una copia della lista ordinata;

Nel caso in cui la lista contenga dei valori numerici, allora li ordina in ordine crescente. Usare il parametro reverse=True per ordinarli in ordine decrescente;

Soluzione P2

total = 0
for l,h,w in dimensions:
        volume = l*w*h
        ribbon = (sorted([l,h,w])[0]+sorted([l,h,w])[1])*2
        total += volume + ribbon
print(total)

AOC 2017 D1 P1, P2

Questo problema e' utile per ripassare:

  • list comprehension;
  • operatore %;

Soluzione P1

with open("test.txt") as f:
        line = f.read().strip()
        size = len(line)
        t = [int(line[i]) if line[i] == line[(i+1)%(size)] else 0 for i in range(size)]
        print(sum(t))

Soluzione P2

with open("test.txt") as f:
        line = f.read().strip()
        size = len(line)
        t = [int(line[i]) if line[i] == line[(i+size//2)%(size)] else 0 for i in range(size)]
        print(sum(t))

Hard

AOC 2015 D3 P1

Non serve molto codice per risolvere questo problema, ma c'e' da ragionare;

Soluzione

L'idea e' il tenere traccia della posizione di Babbo Natale man mano che che segue le indicazioni dell'elfo;

Basta salvarsi in una tupla o lista la posizione sull'asse x e sull'asse y, e aumentare il contatore dei regali soltanto se la posizione attuale non e' ancora stata visitata;

with open("input.txt") as f:
        line = f.read().replace("\n", "")
        pos = (0,0)
        visited = {(0,0)}
        counter = 1
        directions = {">":(0,1), "<":(0,-1),"v":(1,0),"^":(-1,0)}
        for d in line:
                dx, dy = directions[d]
                x,y = pos    
                nx = x + dx
                ny = y + dy
                if (nx, ny) not in visited:
                        counter += 1
                        visited.add((nx, ny))
                pos = (nx,ny)