Programování

Adventní kalendář pro nerdy nabízí místo čokolád a bonbónů programovací kvízy

Do Vánoc nám zbývá už jen pár týdnů, a tak si můžete po večerech opět luštit adventní kalendář pro programátory – Advent of Code.

Každý den na vás čeká zadání pro dva úkoly, které musíte vyřešit a napsat správnou odpověď, za kterou dostanete hvězdičku.

Kouzlo spočívá v tom, že je pouze na vás, jak se doberete řešení. Můžete použít čtvrtku papíru, kalkulačku, anebo si napíšete jednoduchý skript ve svém oblíbeném programovacím jazyku.

9d7130ef-a88c-4365-afb6-1f97d4329f59
Adventní kalendář pro programátory a nerdy všeho druhu

Advent of Code tak může být i zajímavým cvičením pro začátečníky, kterým obecně často chybí motivace k tomu, proč se vlastně učit programovat. Třeba právě k tomu, abyste vyřešili adventní kalendář pro kodéry!

První úkol

Pojďme si to ukázat na prvním úkolu zkraje prosince.

Mějme elfy, kteří nesou v pytli pamlsky s různou hodnotou kalorií a my hledáme elfa, kterých jich nese zdaleka nejvíce. Naštěstí máme seznam ve formě textového souboru, kde je pytel každého elfa oddělený prázdným řádkem.

Takže kdyby seznam vypadal takto:

1000
2000
1500

250
500
250
10000

Víme, že nejvíce pamlsků nese druhý elf, protože jejich kalorická suma činí 11 000 cal.

Soubor pro hádanku obsahuje tisíce řádků

Vstupní soubor první zkoušky nicméně čítá několik tisíc podobných řádků, takže s kalkulačkou by to bylo složité. Soubor, který si stáhnete po přihlášení skrze GitHub, Google a další služby, ale můžete na pár řádcích kódu zpracovat třeba v Pythonu a spočítat, jak velký je pytel s pamlsky toho nejštědřejšího elfa.

55a72fde-8396-4a69-b067-34335ee948a2
Toto se vám na kalkulačce nebude chtít počítat

V kódu níže nejprve otevřu textový soubor stažený z Advent of Code, budu z něj číst řádek po řádku a sčítat numerické hodnoty kalorií. Pokud ale narazím na prázdný řádek, jedná se o konec výpisu pro pytel s pamlsky aktuálního elfa.

with open("zadani.txt", "r") as soubor:
    radek = soubor.readline()
    obsahPytle = 0
    pocetPytlu = 0
    zacatekPytle = 0
    nejvetsiPytel = 0
    zacatekNejvetsihoPytle = 0
    konecNejvetsihoPytle = 0
    radky = 1
    while radek:
        if radek.strip() == "":
            if obsahPytle > nejvetsiPytel:
                nejvetsiPytel = obsahPytle
                zacatekNejvetsihoPytle = zacatekPytle
                konecNejvetsihoPytle = radky - 1
            if obsahPytle > 0:
                pocetPytlu += 1
            obsahPytle = 0
            zacatekPytle = radky + 1
        else:
            obsahPytle += int(radek)
        radky += 1
        radek = soubor.readline()

    print(f"Prosel jsem {radky} radku")
    print(f"Nasel jsem v nich {pocetPytlu} pytlu")
    print(f"Pytel nejbohatsiho elfa na radcich {zacatekNejvetsihoPytle}-{konecNejvetsihoPytle} obsahoval pamlsky s hodnotou {nejvetsiPytel} kalorii")

Jelikož hledám ten největší pytel, porovnám součet s aktuálním maximem. Pokud je pytel větší, aktualizuji maximum, anuluji součet a pokračuji dalším řádkem, pokud je k dispozici (tedy pokud už nejsem na konci souboru).

61d58794-e101-4cfe-8280-cd520321e00d
Největší pytel má hodnotu 70 296 kalorií
b7cda998-857d-4315-b852-494165dd7ff8
A protože jsme si spočítali i pozici největšího pytle v souboru, můžeme si to s kalkulačkou v ruce ověřit na surových datech

Nakonec se dopídím, že největší pytel obsahoval pamlsky se souhrnnou kalorickou hodnotou 70 296 cal, což je nakonec i správná odpověď první hádanky a já dostanu svoji první hvězdičku.

Pokud si tedy chcete zábavně procvičit svůj oblíbený programovací jazyk, směle do toho a sbírejte hvězdičky v Advent of Code.

6805fb8b-ec4d-44c5-9379-c7325d4f4306
Vyplnil jsem odpověď
2c526e61-6eda-46da-be82-ef68c874def8
A získal svoji první hvězdičku
Diskuze (2) Další článek: Sedmdesát let od Velkého londýnského smogu. Počasí a uhlí na několik dnů zastavily Londýn, tisíce lidí zemřely

Témata článku: , , , , , , , , , , , , , ,