Matrici - Liste di liste 3 - Challenges

Sfida - Precariato a Murabasso

✪ Siamo nel 2020 e per Pier Giorgio della Cinta di Murabasso il lavoro fisso è ormai un miraggio. Ogni mese si giostra tra vari lavoretti e, siccome è una persona poco ordinata, tiene un registro di tutti i lavoretti part time ed occasionali che svolge per portare a casa la pagnotta.

Il problema del disordine è infatti che usa liste, ma il povero Pier Giorgio non sa che esistono strutture molto più comode! Una volta risolto potresti guardare la sfida simile Precariato ad Altomuro che usa invece liste di dizionari.

Questi dati sono salvati un una lista di liste, in cui ogni elemento è così composto:

[Etichetta, Ammontare, Stato_pagamento]

Si sta avvicinando il momento di compilare la dichiarazione dei redditi e Pier Giorgio avrebbe bisogno di sapere quanti soldi ha incassato finora e quanti se ne deve ancora aspettare. In più gli piacerebbe sapere quale è stato il lavoro più redditizio dell’anno (GIA’ PAGATO)

  1. Calcolare il totale già ricevuto e il totale da ricevere ancora

  2. Trovare il lavoro GIA’ PAGATO più redditizio

Esempio - dati:

[1]:
lavori = [
    ["Straordinari in fonderia", 175.13, "non pagato"],
    ["Part time gelateria",      450, "non pagato"],
    ["Rendita investimenti",     500, "pagato"],
    ["Pettinatura pitoni",       1000, "pagato"],
    ["Installazione artistica",  600, "non pagato"],
    ["Noleggio scarpe eleganti", 100, "non pagato"]
]

STAMPA:

1.  Totale ricevuto:  1500
    Totale da ricevere:  1325.13
2.  Il lavoro più pagato finora è:  Pettinatura pitoni
[2]:


lavori = [ ["Straordinari in fonderia", 175.13, "non pagato"], ["Part time gelateria", 450, "non pagato"], ["Rendita investimenti", 500, "pagato"], ["Pettinatura pitoni", 1000, "pagato"], ["Installazione artistica", 600, "non pagato"], ["Noleggio scarpe eleganti", 100, "non pagato"] ] # scrivi qui

Sfida - Incartati

✪✪ La fabbrica Le Cariamelle in collaborazione con vari studi dentistici produce caramelle giganti iper-zuccherose che stiva in uno scaffale con n ripiani aventi ciascuno m scompartimenti. Purtroppo, una visita del Nuclo Anti Sofisticazioni dei carabinieri scopre che le confezioni non riportano i gravi rischi per la salute: per evitare multe stellari, la fabbrica deve al più presto incartarle, e assegna quindi ad ogni ripiano un tipo di confezionamento diverso.

Per esempio, dato uno scaffale di cariamelle così:

[['f','e','a','b'],
 ['a','c','g','f'],
 ['b','c','d','f']]

e una lista di confezioni come ['/','|','!'], dovrai MODIFICARE lo scaffale così:

[['/f/', '/e/', '/a/', '/b/'],
 ['|a|', '|c|', '|g|', '|f|'],
 ['!b!', '!c!', '!d!', '!f!']]

Più formalmente, scrivi una funzione che data una matrice scaffale come lista di liste di stringhe, MODIFICA scaffale mettendo ai lati di ogni stringa caratteri presi dalla lista confezioni. Ogni riga avrà una confezione diversa, vedere esempi.

  • se la lista di confezioni ha lunghezza diversa dalle righe di scaffale, solleva ValueError

[4]:
from pprint import pprint

def incarta(scaffale, confezioni):
    raise Exception('TODO IMPLEMENT ME !')

m1 = [['a']]
riga_zero_m1 = m1[0]
res = incarta(m1, ['|'])
assert res == None
assert m1 == [['|a|']]
# controlla che la riga zeresima punti ancora esattamente alla stessa regione di memoria originale
assert id(m1[0]) == id(riga_zero_m1)

m2 = [['f','g']]
incarta(m2, ['|'])
assert m2 == [['|f|','|g|']]

m3 = [['a'],
      ['b'],]
incarta(m3, ['?','|'])
assert m3 == [['?a?'],
              ['|b|']]

