Sklizeň a trh

Záhon je zralý, když roste tolik dní, kolik jeho plodina potřebuje. Pak ho Ema sklidí: z každého semínka je jeden kus úrody a úroda putuje do stodoly. A záhon začne růst znovu od 0: na Emině farmě každý záhon po sklizni vyroste znovu.

Stodola je slovník. Jeho klíče jsou názvy plodin a hodnoty říkají, kolik kusů je ve stodole. Přidávání je postup počítání z lekce o slovnících: stodola[nazev] = (stodola[nazev] or 0) + zahon.seminka. Poprvé je stodola[nazev] rovno nil a or 0 z něj udělá 0. Bez něj program skončí hned při první sklizni:

main.lua:95: attempt to perform arithmetic on a nil value (field '?')

Otazník je tam proto, že klíč není název napsaný v kódu, ale hodnota proměnné nazev. A pozor na stodola.nazev: to je klíč "nazev", ne název plodiny, takže by všechna úroda skončila pod jedním klíčem.

Záhon sklízejte hned potom, co jeho popis přidáte do seznamu dne. V den sklizně pak řádek ukáže mrkev 3/3 a další den mrkev 1/3. Kdybyste sklízeli před popisem, ukázal by mrkev 0/3.

Na konci sezóny Ema odveze všechno ze stodoly na trh. Funkce prodej(stodola) vypíše jeden řádek s každou plodinou, jejím počtem a cenou jednoho kusu a s celkovou částkou. Pak celkovou částku vrátí a hlavní program ji přičte k mincím. Plodiny mají být podle abecedy. Jenže pořadí, ve kterém pairs prochází slovník, není nijak dané a může se změnit i mezi dvěma spuštěními. Klíče proto nejdřív posbírejte do seznamu a ten seřaďte, jako v lekci o slovnících. Třeba vejce spočítaná podle slepice, která je snesla:

local snesla = {"Zlatka", "Kropenka", "Zlatka"}
local pocty = {}
for _, slepice in ipairs(snesla) do
    pocty[slepice] = (pocty[slepice] or 0) + 1
end

local jmena = {}
for jmeno in pairs(pocty) do
    table.insert(jmena, jmeno)
end
table.sort(jmena)
for _, jmeno in ipairs(jmena) do
    print(jmeno, pocty[jmeno])
end

Vypíše:

Kropenka	1
Zlatka	2

Ve vašem programu bude mít řazení vlastní funkci, serazeneNazvy(t), která vrátí seřazený seznam klíčů slovníku. prodej pak prochází serazeneNazvy(stodola) pomocí ipairs a ke každému názvu zjistí cenu plodiny pomocí najdiPlodinu. Obě funkce dejte pod popisZahon: prodej volá najdiPlodinu, takže musí být pod ní.

Pokyny

V hlavním programu vytvořte nad cyklem přes dny prázdný slovník stodola. Ve vnitřním cyklu, pod řádkem, který přidá popis záhonu do seznamu, záhon skliďte, pokud je zralý: přičtěte jeho semínka do stodoly pod názvem plodiny a jeho dnyRustu nastavte zpátky na 0. Dny teď vypadají takto:

Den 1 (slunečno): mrkev 1/3, pšenice 1/2, dýně 1/6
Den 2 (slunečno): mrkev 2/3, pšenice 2/2, dýně 2/6
Den 3 (déšť): mrkev 3/3, pšenice 2/2, dýně 4/6
Den 4 (zataženo): mrkev 1/3, pšenice 1/2, dýně 5/6
Den 5 (slunečno): mrkev 2/3, pšenice 2/2, dýně 6/6
Den 6 (zataženo): mrkev 3/3, pšenice 1/2, dýně 1/6

Pokud záhon ukazuje 0/3 místo 3/3, sklízíte ho před popisem.

Pod popisZahon napište funkci serazeneNazvy(t), která pomocí pairs posbírá klíče slovníku t do seznamu, seřadí ho pomocí table.sort a vrátí ho.

Pod ni napište funkci prodej(stodola). Pro každý název ze serazeneNazvy(stodola) sestaví text jako mrkev 8 x 5 (název, počet ve stodole a cenu na trhu) a k celkové částce přičte počet krát cenu. Pak vypíše jeden řádek s Trh:, texty spojenými pomocí ", ", rovnítkem a celkovou částkou, například Trh: mrkev 8 x 5, pšenice 18 x 3 = 94, a celkovou částku vrátí.

Na konci hlavního programu přičtěte k proměnné mince, co vrátí prodej(stodola), a vypište mince na konci sezóny. Program končí takto:

Den 6 (zataženo): mrkev 3/3, pšenice 1/2, dýně 1/6
Trh: dýně 2 x 20, mrkev 8 x 5, pšenice 18 x 3 = 134
Konec sezóny: 140 mincí

Ema prodala mrkev ze dvou sklizní (4 + 4) a pšenici ze tří (6 + 6 + 6).

Začněte programovat zdarma

Registrací souhlasíte s provozními podmínkami a zásadami ochrany osobních údajů.

Nebo se registrujte pomocí:

4/7