Advent of Code 2024

Od Petr Zemek, 2024-12-28

Shrnutí mých dojmů z letošního Advent of Code.

Co je to Advent of Code?

Těm, kteří o Advent of Code slyší prvně, bych jej chtěl krátce představit. Pokud víte, o co jde, tak tuto sekci klidně přeskočte.

Stručně řečeno, jedná se o verzi adventního kalendáře pro programátory :-). Jen místo mlsání sladkostí každý den plníte zadaný úkol, za jehož vyřešení získáváte zlaté hvězdy. Advent of Code je tvořen 25 úkoly, z nich každý je rozdělen na dvě části. Za splnění každé části dostanete zlatou hvězdu. Cílem celého snažení je získat těchto hvězd 50 (25 krát 2). Před zahájením práce na druhé části každého z úkolů je nejdřív potřeba splnit první část. Až po jejím splnění se vám odtajní zadání druhé části. Druhá část pak většinou nějakým způsobem navazuje na první část. Např. se jedná o rozšíření zadání, bližší dospecifikování některé části zadání (čti oprava), či navýšení výpočetní náročnosti. Zadání každého úkolu je pro všechny společné. Co se liší, tak jsou vstupní data, která má každý unikátní. Cílem úkolů je vstupní data načíst, zpracovat podle zadání a vypsat výsledek. Po splnění každé části vyplníte vaše řešení do formuláře a dozvíte se, zda bylo vaše řešení správné. Pokud nebylo, tak máte samozřejmě možnost po určité krátké době učinit další pokus. K vypracování můžete využít jakéhokoliv programovacího jazyka či nástrojů.

Podoba a náročnost úkolů je poměrně dost variabilní. Zadání jsou ve své podstatě algoritmická, ale rámcově zapadají do Santových slastí a strastí. Jednou z dovedností, kterou při řešení úkolů využijete, je schopnost odlišení, co je podstatné z hlediska zadání úkolu a co je jen omáčka. Úkoly jsou opravdu různorodé, a tak si např. vyzkoušíte řešení bludišť, vykonávání instrukcí pro smyšlený počítač, hledání vzorů v obraze, fragmentaci disku, hledání nejkratších cest, výpočet kombinací, ovládání robotů ovládajících roboty, hledání vzájemně propojených počítačů v grafu, či opravu binárních sčítaček. Obtížnost jednotlivých úkolů se také velmi liší a závisí nejen na vašich znalostech a zkušenostech, ale i na tom, jak moc si s úkolem vyhrajete (zda vám jde o vymazlené řešení, či jedete na rychlost a čitelnost kódu a testy hážete za hlavu). Za sebe mohu říct, že zatímco některé úkoly mi zabraly 1-2 hodiny, tak u některých jsem strávil klidně 10 hodin. Troufám si tvrdit, že pokud člověk netuší, jak některý z úkolů principiálně řešit (např. neznáte matematický vzorec či informatický koncept), tak musí jistý čas věnovat i studiu. Alespoň se tak člověk něco nového naučí :-).

Advent of Code je v neposlední řadě také rychlostní soutěž. Ke zveřejnění každého úkolu dochází v určitý stanovený čas (stejně jako v předchozích letech tomu bylo v 06:00 CET), a čím dříve úkol vyřešíte, tím víc dostanete bodů (první získá 100 bodů, druhý 99 atd.). Pokud vás zajímá kompetitivní programování, tak určitě neváhejte. Za sebe mohu říct, že za ty časy, za které to ti nejlepší lidé řešili, jsem někdy nebyl ani schopen pochopit zadání :-D. Ale je fakt, že čím dál větší roli hraje AI/ML a LLMs.

Co říkám na Advent of Code 2024?

Pozor: Tato sekce obsahuje spojlery. Pokud plánujete letošní Advent of Code řešit, tak zvažte si text přečíst až později.

Celkově se mi letošní Advent of Code líbil a bavil mě. Co se týče celkové obtížnosti, tak úkoly byly jednodušší než loni (2023), i když na druhou stranu je třeba říct, že minulý rok byl zřejmě jeden z nejnáročnějších. Stejně jsem se ale u některých úloh zapotil :-). Jediný nedostatek, který jsem u letošního Advent of Code vnímal, bylo velké množství úloh založených na principu procházení dvourozměrnou mřížkou, kdy např. den 18 byl zjednodušená verze dnu 16 (alespoň mně to tak přišlo).