m3 = [['f','e','a','b'],
      ['a','c','g','f'],
      ['b','c','d','f']]
incarta(m3, ['/','|','!'])
from pprint import pprint
#pprint(m3, width=53)
assert m3 == [['/f/', '/e/', '/a/', '/b/'],
              ['|a|', '|c|', '|g|', '|f|'],
              ['!b!', '!c!', '!d!', '!f!']]

try:
    incarta([['a']], ['/','!'])
    raise Exception('Avrei dovuto fallire prima !')
except ValueError:
    pass

Sfida - Cantiere pubblico

✪✪✪ Il sindaco di Tangentonia ha ordinato che venga costruita la sua nuova mega-villa con fondi pubblici. Per dirigere i lavori ha assunto come ingegnere capo il figlio neo-diplomato geometra: prevedibilmente, la casa risultante è un disastro… ci sono i mattoni dei piani, ma mancano le mura esterne, il tetto, le fondamenta e le mattonelle per ricoprire i piani:

[['f','e','a','b'],
 ['a','c','g','f'],
 ['b','c','d','f']]

Per rimediare alla situazione imbarazzante, il sindaco decide di assumere te, perchè nel curriculum che hai inviato alla pubblica amministrazione hai falsamente dichiarato di essere un ingegnere plurilaureato con vent’anni d’esperienza in costruzione di ville abusive.

Data una lista di mattonelle come per es ['^','-','_','='], dovrai produrre una NUOVA casa così (le mura sono sempre '|'):

[  [' ', '^', '^', '^', '^', ' '],
   ['|', 'f', 'e', 'a', 'b', '|'],
   ['|', '-', '-', '-', '-', '|'],
   ['|', 'a', 'c', 'g', 'f', '|'],
   ['|', '_', '_', '_', '_', '|'],
   ['|', 'b', 'c', 'd', 'f', '|'],
   ['|', '=', '=', '=', '=', '|']
]

Più formalmente, scrivi una funzione che:

  1. Data una matrice mat come lista di liste di stringhe nxm e una lista di caratteri mattonelle di n+1 elementi, RITORNA una NUOVA matrice ottenuta intervallando le righe di mat con caratteri presi da mattonelle.

  • Ai lati delle righe metti sempre il carattare '|' eccetto per l’ultimo piano del tetto

  • Se mattonelle è di lunghezza diversa dal numero di righe di mat + 1, solleva ValueError

  1. L’esercizio chiede solo di restituire una matrice. Volendo far qualcosa in più per stampare meglio, una volta ottenuta la matrice chiamando la funzione, prova a stampare qualcosa del genere (il sindaco ti ricompenserà generosamente, tanto non sono soldi suoi):

 ^^^^
|feab|
|----|
|acgf|
|____|
|bcdf|
|====|
[5]:

from pprint import pprint def cantiere(mat, mattonelle): raise Exception('TODO IMPLEMENT ME !') m1 = [['a']] assert cantiere(m1, ['^','=']) == [ [' ','^',' '], ['|','a','|'], ['|','=','|']] assert m1 == [['a']] m2 = [['f','g']] assert cantiere(m2, ['^','=']) == [[' ', '^', '^', ' '], ['|', 'f', 'g', '|'], ['|', '=', '=', '|']] m3 = [['a'], ['b'],] assert cantiere(m3, ['^','-','=']) == [[' ', '^', ' '], ['|', 'a', '|'], ['|', '-', '|'], ['|', 'b', '|'], ['|', '=', '|']] m4 = [['f','e','a','b'], ['a','c','g','f'], ['b','c','d','f']] #pprint(cantiere(m4, ['^','-','-','='])) #pprint(m3, width=53) assert cantiere(m4, ['^','-','_','=']) == [[' ', '^', '^', '^', '^', ' '], ['|', 'f', 'e', 'a', 'b', '|'], ['|', '-', '-', '-', '-', '|'], ['|', 'a', 'c', 'g', 'f', '|'], ['|', '_', '_', '_', '_', '|'], ['|', 'b', 'c', 'd', 'f', '|'], ['|', '=', '=', '=', '=', '|']] try: cantiere([['a']], ['/','!','=']) raise Exception('Avrei dovuto fallire prima !') except ValueError: pass