Solució de l’examen final d’Informàtica. Torn 2

Organització:

Secció ETSEIB, Departament de Ciències de la Computació, UPC

Data:

11 de gener de 2018

Copyright:

Reconeixement-CompartirIgual 3.0 No adaptada de Creative Commons

Durada:

1 hora i 20 minuts

Jocs de proves

Classes: Gestor

Els exemples que compten per la nota són només els que van seguits de # doctesttag: +TAG=1_classes-gestor

>>> from gestor import Gestor
>>> g = Gestor()
>>> g.assignades   # doctesttag: +TAG=1_classes-gestor
{}
>>> g.no_assignades   # doctesttag: +TAG=1_classes-gestor
[]
>>> g.afegir_practica('E1', 9)
>>> g.assignades    # doctesttag: +TAG=1_classes-gestor
{}
>>> g.no_assignades   # doctesttag: +TAG=1_classes-gestor
[('E1', 9)]
>>> g.afegir_practica('E2', 5)
>>> g.assignades, g.no_assignades    # doctesttag: +TAG=1_classes-gestor
({}, [('E1', 9), ('E2', 5)])
>>> g.assigna('Anna')
>>> g.assignades    # doctesttag: +TAG=1_classes-gestor
{'Anna': ('E1', 9)}
>>> g.no_assignades    # doctesttag: +TAG=1_classes-gestor
[('E2', 5)]
>>> g.afegir_practica('E3', 12)
>>> g.assignades, g.no_assignades    # doctesttag: +TAG=1_classes-gestor
({'Anna': ('E1', 9)}, [('E2', 5), ('E3', 12)])
>>> g.assigna('Alf')     # doctesttag: +TAG=1_classes-gestor
>>> g.assignades == {'Alf': ('E2', 5), 'Anna': ('E1', 9)}
True
>>> g.no_assignades    # doctesttag: +TAG=1_classes-gestor
[('E3', 12)]
>>> g['Anna'] # doctesttag: +TAG=1_classes-gestor
('E1', 9)
>>> g['Alf'] # doctesttag: +TAG=1_classes-gestor
('E2', 5)
>>> len(g) # doctesttag: +TAG=1_classes-gestor
3
>>> g.desassigna('Alf')
>>> g.assignades, g.no_assignades    # doctesttag: +TAG=1_classes-gestor
({'Anna': ('E1', 9)}, [('E3', 12)])
>>> g.assigna('Pau')
>>> g.assigna('Roc')
>>> g.assignades == {'Anna': ('E1', 9), 'Pau': ('E3', 12)}     # doctesttag: +TAG=1_classes-gestor
True
>>> g.no_assignades    # doctesttag: +TAG=1_classes-gestor
[]
>>> len(g) # doctesttag: +TAG=1_classes-gestor
2
>>> g.desassigna('Anna')
>>> g.desassigna('Pau')
>>> g.desassigna('Roc')
>>> g.assignades, g.no_assignades    # doctesttag: +TAG=1_classes-gestor
({}, [])
>>> g.assigna('Maria')
>>> g.desassigna('Albert')
>>> g.assignades, g.no_assignades    # doctesttag: +TAG=1_classes-gestor
({}, [])
>>> for h, p in enumerate('ABCDEFGHIJK'):
...    g.afegir_practica(p, h+10)
>>> g.no_assignades     # doctesttag: +TAG=1_classes-gestor
[('A', 10), ('B', 11), ('C', 12), ('D', 13), ('E', 14), ('F', 15), ('G', 16), ('H', 17), ('I', 18), ('J', 19), ('K', 20)]
>>> for n in 'LMONPQ':
...    g.assigna(n)
>>> g.no_assignades     # doctesttag: +TAG=1_classes-gestor
[('G', 16), ('H', 17), ('I', 18), ('J', 19), ('K', 20)]
>>> len(g)
11
>>> g.assignades == {'L': ('A', 10), 'N': ('D', 13), 'P': ('E', 14), 'O': ('C', 12), 'M': ('B', 11), 'Q': ('F', 15)}     # doctesttag: +TAG=1_classes-gestor
True
>>> for n in 'LOP':
...    g.desassigna(n)
>>> g.assignades == {'N': ('D', 13), 'M': ('B', 11), 'Q': ('F', 15)}   # doctesttag: +TAG=1_classes-gestor
True
>>> for n in 'MNQ':      # doctesttag: +TAG=1_classes-gestor
...    print(g[n])
('B', 11)
('D', 13)
('F', 15)

