Cobweb

slama.dev

Cobweb

Advent of Kačka

4. problém ☕

“Trocha lithia… pár atomů hassia… perfektní.", prohlásíš při míchání jednoho z receptů, zatím co elfové hrají hodinový loop theme songu z Breaking Bad (kromě Rona, který ti při vaření pomáhá a je v tom podezřele dobrý).

Po umíchání receptu naliješ sloučeninu do kávovaru, použiješ jeho parní trysku jako improvizovaný hasičák a… úspěch! Monitor přestane hořet, opět se rozsvítí a po chvíli zobrazí dialogové okno ZADEJ SOUČET ÚČETNICTVÍ: .

Zadání součtu zfalšovaného upraveného zisku a stisknutí enteru tě odmění zeleným zaškrtnutím a konfetami (odkud se vzaly?!). Elfové se začnou radovat a skandovat “Podívejte na to jmění, nepůjdeme do vězení!" a zdá se, že vše dopadlo dobře.

Před tím, než s elfy začneš slavit, si však všimneš zvláštního souboru na ploše se jménem things-customers-said-this-year.txt. Dvojklikem soubor otevřeš a zdá se, že obsahuje přesně to, co jméno napovídá – seznam věcí které zákazníci řekli (s citlivými informacemi převedenými na unikátní hash kvůli GDPR). Úryvek může vypadat následně:

to mi připomnělo 'ipeithgabrzh'
včera jsem slyšela o 'wuzeswgedmjg'
jmenuji se 'amgxhkfksmwc'
bez mléka
to mi připomnělo 'rgitoyqmfnzr'
včera jsem slyšela o 'wojjdmuyubcr'
jmenuji se 'dgnwxrkxvtes'
včera jsem slyšela o 'mjtgskmchzsi'
je už hotové?
to mi připomnělo 'uhsbozqwdsll'
jmenuji se 'btiutfvzmknr'
s mlékem

“Proč ukládáte všechny věci, které zákazníci letos řekli?", zeptáš se.

“Protože obsahují informace od boha!", odpoví elfové sborově. “Jedná se o zdrojový kód který odpoví všechny důležité otázky lidstva… ale nejsme schopni ho spustit. Neumíš programovat?"

StarbucksScript funguje na principu registrů – Každý registr má jméno (složené ze symbolů a-zA-Z) a obsahuje celočíselnou hodnotu (výchozí 0). Pro úpravu registrů jsou podporovány následující příkazy:

