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:
jmenuji se ’<registr>’– nastavení aktuálního registruprosím o drink číslo ’<hodnota>’– nastavení hodnoty aktuálního registrus mlékem– zvýšení hodnoty aktuálního registru o 1bez mléka– snížení hodnoty aktuálního registru o 1
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:
včera jsem slyšela o ’<label>’– definice labeluto mi připomnělo ’<label>’– skok na label
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:
je už hotové?– pokud je aktuální registr menší nebo roven0, vykoná další příkaz; jinak další příkaz přeskočí a vykoná až ten po něm
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í:
nápoj je připravený!– vypsání hodonty aktuálního registru jako ASCII znak
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]