Zadanie

Zwarte doos mala v KSP obrovský úspech. Každý jeden vedúci si ju chcel vyskúšať a prejsť. Lepší suvenír z Holandska Syseľ doniesť ani nemohol.

Vedúci sú však šikovní a po pár dňoch mal už každý všetkých 10 problémov vyriešených. A doos zapadla prachom kdesi hlboko v skrini. Nebola tam však sama. Okrem nej tam totiž ležali rôzne spoločenské hry, klávesnice, nefunkčné LAN káble a kopa knižiek. Väčšinou matematických, ale našli by ste tam aj zopár slovenských klasikov.

Keď sme minulý týždeň upratovali, všimli sme si, že doos dlhé chvíle efektívne využila, načerpala inšpiráciu a vymyslela si nových 10 úloh. Bola by škoda sa s vami o ne nepodeliť.

Úloha

Dostanete prístup k simulátoru čiernej skrinky. Vždy, keď do nej vložíte nejaké číslo, skrinka niečo vypíše (číslo, slovo…) podľa jednoduchého pravidla.

Vašou úlohou bude toto pravidlo odhaliť a nájsť vstupné číslo také, aby skrinka vypísala požadovanú vec.

Hra má 10 úrovní, za každú môžete získať bod. Náročnosť by mala stúpať spolu s úrovňami, môžete ich však riešiť v ľubovoľnom poradí.

Odovzdávanie a bodovanie

Za každú vyriešnú úroveň dostanete jeden bod. K tejto úlohe netreba odovzdávať žiadny popis ani program. Simulátor nájdete na stránke http://ksp.sk/specialne/ksp/32/2/1. Pre prístup na stránku musíte byť prihlásení a body sa vám budú pripočítavať automaticky.

Level 1

Na rozcvičku si Doos pripravila opäť niečo jednoduché. Vaše \(n\) zmenila na \(2n+3\). Na vyriešenie stačilo zadať \(\frac{47-3}{2} = 22\).

Level 2

Ak ste išli postupne od nuly, nebolo ťažké si všimnúť, že Doos vždy pripočíta vstup k predchádzajúcemu výsledku. Vracala teda súčet prvých \(n\) čísel. \(11628\) je súčtom prvých \(152\) čísel, čo ste mohli zistiť výpočtom alebo binárnym vyhľadávaním. (Ak neviete, čo je binárne vyhľadávanie, pozrite si vzorové riešenie k levelu 4 z predchádzajúceho kola.)

Level 3

Začiatok mohol byť trochu mätúci, ale väčšie čísla odhalili, že sa jedná o ciferný súčin vstupu. Chceme získať číslo \(529200\), ktoré má nasledovný rozklad na prvočísla – \(2^{4} \cdot 3^{3} \cdot 5^{2} \cdot 7^{2}\). To znamená, že číslo \(22223335577\) by malo dať správne riešenie. Je však pridlhé a Doos ho neakceptuje. Potrebujeme teda zoskupiť niektoré cifry dokopy. Zafungovalo napríklad číslo \(8695577\).

Level 4

Ak ste chápali výstup ako súradnice nejakého bodu, nebolo ťažké si všimnúť, že sa pomocou nich postupne kreslí štvorcová špirála. Štvorcová špirála rozmerov \(5\times 5\) vyzerá takto (číslo \(x\) predstavuje \(x\)-tý bod špirály):

16 15 14 13 12 29
17  4  3  2 11 28
18  5  0  1 10 27
19  6  7  8  9 26
20 21 22 23 24 25

Bod \((37, 73)\) bude na obvode nejakého štvorca so stranou dlhou zhruba \(73 \cdot 2 = 146\), teda pred ním sa vyskytlo približne \(146^2 = 21316\) iných bodov. Týmto postupom nedostaneme presný výsledok, ale súradnicu \((-73, 73)\). Takže sa musíme vrátiť o \(110\) bodov späť. \(21206\) je teda správny výsledok.

Samozrejme, bolo možné zrátať správny výsledok aj presne (a nezaškodí vám si to vyskúšať), ale uvedený postup je rýchlejší.

Level 5

Ak ste skúšali náhodné čísla, dostali ste náhodné slová. Ak ste však šli postupne, slová začali tvoriť vety. Tá prvá znela Niet domu kde sa nedymí v komíne. A múdry Google vám hneď poradí, že je to nadpis prvej kapitoly diela Dom v Stráni od Martina Kukučína. Elektronická verzia knihy je voľne prístupná na internete, takže vám už len stačí zistiť, koľké v poradí je v nej slovo drúže.

Toto slovo sa v texte nachádzalo práve raz, stačilo si ho nechať vyhľadať. Potom si stačí skopírovať celý text pred ním a použiť nejaký nástroj na spočítanie slov (online alebo textový editor). Dostaneme počet slov pred slovom drúže a teda aj jeho poradie.

Keďže rôzne počítadlá slov majú rôzne názory na to, či sa napríklad slová oddelené pomlčkou počítajú za jedno alebo za dve, nemuseli ste sa na prvý pokus trafiť úplne presne. Z kontextu však viete zistiť, kde v texte sa nachádzate a o koľko ste sa pomýlili. Takto sa určite nakoniec dopracujete k správnej pozícii \(93226\).

