Il telefono di DOC
Sull’elenco telefonico Matryx HOMFLY trova il numero di DOC: esso è pari a (1) + (1 + 2) + · · · + (1 + 2 + · · · + 1918). Quante cifre ha?
SOLUZIONE
Vediamo il codice:
S = 0
for n in range(1, 1918+1):
S = S + sum(range(1, n+1))
print(S)
Sembra fastidioso, ma nel ‘grande schema delle cose’ è un’idea migliore.
Riduce di molto la quantità di ±1 arbitrari.
len(range(a, b)) == b-a.
Finita l’edizione numero 2018, Biff realizza che, dall’inizio delle scommesse, ha guadagnato una montagna di dollari. Quanti, di preciso?
a = [None] * 2019
a[0] = 0
for n in range(2019//3):
a[3*n] = a[n]
a[3*n+1] = a[n] - 1
a[3*n+2] = a[n] + 2
print(sum(a[0:2019]))
- Abbiamo preallocato una lista di 2019 elementi. Più comodo in questo caso che non a.append().
- Le liste possono contenere oggetti arbitrari (anche diversi).
- Una lista lunga n contiene elementi a[0], a[1], … , a[n-1].
- Funziona anche a[-1] = ultimo elemento, a[-2] = penultimo. . .
- a[inizio:fine] restituisce la sottolista nel ‘range’ inizio:fine (con le solite regole sui range!).
- Ma, soprattutto: la logica del programma corrisponde abbastanza bene alla matematica.
Esercizietto 3
Circuiti difettosi
I circuiti del tempo sono stati danneggiati da un fulmine: ora la DeuLerean può raggiungere solo gli anni di quattro cifre tali che la cifra delle migliaia sia maggiore o uguale alla somma delle altre tre. “Poco male” dice DOC, e calcola rapidamente in quanti anni diversi può viaggiare. Che numero trova? Si intende che un numero di quattro cifre ha la cifra delle migliaia non nulla.
SOLUZIONE
def is_acceptable(n):
d = [int(a) for a in str(n)]
return d[3] >= d[0] + d[1] + d[2]
for n in range (1000,10000):
if is_acceptable(n):
print(n)
print ('Gli anni totali sono: ',len([n for n in range(1000,10000) if is_acceptable(n)]))
1002
1003
1004
1005
1006
1007
1008
1009
1012
1013
1014
1015
1016
1017
1018
1019
1023
1024
1025
1026
7029
7108
7109
7119
7209
8008
8009
8019
8109
9009
Gli anni totali sono: 495
Il prof. Fredholm mostra a Frege una mappa dell’universo, a forma di scacchiera infinita bidimensionale; ogni casella rappresenta un settore del piano galattico. Indica col dito il centro del settore corrispondente alla Terra, e spiega: “La nostra astronave per le consegne ha un motore di mia invenzione che utilizza materia oscura come carburante. Con due palline di materia oscura, prodotte dal nostro Mordaglia, può spostarsi di un settore in orizzontale o in verticale; con tre può spostarsi di un settore in diagonale.
Partendo dalla nostra base sulla Terra, possiamo fare consegne in qualunque settore raggiungibile con 60 palline di carburante o meno. Incluso quello di partenza, ovviamente”, aggiunge ridacchiando. In quanti settori diversi può fare consegne la Planar Express?
def distance_from_origin(a,b):
a = abs(a); b = abs(b)
return 3*min(a, b) + 2*abs(a-b)
len([(a,b) for a in range(-40,40) for b in range(-40,40) if
distance_from_origin(a, b) <= 60])
Finalmente, con l’aiuto di Cartesio, riuscimmo a scoprire in quante regioni era diviso il triangolo, risolvendo un problema con la stella.
na = 11; nb = 22; nc = 22;
intersections = [(a,b,c) for a in range(1,na)
for b in range(1, nb)
for c in range(1, nc)
if a/(na-a)*b/(nb-b)*c/(nc-c) == 1]
print(intersections)
(72)