Vykonávání StarbucksScript kódu probíhá řádek po řádku (prázdné řádky a vše po znaku # jsou ignorovány) – následující příklad pracuje s registry a a b pomocí výše uvedených příkazů:

jmenuji se 'a'
prosím o drink číslo '1'  # {a: 1}
jmenuji se 'b'
prosím o drink číslo '2'  # {a: 1, b: 2}

s mlékem            # {a: 1, b: 3}
s mlékem            # {a: 1, b: 4}

jmenuji se 'a'
bez mléka           # {a: 0, b: 4}
bez mléka           # {a: -1, b: 4}

StarbucksScript rovněž podporuje příkazy pro přesunutí do jiných částí kódu přes labely:

Příklad kódu který implementuje nekonečnou smyčku:

včera jsem slyšela o 'loop'

# poběží donekonečna...

to mi připomnělo 'loop'

K podpoře podmínek podporuje StarbucksScript následující příkaz:

Příklad kódu který implementuje smyčku, která se opakuje 10krát:

jmenuji se 'repeat'
prosím o drink číslo '10'

včera jsem slyšela o 'loop'
jmenuji se 'repeat'
je už hotové?            # porovná repeat s 0
to mi připomnělo 'end'   # <= 0 -- skočí na konec
                         # != 0 -- vykoná smyčku

# opakuje se desetkrát...

jmenuji se 'repeat'
bez mléka                # sníží repeat o 1...
to mi připomnělo 'loop'  # a opakuje
včera jsem slyšela o 'end'

Poslední příkaz který StarbucksScript slouží k vypisování:

Příklad kódu který vypíše Ahoj!:

jmenuji se 'tmp'

prosím o drink číslo '65'
nápoj je připravený!

prosím o drink číslo '104'
nápoj je připravený!

prosím o drink číslo '111'
nápoj je připravený!

prosím o drink číslo '106'
nápoj je připravený!

prosím o drink číslo '33'
nápoj je připravený!

K tomu, abychom elfům pomohli, je třeba napsat interpret StarbucksScriptu.

Jako kontrolu správnosti nás zajímá součet hodnot ve všech registrech – v prvním příkladu výše

jmenuji se 'a'
prosím o drink číslo '1'  # {a: 1}
jmenuji se 'b'
prosím o drink číslo '2'  # {a: 1, b: 2}

s mlékem            # {a: 1, b: 3}
s mlékem            # {a: 1, b: 4}

jmenuji se 'a'
bez mléka           # {a: 0, b: 4}
bez mléka           # {a: -1, b: 4}

je součet registrů po vykonání programu -1 + 4 = 3.

Delší příklad (součet 72)
jmenuji se 'a'
prosím o drink číslo '13'
jmenuji se 'b'
prosím o drink číslo '23'
jmenuji se 'a'
včera jsem slyšela o 'pevqaemvwrft'
je už hotové?
to mi připomnělo 'jflwpkomzosi'
jmenuji se 'anptntmxyuok'
s mlékem
jmenuji se 'iifqkmepnkss'
s mlékem
jmenuji se 'a'
bez mléka
to mi připomnělo 'pevqaemvwrft'
včera jsem slyšela o 'jflwpkomzosi'
jmenuji se 'iifqkmepnkss'
včera jsem slyšela o 'rhscokpgabei'
je už hotové?
to mi připomnělo 'zsrwxplwobev'
jmenuji se 'a'
s mlékem
jmenuji se 'iifqkmepnkss'
bez mléka
to mi připomnělo 'rhscokpgabei'
včera jsem slyšela o 'zsrwxplwobev'
jmenuji se 'b'
včera jsem slyšela o 'sbkfniurfdby'
je už hotové?
to mi připomnělo 'ywqllehpdnno'
jmenuji se 'mlwvnxmwqvii'
s mlékem
jmenuji se 'ohejeomwfdmv'
s mlékem
jmenuji se 'b'
bez mléka
to mi připomnělo 'sbkfniurfdby'
včera jsem slyšela o 'ywqllehpdnno'
jmenuji se 'ohejeomwfdmv'
včera jsem slyšela o 'otpxxhoramee'
je už hotové?
to mi připomnělo 'lqhkfxumvhck'
jmenuji se 'b'
s mlékem
jmenuji se 'ohejeomwfdmv'
bez mléka
to mi připomnělo 'otpxxhoramee'
včera jsem slyšela o 'lqhkfxumvhck'
jmenuji se 'anptntmxyuok'
včera jsem slyšela o 'lxzwxusbwsrs'
je už hotové?
to mi připomnělo 'rqdsldqxjpep'
jmenuji se 'c'
s mlékem
jmenuji se 'anptntmxyuok'
bez mléka
to mi připomnělo 'lxzwxusbwsrs'
včera jsem slyšela o 'rqdsldqxjpep'
jmenuji se 'mlwvnxmwqvii'
včera jsem slyšela o 'bsmkdxgugksm'
je už hotové?
to mi připomnělo 'mnxnsyqzimpz'
jmenuji se 'c'
s mlékem
jmenuji se 'mlwvnxmwqvii'
bez mléka
to mi připomnělo 'bsmkdxgugksm'
včera jsem slyšela o 'mnxnsyqzimpz'
Delší příklad (součet 511)
jmenuji se 'a'
prosím o drink číslo '31'
jmenuji se 'b'
prosím o drink číslo '15'
jmenuji se 'a'
včera jsem slyšela o 'pquriqsakjcw'
je už hotové?
to mi připomnělo 'zubvlqjhepfj'
jmenuji se 'uulirflbxacn'
s mlékem
jmenuji se 'lfdanbhjukon'
s mlékem
jmenuji se 'a'
bez mléka
to mi připomnělo 'pquriqsakjcw'
včera jsem slyšela o 'zubvlqjhepfj'
jmenuji se 'lfdanbhjukon'
včera jsem slyšela o 'jphgxzmdpuyr'
je už hotové?
to mi připomnělo 'qedplpwztabs'
jmenuji se 'a'
s mlékem
jmenuji se 'lfdanbhjukon'
bez mléka
to mi připomnělo 'jphgxzmdpuyr'
včera jsem slyšela o 'qedplpwztabs'
jmenuji se 'uulirflbxacn'
včera jsem slyšela o 'asqtsghtgkas'
je už hotové?
to mi připomnělo 'ffawqnnhueba'
jmenuji se 'b'
včera jsem slyšela o 'wzcojumqmgzt'
je už hotové?
to mi připomnělo 'dntlziohmfmh'
jmenuji se 'ppurhazpnlxp'
s mlékem
jmenuji se 'vdyvlqpaadve'
s mlékem
jmenuji se 'b'
bez mléka
to mi připomnělo 'wzcojumqmgzt'
včera jsem slyšela o 'dntlziohmfmh'
jmenuji se 'vdyvlqpaadve'
včera jsem slyšela o 'wivztxncamjy'
je už hotové?
to mi připomnělo 'nbnzljwchvus'
jmenuji se 'b'
s mlékem
jmenuji se 'vdyvlqpaadve'
bez mléka
to mi připomnělo 'wivztxncamjy'
včera jsem slyšela o 'nbnzljwchvus'
jmenuji se 'ppurhazpnlxp'
včera jsem slyšela o 'icqduxarnwzq'
je už hotové?
to mi připomnělo 'kaliojfxerie'
jmenuji se 'c'
s mlékem
jmenuji se 'ppurhazpnlxp'
bez mléka
to mi připomnělo 'icqduxarnwzq'
včera jsem slyšela o 'kaliojfxerie'
jmenuji se 'uulirflbxacn'
bez mléka
to mi připomnělo 'asqtsghtgkas'
včera jsem slyšela o 'ffawqnnhueba'

Jaký je součet hodnot v registrech? [klikni sem pro vstup]