11

Problém spolubydlení

Možná se to nezdá, ale těch několika lekcích, kterými jste prošli, jste již vybavení téměř všemi nezbytnými technickými dovednostmi k tomu, abyste dokázali naprogramovat řešená našeho problém se spolubydlením ze začátku kurzu. Pravda, po takto krátkém kurzu ještě nemáte dost zkušeností na to, abyste si na výsledný program troufli sami. Když jej ale uvidíte už napsaný, začnete poznávat téměř všechny věci, které jsou v programu použity - proměnné, podmínky, seznamy, cykly a další.

Řešení

Připomeňme si tabulku výdajů, kterou jsme viděli na začátku kurzu.

Jméno Věc Částka
PetrPrací prášek240 kč
OndraSavo80 kč
PavlaToaleťák65 kč
ZuzkaMýdlo50 kč
PavlaZávěs do koupelny350 kč
LiborPivka na kolaudačku124 kč
PetrPytle na odpadky75 kč
MíšaUtěrky na nádobí130 kč
OndraToaleťák120 kč
MíšaPečící papír30 kč
ZuzkaSavo80 kč
PetrTapeta na záchod315 kč
OndraToaleťák64 kč

Popis řešení v lidské řeči by mohl vypadat například takto:

  1. Spočítej kolik každý člen utratil celkem,
  2. spočítej průměrnou útratu na jednoho člena,
  3. spočítej rozdíly jednotlivých členů proti průměru,
  4. všechny peníze těch, kteří zaplatili podprůměr, dej do banku,
  5. bank rozděl mezi ty, kteří zaplatili nad průměr.

Python program

Jelikož už umíme v Pythonu reprezentovat data pomocí seznamů, můžeme výše uvedenou tabulku zapsat jako seznam seznamů takto:

vydaje = [
  ['Petr', 'Prací prášek', 240],
  ['Ondra', 'Savo', 80],
  ['Pavla', 'Toaleťák', 65],
  ['Zuzka', 'Mýdlo', 50],
  ['Pavla', 'Závěs do koupelny', 350],
  ['Libor', 'Pivka na kolaudačku', 124],
  ['Petr', 'Pytle na odpadky', 75],
  ['Míša', 'Utěrky na nádobí', 130],
  ['Ondra', 'Toaleťák', 120],
  ['Míša', 'Pečící papír', 30],
  ['Zuzka', 'Savo', 80],
  ['Petr', 'Tapeta na záchod', 315],
  ['Ondra', 'Toaleťák', 64]
]

Druhý krok je přeložit lidský popis řešení do Python kódu. Takový program by mohl vypadat například takto:

import statistics

seznamJmen = []
utraty = []

for vydaj in vydaje:
  jmeno = vydaj[0]
  utrata = vydaj[2]
  if jmeno in seznamJmen:
    index = seznamJmen.index(jmeno)
    utraty[index] += utrata
  else:
    seznamJmen.append(jmeno)
    utraty.append(utrata)

prumernaUtrata = statistics.mean(utraty)

for index, utrata in enumerate(utraty):
  vyrovnani = round(utrata - prumernaUtrata)
  if vyrovnani > 0:
    print(seznamJmen[index] + ' dostane\t' + str(vyrovnani))
  else:
    print(seznamJmen[index] + ' má dáti\t' + str(-vyrovnani))

Seznamy v proměnných seznamJmen a utraty představují tabulku celkových útrat pro každého jednoho člověka.

Výsledný Python program si můžete stáhnout z tohoto odkazu.