Classes: GestorPlus

Els exemples que compten per la nota són només els que van seguits de # doctesttag: +TAG=1_classes-gestorplus

>>> from gestor import Gestor
>>> from gestorplus import GestorPlus

Cal que GestorPlus hereti de Gestor

>>> issubclass(GestorPlus, Gestor)
True
>>> g = GestorPlus('de la Picor')
>>> isinstance(g, GestorPlus)
True
>>> isinstance(g, Gestor)
True

Cal cridar el mètode __init__ de Gestor

>>> g.assignades, g.no_assignades  # doctesttag: +TAG=1_classes-gestorplus
({}, [])

Cal afegir l’atribut curs

>>> g.curs    # doctesttag: +TAG=1_classes-gestorplus
'de la Picor'

Iteradors: Triar dates

Els exemples que compten per la nota són només els que van seguits de # doctesttag: +TAG=2_iterdates.

>>> from iterdates import tria_dates
>>> from datetime import *
>>> import collections
>>> it = tria_dates(iter([date(1920, 1, 24)]))
>>> for e in it:   # doctesttag: +TAG=2_iterdates
...     print(e, end=',')
...     assert isinstance(e, date)
...     assert isinstance(it, collections.Iterator)
>>> it = tria_dates([date(2018, 10, 24), date(2018, 10, 21), date(2001, 2, 1),
...      date(2019, 1, 15), date(2019, 1, 17), date(2006, 10, 12)])
>>> for e in it:   # doctesttag: +TAG=2_iterdates
...     print(e, end=',')
...     assert isinstance(e, date)
...     assert isinstance(it, collections.Iterator)
2018-10-21,2001-02-01,
>>> def iteraux(d, n, i):
...    for x in range(n):
...        yield d
...        d = d + timedelta(i)
>>> it = tria_dates(iteraux(date(2000, 1, 1), 10, 1))
>>> for e in it:   # doctesttag: +TAG=2_iterdates
...     print(e, end=',')
...     assert isinstance(e, date)
...     assert isinstance(it, collections.Iterator)
2000-01-01,2000-01-02,2000-01-09,
>>> it = tria_dates(iteraux(date(2000, 2, 6), 10, 7))
>>> for e in it:   # doctesttag: +TAG=2_iterdates
...     print(e, end=',')
...     assert isinstance(e, date)
...     assert isinstance(it, collections.Iterator)
2000-02-06,2000-02-13,2000-02-20,2000-02-27,2000-03-05,2000-03-12,2000-03-19,2000-03-26,2000-04-02,2000-04-09,
>>> it = tria_dates(iteraux(date(1748, 5, 1), 20, 365))
>>> for e in it:   # doctesttag: +TAG=2_iterdates
...     print(e, end=',')
...     assert isinstance(e, date)
...     assert isinstance(it, collections.Iterator)
1748-05-01,1749-05-01,1750-05-01,1751-05-01,1752-04-30,1759-04-29,1766-04-27,

Grafs:

Els exemples que compten per la nota són només els que van seguits de # doctesttag: +TAG=3_grafs-connexions.

