Solució de l’examen Parcial - Torn 1¶
- Organització:
Secció ETSEIB, Departament de Ciències de la Computació, UPC
- Data:
28 d’octubre de 2025
- Copyright:
Reconeixement-CompartirIgual 4.0 No adaptada de Creative Commons
Jocs de proves
Els exemples que compten per la nota són només els que van seguits de
# doctesttag: +TAG=...
>>> import itertools
Tests exercici 1 Class Match3¶
>>> from match3 import Match3
>>> m = Match3(10, 15)
>>> m.amplada, m.alçada # doctesttag: +TAG=1_Match3
(15, 10)
Posicions interiors i exteriors.
>>> m.es_interior((1,3)) and not m.es_interior((-1,-10)) # doctesttag: +TAG=1_Match3
True
>>> m.es_interior((8,6)) and not m.es_interior((10,15)) # doctesttag: +TAG=1_Match3
True
>>> m.es_interior((9,14)) and not m.es_interior((1,15)) # doctesttag: +TAG=1_Match3
True
El tauler és buit.
>>> len(m) # doctesttag: +TAG=1_Match3
0
>>> for f in range(10): # doctesttag: +TAG=1_Match3
... for c in range(15):
... print(m[f,c], end='')
... print()
000000000000000
000000000000000
000000000000000
000000000000000
000000000000000
000000000000000
000000000000000
000000000000000
000000000000000
000000000000000
Accés a algunes posicions exteriors.
>>> m[8,19], m[-1,12], m[13,5], m[4,22], m[1,-1] # doctesttag: +TAG=1_Match3
(-1, -1, -1, -1, -1)
Modificació de 10 posicions interiors.
>>> m[0,0] = 5
>>> m[2,11] = 6
>>> m[2,12] = 1
>>> m[4,1] = 6
>>> m[7,2], m[7, 4], m[7, 9] = 1, 2, 3
>>> m[8,3] = 1
>>> m[5,4], m[5, 8] = 5, 5
>>> len(m) # doctesttag: +TAG=1_Match3
10
Les posicions han quedat modificades. La resta valen el mateix.
>>> for f in range(10): # doctesttag: +TAG=1_Match3
... for c in range(15):
... print(m[f,c], end='')
... print()
500000000000000
000000000000000
000000000006100
000000000000000
060000000000000
000050005000000
000000000000000
001020000300000
000100000000000
000000000000000
Intercanvi de posicions vàlides.
>>> m[0, 0], m[1, 4]
(5, 0)
>>> m.intercanvia((0,0), (1,4))
>>> m[0, 0], m[1, 4] # doctesttag: +TAG=1_Match3
(0, 5)
>>> m[0,4] = 5
>>> m[1,2] = 1
>>> len(m) # doctesttag: +TAG=1_Match3
12
>>> m.intercanvia((0,4), (1,2))
>>> m[0, 4], m[1, 2] # doctesttag: +TAG=1_Match3
(1, 5)
>>> m[2, 11], m[7, 9]
(6, 3)
>>> m.intercanvia((2,11), (7,9))
>>> m[2, 11], m[7, 9] # doctesttag: +TAG=1_Match3
(3, 6)
Modificació de posicions.
>>> m[0,0] , m[0, 2]= 4, 4
Els intercanvis i modificacions deixen el tauler com volem.
>>> for f in range(10): # doctesttag: +TAG=1_Match3
... for c in range(15):
... print(m[f,c], end='')
... print()
404010000000000
005050000000000
000000000003100
000000000000000
060000000000000
000050005000000
000000000000000
001020000600000
000100000000000
000000000000000
Més modificacions.
>>> m[0,4] = 5
>>> m[0,2] = 3
>>> m[2,3] = 0
>>> m[3,1], m[7, 7] = 1, 1
Comprovació de les modificacions en part del tauler.
>>> for f in range(4): # doctesttag: +TAG=1_Match3
... for c in range(5):
... print(m[f,c], end='')
... print()
40305
00505
00000
01000
>>> m[7, 7] # doctesttag: +TAG=1_Match3
1
>>> len(m) # doctesttag: +TAG=1_Match3
16
Nova instància.
>>> m2 = Match3(20, 17)
>>> m2.amplada, m2.alçada # doctesttag: +TAG=1_Match3
(17, 20)
El tauler és buit.
>>> len(m2)
0
>>> all(m2[f, c] == 0 for f, c in itertools.product(range(20), range(17))) # doctesttag: +TAG=1_Match3
True
Posicions interiors i exteriors
>>> all(m2.es_interior(p) for p in itertools.product(range(20), range(17))) # doctesttag: +TAG=1_Match3
True
>>> any(m2.es_interior(p) for p in itertools.product(range(20), (-1, 17))) # doctesttag: +TAG=1_Match3
False
>>> any(m2.es_interior(p) for p in itertools.product((-1, 20), range(17))) # doctesttag: +TAG=1_Match3
False
Modifiquem tot el tauler.
>>> for f in range(20):
... for c in range(17):
... m2[f,c]=f+c
>>> all(m2[f, c] == f+c for f, c in itertools.product(range(20), range(17))) # doctesttag: +TAG=1_Match3
True
Intercanviar algunes posicions interiors
>>> int_m2 = [((1, 5), (7, 4)), ((2, 3), (0, 1)), ((5, 1), (4, 3)), ((3, 3), (5, 5)), ((6, 1), (1, 6))]
>>> ini_int_m2 = [(m2[b], m2[a]) for a, b in int_m2]
>>> for a, b in int_m2:
... m2.intercanvia(a, b)
>>> fi_int_m2 = [(m2[a], m2[b]) for a, b in int_m2]
>>> fi_int_m2 == ini_int_m2 # doctesttag: +TAG=1_Match3
True
Tests apartat 2¶
>>> m3 = Match3(10, 15)
>>> fcv = [
... (0,0, 5),
... (0,6, 2),
... (1,2, 3),
... (2,1, 1),
... (2,2, 4),
... (2,3, 1),
... (3,4, 5),
... (4,6, 1)
... ]
>>> for f, c, v in fcv:
... m3[f, c] = v
>>> list(m3) == fcv # doctesttag: +TAG=2_iterMatch3
True
>>> m9 = Match3(20, 17)
>>> fcv = [(0, 1, 1), (0, 2, 2), (0, 3, 3), (0, 4, 4), (0, 5, 5), (0, 6, 6), (0, 7, 7), (0, 8, 8), (0, 9, 9), (0, 10, 10), (0, 11, 11), (0, 12, 12), (0, 13, 13), (0, 14, 14), (0, 15, 15), (0, 16, 16), (1, 0, 1), (1, 1, 2), (1, 2, 3), (1, 3, 4), (1, 4, 5), (1, 5, 6), (1, 6, 7), (1, 7, 8), (1, 8, 9), (1, 9, 10), (1, 10, 11), (1, 11, 12), (1, 12, 13), (1, 13, 14), (1, 14, 15), (1, 15, 16), (1, 16, 17), (2, 0, 2), (2, 1, 3), (2, 2, 4), (2, 3, 5), (2, 4, 6), (2, 5, 7), (2, 6, 8), (2, 7, 9), (2, 8, 10), (2, 9, 11), (2, 10, 12), (2, 11, 13), (2, 12, 14), (2, 13, 15), (2, 14, 16), (2, 15, 17), (2, 16, 18), (3, 0, 3), (3, 1, 4), (3, 2, 5), (3, 3, 6), (3, 4, 7), (3, 5, 8), (3, 6, 9), (3, 7, 10), (3, 8, 11), (3, 9, 12), (3, 10, 13), (3, 11, 14), (3, 12, 15), (3, 13, 16), (3, 14, 17), (3, 15, 18), (3, 16, 19), (4, 0, 4), (4, 1, 5), (4, 2, 6), (4, 3, 7), (4, 4, 8), (4, 5, 9), (4, 6, 10), (4, 7, 11), (4, 8, 12), (4, 9, 13), (4, 10, 14), (4, 11, 15), (4, 12, 16), (4, 13, 17), (4, 14, 18), (4, 15, 19), (4, 16, 20), (5, 0, 5), (5, 1, 6), (5, 2, 7), (5, 3, 8), (5, 4, 9), (5, 5, 10), (5, 6, 11), (5, 7, 12), (5, 8, 13), (5, 9, 14), (5, 10, 15), (5, 11, 16), (5, 12, 17), (5, 13, 18), (5, 14, 19), (5, 15, 20), (5, 16, 21), (6, 0, 6), (6, 1, 7), (6, 2, 8), (6, 3, 9), (6, 4, 10), (6, 5, 11), (6, 6, 12), (6, 7, 13), (6, 8, 14), (6, 9, 15), (6, 10, 16), (6, 11, 17), (6, 12, 18), (6, 13, 19), (6, 14, 20), (6, 15, 21), (6, 16, 22), (7, 0, 7), (7, 1, 8), (7, 2, 9), (7, 3, 10), (7, 4, 11), (7, 5, 12), (7, 6, 13), (7, 7, 14), (7, 8, 15), (7, 9, 16), (7, 10, 17), (7, 11, 18), (7, 12, 19), (7, 13, 20), (7, 14, 21), (7, 15, 22), (7, 16, 23), (8, 0, 8), (8, 1, 9), (8, 2, 10), (8, 3, 11), (8, 4, 12), (8, 5, 13), (8, 6, 14), (8, 7, 15), (8, 8, 16), (8, 9, 17), (8, 10, 18), (8, 11, 19), (8, 12, 20), (8, 13, 21), (8, 14, 22), (8, 15, 23), (8, 16, 24), (9, 0, 9), (9, 1, 10), (9, 2, 11), (9, 3, 12), (9, 4, 13), (9, 5, 14), (9, 6, 15), (9, 7, 16), (9, 8, 17), (9, 9, 18), (9, 10, 19), (9, 11, 20), (9, 12, 21), (9, 13, 22), (9, 14, 23), (9, 15, 24), (9, 16, 25), (10, 0, 10), (10, 1, 11), (10, 2, 12), (10, 3, 13), (10, 4, 14), (10, 5, 15), (10, 6, 16), (10, 7, 17), (10, 8, 18), (10, 9, 19), (10, 10, 20), (10, 11, 21), (10, 12, 22), (10, 13, 23), (10, 14, 24), (10, 15, 25), (10, 16, 26), (11, 0, 11), (11, 1, 12), (11, 2, 13), (11, 3, 14), (11, 4, 15), (11, 5, 16), (11, 6, 17), (11, 7, 18), (11, 8, 19), (11, 9, 20), (11, 10, 21), (11, 11, 22), (11, 12, 23), (11, 13, 24), (11, 14, 25), (11, 15, 26), (11, 16, 27), (12, 0, 12), (12, 1, 13), (12, 2, 14), (12, 3, 15), (12, 4, 16), (12, 5, 17), (12, 6, 18), (12, 7, 19), (12, 8, 20), (12, 9, 21), (12, 10, 22), (12, 11, 23), (12, 12, 24), (12, 13, 25), (12, 14, 26), (12, 15, 27), (12, 16, 28), (13, 0, 13), (13, 1, 14), (13, 2, 15), (13, 3, 16), (13, 4, 17), (13, 5, 18), (13, 6, 19), (13, 7, 20), (13, 8, 21), (13, 9, 22), (13, 10, 23), (13, 11, 24), (13, 12, 25), (13, 13, 26), (13, 14, 27), (13, 15, 28), (13, 16, 29), (14, 0, 14), (14, 1, 15), (14, 2, 16), (14, 3, 17), (14, 4, 18), (14, 5, 19), (14, 6, 20), (14, 7, 21), (14, 8, 22), (14, 9, 23), (14, 10, 24), (14, 11, 25), (14, 12, 26), (14, 13, 27), (14, 14, 28), (14, 15, 29), (14, 16, 30), (15, 0, 15), (15, 1, 16), (15, 2, 17), (15, 3, 18), (15, 4, 19), (15, 5, 20), (15, 6, 21), (15, 7, 22), (15, 8, 23), (15, 9, 24), (15, 10, 25), (15, 11, 26), (15, 12, 27), (15, 13, 28), (15, 14, 29), (15, 15, 30), (15, 16, 31), (16, 0, 16), (16, 1, 17), (16, 2, 18), (16, 3, 19), (16, 4, 20), (16, 5, 21), (16, 6, 22), (16, 7, 23), (16, 8, 24), (16, 9, 25), (16, 10, 26), (16, 11, 27), (16, 12, 28), (16, 13, 29), (16, 14, 30), (16, 15, 31), (16, 16, 32), (17, 0, 17), (17, 1, 18), (17, 2, 19), (17, 3, 20), (17, 4, 21), (17, 5, 22), (17, 6, 23), (17, 7, 24), (17, 8, 25), (17, 9, 26), (17, 10, 27), (17, 11, 28), (17, 12, 29), (17, 13, 30), (17, 14, 31), (17, 15, 32), (17, 16, 33), (18, 0, 18), (18, 1, 19), (18, 2, 20), (18, 3, 21), (18, 4, 22), (18, 5, 23), (18, 6, 24), (18, 7, 25), (18, 8, 26), (18, 9, 27), (18, 10, 28), (18, 11, 29), (18, 12, 30), (18, 13, 31), (18, 14, 32), (18, 15, 33), (18, 16, 34), (19, 0, 19), (19, 1, 20), (19, 2, 21), (19, 3, 22), (19, 4, 23), (19, 5, 24), (19, 6, 25), (19, 7, 26), (19, 8, 27), (19, 9, 28), (19, 10, 29), (19, 11, 30), (19, 12, 31), (19, 13, 32), (19, 14, 33), (19, 15, 34), (19, 16, 35)]
>>> for f, c, v in fcv:
... m9[f, c] = v
>>> list(m9) == fcv # doctesttag: +TAG=2_iterMatch3
True
>>> m4 = Match3(10, 15)
>>> fcv = [
... (0,0, 5),
... (0,6, 2),
... (1,2, 3),
... (2,1, 1),
... (2,2, 4),
... (2,3, 1),
... (3,4, 5),
... (4,6, 1), (0, 5, 3), (2, 4, 1), (9, 14, 6),
... (1, 0, 2), (5, 7, 4), (3, 5, 5),
... (3, 3, 1), (3, 0, 5), (5, 5, 2), (7, 5, 1)
... ]
>>> for f, c, v in fcv:
... m4[f, c] = v
>>> list(m4) == sorted(fcv) # doctesttag: +TAG=2_iterMatch3
True
>>> m5 = Match3(10, 15)
>>> fcv = [
... (0,0, 5),
... (0,6, 2),
... (1,2, 3),
... (2,1, 1),
... (2,2, 4),
... (2,3, 1),
... (3,4, 5),
... (4,6, 1), (0, 5, 3), (2, 4, 1), (9, 14, 6),
... (1, 0, 2), (5, 7, 4), (3, 5, 5)
... ]
>>> for f, c, v in fcv:
... m5[f, c] = v
>>> list(m5) == sorted(fcv) # doctesttag: +TAG=2_iterMatch3
True
>>> m6 = Match3(10, 15)
>>> fcv = [
... (0,0, 5),
... (0,6, 2),
... (1,2, 3),
... (2,1, 1),
... (2,2, 4),
... (2,3, 1),
... (3,4, 5),
... (4,6, 1), (0, 5, 3), (2, 4, 1), (9, 14, 6)
... ]
>>> for f, c, v in fcv:
... m6[f, c] = v
>>> list(m6) == sorted(fcv) # doctesttag: +TAG=2_iterMatch3
True
Tests apartat 3¶
>>> from match3plus import Match3Plus
>>> m7 = Match3Plus(6, 12, (4,2))
>>> m7.alçada, m7.amplada # doctesttag: +TAG=3_Match3plus
(6, 12)
>>> m7.posforat # doctesttag: +TAG=3_Match3plus
(4, 2)
>>> len(m7) # doctesttag: +TAG=3_Match3plus
0
>>> m7[0,0], m7[2, 1], m7[2, 2], m7[2, 3], m7[3, 2], m7[5, 3] = 1, 2, 3, 4, 5, 6
>>> m7[4,10], m7[4, 11], m7[5, 2], m7[4, 3], m7[5, 7], m7[1, 3] = 1, 2, 3, 4, 5, 6
>>> len(m7) # doctesttag: +TAG=3_Match3plus
12
>>> for f in range(7): # doctesttag: +TAG=3_Match3plus
... for c in range(13):
... print(m7[f,c], end='')
... print()
100000000000-1
000600000000-1
023400000000-1
005000000000-1
000400000012-1
003600050000-1
-1-1-1-1-1-1-1-1-1-1-1-1-1
>>> m7.intercanvia((2,3), (3,2))
>>> m7.intercanvia((2,1), (4,2)) # No es pot intercanviar a la posició del forat
>>> for f in range(7): # doctesttag: +TAG=3_Match3plus
... for c in range(13):
... print(m7[f,c], end='')
... print()
100000000000-1
000600000000-1
023500000000-1
004000000000-1
000400000012-1
003600050000-1
-1-1-1-1-1-1-1-1-1-1-1-1-1
>>> m7.intercanvia((0,0), (5,11))
>>> m7.intercanvia((2,3), (4,2)) # No es pot intercanviar a la posició del forat
>>> for f in range(7): # doctesttag: +TAG=3_Match3plus
... for c in range(13):
... print(m7[f,c], end='')
... print()
000000000000-1
000600000000-1
023500000000-1
004000000000-1
000400000012-1
003600050001-1
-1-1-1-1-1-1-1-1-1-1-1-1-1
>>> m8 = Match3Plus(10, 25, (5, 8))
>>> m8.alçada, m8.amplada # doctesttag: +TAG=3_Match3plus
(10, 25)
>>> m8.posforat # doctesttag: +TAG=3_Match3plus
(5, 8)
>>> len(m8) # doctesttag: +TAG=3_Match3plus
0
>>> m8[0,0], m8[2, 1], m8[2, 2], m8[2, 3], m8[3, 2], m8[5, 3] = 1, 2, 3, 4, 5, 6
>>> m8[4,10], m8[4, 11], m8[5, 2], m8[4, 3], m8[5, 7], m8[1, 3] = 1, 2, 3, 4, 5, 6
>>> len(m8) # doctesttag: +TAG=3_Match3plus
12
>>> for f in range(11): # doctesttag: +TAG=3_Match3plus
... for c in range(26):
... print(m8[f,c], end='')
... print()
1000000000000000000000000-1
0006000000000000000000000-1
0234000000000000000000000-1
0050000000000000000000000-1
0004000000120000000000000-1
0036000500000000000000000-1
0000000000000000000000000-1
0000000000000000000000000-1
0000000000000000000000000-1
0000000000000000000000000-1
-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1
>>> m8.intercanvia((2,3), (3,2))
>>> m8.intercanvia((2,1), (5, 8)) # No es pot intercanviar a la posició del forat
>>> for f in range(11): # doctesttag: +TAG=3_Match3plus
... for c in range(26):
... print(m8[f,c], end='')
... print()
1000000000000000000000000-1
0006000000000000000000000-1
0235000000000000000000000-1
0040000000000000000000000-1
0004000000120000000000000-1
0036000500000000000000000-1
0000000000000000000000000-1
0000000000000000000000000-1
0000000000000000000000000-1
0000000000000000000000000-1
-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1
>>> m8.intercanvia((0,0), (5,11))
>>> m8.intercanvia((2,3), (5, 8)) # No es pot intercanviar a la posició del forat
>>> for f in range(11): # doctesttag: +TAG=3_Match3plus
... for c in range(26):
... print(m8[f,c], end='')
... print()
0000000000000000000000000-1
0006000000000000000000000-1
0235000000000000000000000-1
0040000000000000000000000-1
0004000000120000000000000-1
0036000500010000000000000-1
0000000000000000000000000-1
0000000000000000000000000-1
0000000000000000000000000-1
0000000000000000000000000-1
-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1