Letošní Advent of Code jsem řešil v Pythonu. Celkově odhaduji, že jsem nad ním strávil přes 100 hodin času, protože jsem si i celkem dal záležet na tom, aby mé řešení bylo čitelné. Zase na druhou stranu se mi podařilo vyřešit všechny úlohy a maximální dobu běhu programu jsem měl 6.5 sekundy (většina úloh ale běžela cca 0.1 sekundy).

Které úkoly mě nejvíce bavily?

  • Den 11. Především kvůli nutnosti optimalizace doby běhu a paměťových nároků tak, aby to bylo upočítatelné.
  • Den 15. Bavily mě obě části, jak ta první (jednodušší), tak ta druhá (složitější z důvodu toho, že krabice nyní byly přes dvě políčka).
  • Den 19. Jednalo se o originální úlohu, a opět mě bavily obě části.

Které úkoly mě nejméně bavily?

  • Den 14 (druhá část). Zadání druhé části prakticky bylo "najděte iteraci, ve které konfigurace robotů vytvoří vánoční stromek", aniž by bylo řečeno, jak má onen stromek vypadat. Člověk tak musel procházet velké množství výstupů na terminál, aby zjistil, jak stromek vypadá, a potom napsal program, který zjistí, ve které iteraci se stromek zobrazí.
  • Den 17 (druhá část). Pro splnění druhé části bylo potřeba analyzovat vstup a napsat program na míru danému vstupu. Takový typ úkolů nemám moc rád; jsem raději, pokud je možné v relativně rozumné době napsat generické řešení.
  • Den 24 (druhá část). Stejně jako u dnu 17, i zde bylo potřeba pro splnění druhé části potřeba analyzovat vstup a napsat program s mnoha předpoklady.

Které úkoly mi daly nejvíce zabrat?

  • Den 12 (druhá část). Především kvůli detekcí počtu stěn.
  • Den 21 (obě části). Především kvůli nalezení pohybů, které budou mít za následek co nejméně vstupních příkazů (první i druhá část), a potom u druhé části vymyšlení přístupu, který bude upočítatelný s ohledem na paměťové nároky.
  • Den 24 (druhá část). Především kvůli nutnosti analýzy vstupu.

Které úkoly jsem měl nejrychleji vyřešené?

Letos jsem u většiny úloh vstával tak, že jsem je začal řešit hned po zveřejnění (06:00 CET). Ač se mi rozhodně nedařilo být jeden z nejrychlejších, tak u následujících třech úloh jsem měl poměrně slušný čas a pozici:

  • Den 13 - U první části jsem měl čas 00:17:52 a pozici 1 652. U druhé části to již bohužel tak slavné nebylo.
  • Den 22 - U první části jsem měl čas 00:20:57 a pozici 2 778. U druhé části jsem měl čas 00:44:01 a pozici 3 157.
  • Den 25 - U první části jsem měl čas 00:18:32 a pozici 2 078. U druhé části jsem měl čas 00:18:39 a pozici 1 693. Letos to byl můj nejlepší výsledek :-).

Adventní kalendář

Vypadá letos takto:


Advent of Code 2024

Zdrojové kódy

Zdrojáky k mým řešením všech úloh jsou u mě na GitHubu, včetně doby běhu každého úkolu.

A co vy? Řešili jste Advent of Code 2024? Co na něj říkáte?

Obsah tohoto pole je soukromý a nebude veřejně zobrazen.

Filtrované HTML (využíváno)

  • Povolené HTML značky: <a href hreflang> <em> <strong> <cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <table>
  • Zvýraznění syntaxe kódu lze povolit přes následující značky: <code>, <blockcode>, <bash>, <c>, <cpp>, <haskell>, <html>, <java>, <javascript>, <latex>, <perl>, <php>, <python>, <ruby>, <rust>, <sql>, <text>, <vim>, <xml>, <yaml>.
  • Řádky a odstavce se zalomí automaticky.
  • Webové a e-mailové adresy jsou automaticky převedeny na odkazy.
CAPTCHA
4 + 2 =
Vyřešte tento jednoduchý matematický příklad a vložte výsledek. Např. pro 1+3 vložte 4.
Nějak se mi tady rozmohl spam, takže poprosím o ověření.