>>> import networkx as nx
>>> import jrol
>>> g = nx.Graph()
>>> g.add_nodes_from(['bar','vila','cova','platja','barca',
...   'vall','parc','pujol', 'museu'])
>>> jrol.tipus_connexions(g) ==  set()# doctesttag: +TAG=3_grafs-connexions
True
>>> nx.add_path(g,['pujol', 'parc', 'vall'], connexio='autovia')
>>> jrol.tipus_connexions(g) == {'autovia'}# doctesttag: +TAG=3_grafs-connexions
True
>>> nx.add_path(g,['vila', 'vall', 'platja'], connexio='drecera')
>>> nx.add_path(g,['vila', 'platja', 'parc'], connexio='carretera')
>>> g.add_edge('vila', 'bar', connexio='porta')
>>> g.add_edge('vila', 'parc', connexio='pont')
>>> g.add_edge('platja', 'cova', connexio='roques')
>>> g.add_edge('platja', 'barca', connexio='inflable')
>>> jrol.tipus_connexions(g) == {'pont', 'carretera', 'drecera', 'inflable',
... 'roques', 'porta', 'autovia'}# doctesttag: +TAG=3_grafs-connexions
True
>>> g.add_edge('cova', 'museu', connexio='telefèric')
>>> g.add_edge('pujol', 'vall', connexio='camí')
>>> g.add_edge('pujol', 'platja', connexio='camí')
>>> jrol.tipus_connexions(g) ==  {'pont', 'drecera', 'camí', 'carretera',
... 'inflable', 'roques', 'telefèric', 'porta', 'autovia'}# doctesttag: +TAG=3_grafs-connexions
True
>>> g2 = nx.complete_graph(100)
>>> for a,b in g2.edges():
...    g2[a][b]['connexio'] = 'salt'
...
>>> jrol.tipus_connexions(g2) == {'salt'}# doctesttag: +TAG=3_grafs-connexions
True
>>> g3 = nx.union(g,g2)
>>> jrol.tipus_connexions(g3) == {'salt', 'pont', 'drecera', 'camí', 'carretera',
... 'inflable', 'roques', 'telefèric', 'porta', 'autovia', 'salt'} # doctesttag: +TAG=3_grafs-connexions
True

Grafs:

Els exemples que compten per la nota són només els que van seguits de # doctesttag: +TAG=3_grafs-doscamins.

>>> import networkx as nx
>>> import jrol
>>> g = nx.Graph()
>>> g.add_nodes_from(['bar','ciutat','cova','platja','barca',
...  'vall','parc','pujol','museu'])
>>> g.add_edges_from([ ('ciutat','bar'), ('ciutat','parc'),
...  ('parc','pujol'), ('ciutat','vall'), ('ciutat','platja'),
...  ('platja','barca'), ('platja','cova'), ('platja','vall'),
...  ('parc', 'vall') ])
>>> jrol.dos_camins(g, 'ciutat', 'vall')# doctesttag: +TAG=3_grafs-doscamins
2
>>> jrol.dos_camins(g, 'cova', 'barca')# doctesttag: +TAG=3_grafs-doscamins
1
>>> jrol.dos_camins(g, 'parc', 'museu')# doctesttag: +TAG=3_grafs-doscamins
0
>>> jrol.dos_camins(g, 'ciutat', 'plutó')# doctesttag: +TAG=3_grafs-doscamins
-1
>>> jrol.dos_camins(g, 'pujol', 'barca')# doctesttag: +TAG=3_grafs-doscamins
2
>>> jrol.dos_camins(g, 'cova', 'platja')# doctesttag: +TAG=3_grafs-doscamins
1
>>> jrol.dos_camins(g, 'museu', 'cova')# doctesttag: +TAG=3_grafs-doscamins
0
>>> jrol.dos_camins(g, 'plutó', 'urà')# doctesttag: +TAG=3_grafs-doscamins
-1
>>> g = nx.complete_graph(100)
>>> g.add_edge('a', 0)
>>> jrol.dos_camins(g, 'a', 0)# doctesttag: +TAG=3_grafs-doscamins
1
>>> jrol.dos_camins(g, 0, 1)# doctesttag: +TAG=3_grafs-doscamins
2

Recursivitat: Classificar productes

Els exemples que compten per la nota són només els que van seguits de # doctesttag: +TAG=4_classifica.