Nakoniec by som ešte rád spomenul, že poznámky pod čiarou sa do textu, samozrejme, nepočítali.

Level 6

Zo začiatku ste si iste všimli, že odpovede postupne stúpali a blížili sa k vysnívanej \(1\). Ak ste ju však preskočili, začali zákerne klesať.

Nie príliš komplikované riešenie bolo postupne odhaľovať dĺžku a cifry správneho výsledku. Stačilo sa vždy opýtať na dve po sebe idúce čísla a podľa toho, či postupnosť stúpa alebo klesá, ste hneď zistili, či ste príliš vpredu alebo príliš vzadu.

Ak by ste mali záujem o rýchlejší spôsob, opäť pomôže binárne vyhľadávanie (kde sa tiež pýtate na 2 po sebe idúce čísla).

Existuje však ešte efektívnejší spôsob ako v postupnosti, ktorá najskôr stúpa a potom klesá, nájsť maximum. Hovorí sa mu ternárne vyhľadávanie. Podobne ako pri binárnom, aj tu si udržujete interval, v ktorom by mohlo byť maximum. V každom kroku ho však rozdelíte na 3 časti, porovnáte hraničné prvky medzi nimi, a vylúčite tú z krajných častí, ktorá je pri nižšom hraničnom prvku. Ak sú oba prvky rovnaké, vylúčite obe krajné časti. Takto pokračujete, až kým nemáte dostatočne malý interval (napríklad dĺžky 5), v ktorom maximum nájdete vyskúšaním všetkých možností. Skúste si rozmyslieť, prečo to funguje.

Správny výsledok bol \(7182818\). Nie je vám povedomý?

Level 7

Tento level bol jeden z najťažších, lebo bolo ťažké zistiť, čo vlastne Doos vracia. Všimnúť ste si mohli, že rovnaké cifry prispievajú do celkového súčtu rovnakou hodnotou. A tou je počet paličiek, ktoré treba rozsvieť na klasickom 7 segmentovom digitálnom displeji, aby sme cifru zobrazili.

Na získanie čísla \(42\), teda môžeme použiť napríklad \(888888\).

Level 8

Prvá vec, ktorú ste si mohli všimnúť, bola, že pre prvočísla vracia Doos vždy číslo \(2\). To celkom naznačuje spojitosť s deliteľmi daného čísla – Doos totiž vracia počet deliteľov vstupu.

Ale ktoré číslo má \(728\) deliteľov? \(728 = 2^3 \cdot 7 \cdot 13\). Deliteľa nejakého čísla vytvoríte tak, že z jeho prvočíselného rozkladu niečo poškrtáte. Ak bude v rozklade \(2^{12}\), môžete poškrtať od \(0\) po \(12\) dvojok, čo je 13 možností. Ak pridáme \(3^6\) vieme nezávisle na tom škrtnúť trojky až 7 možnosťami. Nakoniec do rozkladu na prvočísla pridáme aj \(5 \cdot 7 \cdot 11\) z ktorých môžeme každé buď škrtnúť, alebo neškrtnúť, čo je \(8\) možností.

Stačilo teda zadať hodnotu \(2^{12} \cdot 3^6 \cdot 5 \cdot 7 \cdot 11 = 1149603840\).

Level 9

Nepárne čísla zostali sami sebou. \(2\), \(6\), \(10\) sa zdvojnásobili, \(4\) a \(12\) zoštvornásobili a \(8\) dokonca zosemnásobila. Každé číslo sa teda vynásobilo najväčšou mocninou dvojky, ktorá ho delila.

Keďže \(1263872 = 4937 \cdot 2^8 = 4937 \cdot 2^4 \cdot 2^4\), správny vstup bude \(4937 \cdot 2^4 = 78992\). Takto bude totiž \(2^4\) najväčšia mocnina dvojky, ktorá ho delí, a teda sa ňou ešte prenásobí.

Level 10

Na začiatku ste zrejme mali zopár krátkych pokusov, 7 SPRÁVNE, 0 NA ZLEJ POZÍCII. To vám hádam našepkalo, že správny počet cifier je \(7\).

Zostáva už iba uhádnuť, ktoré cifry to sú. Zakaždým ste sa dozvedeli, koľko cifier ste trafili a koľko ste uviedli správne, avšak na nesprávnej pozícii. Presne ako v staršej stolovej hre Logik.

Bežne sa hra rieši tak, že najskôr spravíte zopár náhodných tipov a potom sa z nich snažíte čo najviac dedukovať. Ak sa vám do niečoho takého nechcelo, mohli ste najskôr zistiť, koľko ktorých cifier sa vo výsledku nachádza (skúšaním siedmych rovankých cifier) a potom zistením, na ktorú pozíciu, ktorá cifra patrí (umiestnením tejto cifry medzi šesť deviatok, ktoré sa vo výsledku nenachádzali). V oboch prípadoch by ste sa však mali dopracovať k číslu \(2637033\).

Diskusia

Tu môžte voľne diskutovať o riešení, deliť sa o svoje kusy kódu a podobne.

Pre pridávanie komentárov sa musíš prihlásiť.