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 = [
           ["Pettinatura pitoni", 1000, "pagato"],
           ["Straordinari in fonderia", 175.13, "non pagato"],
]

STAMPA:

1. Totale ricevuto: 1000
   Totale da ricevere: 175.13

2. Il lavoro più pagato finora è: Pettinatura pitoni
[2]:


lavori = [
    ["Ripetizioni statistica", 300, "pagato"],
    ["Part time gelateria", 450, "non pagato"],
    ["Rendita investimenti", 500, "pagato"],
    ["Installazione artistica", 600, "non pagato"],
    ["Vendita zafferano", 700, "pagato"],
    ["Noleggio scarpe eleganti", 100, "non pagato"]
]


# scrivi qui


Sfida - Incartati

✪✪ La ditta 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 caramelle non sono confezionate a dovere: 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 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 mettere 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, dalla matrice ottenuta chiamando la funzione provare a stampare qualcosa del genere:

 ^^^^
|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