>>> from string import ascii_uppercase
>>> from producte import Producte
>>> from classifica import classifica
>>> l = [Producte('N35', 11.52), Producte('M75', 18.07), Producte('Z12', 13.52), Producte('K89', 12.67)]
>>> l2 = classifica(l, 16.5)
>>> l2 # doctesttag: +TAG=4_classifica
[N35: preu = 11.5, Z12: preu = 13.5, K89: preu = 12.7]
>>> l2 = classifica(l, 12.5)
>>> l2 # doctesttag: +TAG=4_classifica
[N35: preu = 11.5]
>>> l2 = classifica(l, 14.0)
>>> l2 # doctesttag: +TAG=4_classifica
[N35: preu = 11.5, Z12: preu = 13.5, K89: preu = 12.7]
>>> l2 = classifica(l, 20.0)
>>> l2 # doctesttag: +TAG=4_classifica
[N35: preu = 11.5, M75: preu = 18.1, Z12: preu = 13.5, K89: preu = 12.7]
>>> l2 = classifica(l, 0)
>>> l2 # doctesttag: +TAG=4_classifica
[]
>>> l = [Producte('A', 1.52), Producte('B', 8.07), Producte('C', 3.52), Producte('D', 2.67)]
>>> l2 = classifica(l, 6.5)
>>> l2 # doctesttag: +TAG=4_classifica
[A: preu = 1.5, C: preu = 3.5, D: preu = 2.7]
>>> l2 = classifica(l, 2.5)
>>> l2 # doctesttag: +TAG=4_classifica
[A: preu = 1.5]
>>> l2 = classifica(l, 4.0)
>>> l2 # doctesttag: +TAG=4_classifica
[A: preu = 1.5, C: preu = 3.5, D: preu = 2.7]
>>> l2 = classifica(l, 10.0)
>>> l2 # doctesttag: +TAG=4_classifica
[A: preu = 1.5, B: preu = 8.1, C: preu = 3.5, D: preu = 2.7]
>>> l2 = classifica(l, 0)
>>> l2 # doctesttag: +TAG=4_classifica
[]
>>> r = range(100, 500, 50)
>>> l = list(map(lambda n, p: Producte(n, p), ascii_uppercase, r))
>>> pm = 300
>>> l2 = classifica(l, pm + 10)
>>> if l2 != l[:r.index(pm)+1]: print(l2) # doctesttag: +TAG=4_classifica
>>> pm = 350
>>> l2 = classifica(l, pm + 10)
>>> if l2 != l[:r.index(pm)+1]: print(l2) # doctesttag: +TAG=4_classifica
>>> pm = 200
>>> l2 = classifica(l, pm + 10)
>>> if l2 != l[:r.index(pm)+1]: print(l2) # doctesttag: +TAG=4_classifica
>>> pm = 100
>>> l2 = classifica(l, pm + 10)
>>> if l2 != l[:r.index(pm)+1]: print(l2) # doctesttag: +TAG=4_classifica
>>> pm = 450
>>> l2 = classifica(l, pm + 10)
>>> if l2 != l[:r.index(pm)+1]: print(l2) # doctesttag: +TAG=4_classifica
>>> r = range(100, 1500, 50)
>>> l = list(map(lambda n, p: Producte(n, p), ascii_uppercase, r))
>>> pm = 1300
>>> l2 = classifica(l, pm + 10)
>>> if l2 != l[:r.index(pm)+1]: print(l2) # doctesttag: +TAG=4_classifica
>>> pm = 800
>>> l2 = classifica(l, pm + 10)
>>> if l2 != l[:r.index(pm)+1]: print(l2) # doctesttag: +TAG=4_classifica
>>> pm = 1200
>>> l2 = classifica(l, pm + 10)
>>> if l2 != l[:r.index(pm)+1]: print(l2) # doctesttag: +TAG=4_classifica
>>> pm = 1000
>>> l2 = classifica(l, pm + 10)
>>> if l2 != l[:r.index(pm)+1]: print(l2) # doctesttag: +TAG=4_classifica
>>> pm = 750
>>> l2 = classifica(l, pm + 10)
>>> if l2 != l[:r.index(pm)+1]: print(l2) # doctesttag: +TAG=4_classifica