Skip to content

Programátor Mystery Cache

Hidden : 1/27/2021
Difficulty:
5 out of 5
Terrain:
1.5 out of 5

Size: Size:   small (small)

Join now to view geocache location details. It's free!

Watch

How Geocaching Works

Please note Use of geocaching.com services is subject to the terms and conditions in our disclaimer.

Geocache Description:


Programování je v informatice proces od návrhu řešení problému pomocí výpočetní techniky ke spustitelnému počítačovému programu. Zahrnuje činnosti jako je analýza problému, jeho pochopení, nalezení algoritmu a zápis zdrojového kódu v cílovém programovacím jazyce. 

Programování se od sebe liší v mnoha ohledech. Zaprvé je možno rozlišovat programování hardware a software. Dále je programování liší podle použitého programovacího jazyku (C, C++, C#, Java atd.), kde poslední dva napsané patří pod tzv. objektově orientované jazyky. Popisovat tu teorii tu ale nemá smysl, takže radši vysvětlím pár základních věcí, které budete potřebovat pro nalezení této kešky.  

První důležitá věc je deklarace proměnné. Vhodné je nejprve zmínit, co je to v programování proměnná. Proměnná (variable) je pojmenovaná část paměti, která uchovává nějakou námi používanou hodnotu. Deklarace je poté proces, při kterém vzniká nová proměnná určitého datového typu. V jazyce C, který budu pro ukázky používat, vypadá deklarace takto "int a;" kde a je název naší proměnné a int její typ. Slovo int říká, že se jedná o celočíselný typ (např 0, 5 ...). Další důležité datové typy jsou double (desetinné číslo), string (textový řetězec), char (znak) a boolean (pravda/nepravda). Středník na konci značí konec řádku, což je v jazyce C nutnost. 

Další důležitá věc je inicializace proměnné. To je přiřazení nějaké hodnoty naší proměnné. V praxi to vypadá takto "a = 4;". Pro zjednodušení lze oba předchozí kroky udělat najednou a napsat "int a = 4;" a bude to znamenat, že počítač má někde v pamětí uloženou hodnotu 4 a my ji můžeme najít pod jejím jménem a.

Pokud už umíme ukládat proměnné, je vhodné naučit se s nimi pracovat. Pokud budete chtít v Céčku pracovat s proměnnými, můžete jednoduše provádět součet, rozdíl atd. pomocí +, - atd. Např.
int a = 4;
int b = 3;
int c = a + b;

Pokud bychom si potom nechali hodnotu c vypsat, dostali bychom číslo 7.

Kromě čísel (a samozřejmě znaků) se v programování vyskytuji již zmíněný boolean, neboli pravda/nepravda (true/false). Pravdu (nebo nepravdu) můžeme samozřejmě získat deklarací a inicializací "boolean ano = true;", nebo , nebo pomocí relačních(větší než, menší než, rovno...) a logických operací(konjunkce, disjunkce). Do proměnné vetsi "boolean vetsi = 5>3;" se v takovém případě uloží pravda. Poznámka: Standardní jazyk C nemá boolean. Místo toho se používá int, kde 0 značí false a 1 true. Výše uvedené příklady se mohou vyskytnout například v jazyce JAVA.

Pokud již umíme pracovat s čísly, je vhodné si vysvětlit dva nejdůležitější procesy v programování. Opakování a větvení. 

Nejprve je vhodné vysvětlit větvení programu, které potom využijeme u opakování. Podmínka, (větvení), se požívá tehdy, když chceme, aby se určitá věc stala pouze tehdy, když platí nějaká předchozí věc. Podmínka má v jazyce C následující syntaxi:
int a = 5;
int b = 7;
if(a > b){
    printf("a je větší než b");
}
else{
    printf("a není větší než b");
}

Vysvětlení předchozí ukázky je jednoduché. Nejprve jsou deklarovány a inicializovány dvě proměnné a, b. Potom už následuje podmínka. Nejdůležitější je slovo if, což je tzv. klíčové slovo pro podmínku. V kulaté závorce za slovem if je "výraz", který se má vyhodnotit. Pokud daný výraz platí, nebo se v závorce nachází proměnná s hodnotou true, provede se kód, který leží mezi složenými závorkami. V opačném případě se provede kód ve složených závorkách za klíčovým slovem else. Slovo else se nemusí v podmínce vůbec vyskytnout, nebo se za slovem if může nalézat slovo else if (klidně několikrát), ale to zde není potřeba vysvětlovat. Jenom pro informaci: příkaz printf() slouží k vypsání do konzole. Jednoduše řečeno to, co se nalézá v závorkách za přikazem printf si po spuštění kódu můžete přečíst.

Opakování (cyklus) se používá tehdy, když je nutné provést část kódu vícekrát. Existují tři typy cyklů (FOR, WHILE, DO WHILE), ale pro jednoduchost stačí vysvětlit cyklus for. V jazyce C vypadá syntaxe následovně:
for(int i = 0; i<10; i++){
    printf("%d", i);
}

Vysvětlení je opět jednoduché. Obsah kulatých závorek za slovem for si můžeme rozdělit na tři části. Nejdříve deklarace a inicializace proměnné i "int i = 0;", potom "podmínka" "i<10;",  a nakonec "i++". Deklarace a inicializace nám říká, jakou hodnotu bude mít číslo i na začátku prvního kola cyklu. Poslední část říká, co se s proměnnou stane na konci našeho kola. V našem případě to znamená, že se hodnota i zvětší o jedničku. Výraz "i++;" se dá napsat jako "i = i + 1;". Prostřední část nám říká, jak dlouho se bude cyklus opakovat. Cyklus se opakuje vždycky tak dlouho, dokud "podmínka" vrací hodnotu true. V našem případě tedy proběhne cyklus desetkrát, protože při jedenáctém opakování by měla proměnná i hodnotu 10 a 10 není menší než 10. Obsah složených závorek je kód, který se provede při každém opakování cyklu. V našem případě bychom tedy mohli vidět čísla 0 1 2 3 4 5 6 7 8 9. 

Poslední informace se bude týkat funkci (v objektově orientovaném programování jsou místo funkcí tzv. metody, ale pro naše účely to není potřeba rozlišovat). Na funkci se lze dívat jako na část kódu, kterou chceme použít vícekrát v různých částech kódu. Abychom ji nemuseli psát znovu a znovu, lze vytvořit funkci. V první je potřeba takovou funkci deklarovat. To se dělá následovně.
int soucet(int a, int b){
int c = a + b;
return (c);
}

Jako první se v takové případě uvedený datový typ. Tento datový typ (v našem případě int) nám říká, co nám tato funkce vrátí. Pokud od funkce neočekáváme nic zpátky, lze použít void. Dále je název funkce, což je v našem případě soucet. Poté závorky, ve kterých jsou proměnné, které této funkci budeme dávat, když ji budeme chtít někde použít. Těchto proměnných může být nula, nebo třeba 50, ale je potřeba vždy dodržet jejich počet a datový typ. V hranatých závorkách je poté to, co funkce bude dělat. Ukončena je klíčovým slovem return, které nám dává hodnotu, kterou bude tato funkce vracet. Pokud máme funkci takto deklarovat, je možné si ji libovolně zavolat takto.
int vysledek = soucet(3,4);
int dalsiVysledek = (4,8);

V předchozí ukázce jsem zavolal funkci soucet dvakrát. Poprvé s čísly 3,4 a podruhé s čísly 4,8. Pokud bych si pak zobrazil hodnoty proměnných vysledek a dalsiVysledek, dostal bych čísla 7 a 12.

K samotné keši:

Tuto keš jsem chtěl udělat způsobem, že si sami budete muset něco zkusit naprogramovat. Tak byste našli heslo potřebné ke vstupu do mobilní aplikace, kterou jsem vytvořil a kterou byste si museli stáhnout. Bohužel jsem zjistil, že toto pravidla geocachingu neumožňují. Protože je mi líto již vytvořenou aplikaci "vyhodit", rozhodl jsem se, že toto bude něco jako alternativní způsob řešení. Nejdříve tedy vysvětlím jak získat souřadnice v souladu s GC pravidly. 

Nalezení "hesla":

Pro nalezení  hesla si musíte stáhnout obrázek, který najdete níže v listingu pod názvem toDownload (formát png). Následně musíte z tohoto obrázku zjistit několik informací.

První je potřeba zjistit velikost obrázku. Poté výška obrázku (počet pixelů) bude číslo a šířka obrázku (počet pixelů) číslo B.

Dále musíte převést barevný obrázek na černobílý (šedotónový) a zjistit několik dalších hodnot. Číslo C je počet pixelů, jejichž hodnota je v černobílém obrázku zastoupena v nejmenším počtu a číslo D je hodnota pixelu (0-255), který je v černobílém obrázku zastoupen v největším počtu.

Poslední dvě čísla vypočítáme z původního barevného obrázku. Číslo E je suma hodnot všech pixelů (všech tří kanálů), jejichž pozice je <=50 (tj. čtverec 50x50, např. pixel [1,1], [1,50], [50,1], [50,50]). Poslední je číslo F, které odpovídá sumě všech pixelů (všech tří kanálů), jejichž pozice je <= 100(tj. čtverec 100x100) a jejichž hodnota je větší než 200.

Heslo potom vypočítáme podle následujícího vzorce, kde % značí modulo.  \(HESLO = A\%B + floor(\sqrt{C}) + D + E - F\)
Jak k tomuto heslu dojdete mě vlastně celkem nezajímá a pokud znáte rychlejší metodu, tak ji určitě využijte, já doporučuji použít Octave, který je možno stáhnout na tomto odkazu. Pokud se rozhodnete pro tuto variantu, tak na tomto odkazu je možné stáhnout šablonu, která vám s řešením aspoň trochu pomůže. Pokud se rozhodnete použít libovolný program pro editaci obrázku (ať už gimp, photoshop ...), nemohu zaručit správnost výsledku. Účelem této keše je si zkusit něco naprogramovat. Při použití libovolného programu nemáte kontrolu nad postupem výpočtu a proto se mohou tyto hodnoty lišit. Prosím, berte obrázek jenom jako zdroj dat, nikoliv jako obrázek.

Dostal jsem připomínku ohledně možnosti dvojího způsobu stažení. Správný obrázek dostanete, pokud kliknete právým dole na obrázek toDownload a dáte uložit odkaz jako... Mělo by vám to nabídnout ke stažení obrázek se jménem fa4b429e-a88f-4934-9a4a-1db7529cfdad_l. Dávejte pozor na konec názvu, kde by se mělo nacházet _l. Zvolte uložit jako typ PNG Image. Obrázek by měl mít po stažení velikost 135 kB. Pokud bude mít někod nějaký problém, určitě se může ozvat.
Také jsem dostal připomínku ohledně vícero možností převedení obrázku na černobílou verzi. Pokud budete používat Octave a jeho šablonu, neměl by vzniknout žádný problém. Pokud někdo používá libovolný jiný způsob, tak je potřeba vědět to, že Octave a jeho funkce, kterou je idální použít využívá vzoreček I = round(0.298936*R + 0.587043*G + 0.114021*B). Tento způsob lépe reflektuje to, jak naše oko a mozek vnímá barvy, než pouhý průměr všech tří hodnot. Důležité je to, že je potřeba při převodu obrázku dodržet tento způsob.

Po nalezení hesla

Pokud máte nalezené tzv. heslo, je potřeba zjistit ještě nějaké informace. Nejdříve je potřeba vzít obrázek a "orotovat" ho o 30°. V Octave na to opět existuje funkce, k níž se dostanete, pokud si stáhnete (již by měl být stažený, pokud budete stahovat z výše uvedeného odkazu) a nainstalujete balíček "image".  Více informací najdete zde. Prozradím, že to lze vyřešit i bez této funkce.  Číslo potom bude součet řádků a sloupců nově vzniklého obrázku. Pokud budete zjišťovat tyto údaje někde jinde než v Octave, je možné, že dojde k trochu jinému zaokrouhlení. Proto pokud se ověřovači vaše souřadnice nelíbí, zkuste přičíst, nebo odečíst jedničku. Pro ukázku zde ukážu obrázek, který vznikl otočením o 45°. 

Dále bude potřeba zjistit číslo H. K tomu bude potřeba nejdříve vytvořit negativ původního  barevného obrázku (jasová transformace). Poté stačí zjistit sumu všech pixelů, jejichž pozice je <= 20 (tj. čtverec 20x20).

Souřadnice poté budou:
N 49°56.\(HESLO - G - 10842 - ?\)
 
E 17°55.\(HESLO - H - 66597\)
 

Pravděpodobně chete vědět, co je otazník. No k tomu je potřeba vyřešit první část alternatívního způsobu. Není třeba nic stahovat, pouze zjistit, co by bylo nutné udělat v případě, že byste se touto alternativní cesto vydali. 

Alternativní cesta:

Jak jsem výše uvedl, bohužel pravidla GC neumožňují udělat takovou keš. Ovšem je možné tuto variantu zde zanechat pro zájemce. Pro nalezení keše tímto způsobem by bylo nutno si stáhnout moji aplikaci na chytrý telefon s operačním systémem android (android 5 a výše by měl fungovat bez problému, ale čím vyšší verze androidu, tím lépe). Je nutné, aby telefon měl GPS a bylo by vhodné zapnout si i data. V aplikaci je potom několik úkolů, které se musí splnit. Aby to nebylo tak jednoduché, tak je nejdříve potřeba zadat heslo, které již  ale máte vypočítané. To není vše. Dále jsou v aplikaci připravené dvě úlohy, o kterých vám ale nic neřeknu. Poskytnu vám ukázku kódu a vy sami musíte pochopit, co se po vás chce. Nakonec je v aplikaci ještě pár úkolů, ale ty jsou vysvětleny.

Po nalezení hesla (alternativní způsob):

Nejprve je nutno stáhnout aplikaci z tohoto odkazu a nainstalovat si ji do svého mobilu. Pokud by měl někdo obavy o bezpečnost aplikace, tak mohu ujistit, že nejsem profesionál a neumím programovat natolik, abych vytvořil aplikaci, která by uměla získat libovolné informace. Jediné riziko, které hrozí je to, že vám nebude aplikace fungovat. Pokud již máte staženou aplikaci a dostali jste se na počáteční heslo, přichází na řadu druhý úkol. Uvidíte něco takového, jako je vidět na tomto obrázku.

Na obrázku vytvoření tlačítek uvidíte první část informací, které potřebujete k následujícímu úkolu. 

Na druhém obrázku je vidět, jak se taková tlačítka vytvoří. Zjistíte zde první část důležitých informací.

Z předchozího obrázku je jasné, co se stane po zmáčknutí daného tlačítka. Na dalším obrázku jsou další detaily.

Poslední důležité informace jsou na tomto obrázku. Z těchto obrázků už lze získat všechny informace, které potřebujete. Jenom pro informaci je zde ještě k vidění i funkce resetOrder, ale k vyřešení není nutné ji chápat. Pro první úkol je tu již dostatek informací. Nyní je potřeba představit druhý problém. Po vyřešení druhého úkolu uvidíte něco takového.

 

 

 

Prozradím, že tlačítka zapnout GPS a zapnout data slouží pouze pro nastavení a pro pochopení nejsou vůbec potřeba. Na následujícím obrázku je opět vidět, jak se tlačítko vytvořil. Tentokrát už víte co máte hledat, takže zde není nic napsáno.

Následující dva obrázky potom poskytnou všechny důležité informace.

Po splnění těchto dvou úkolu na vás čekají ještě další dva, ale ty už jsou vysvětlený přímo v aplikaci a nemají v sobě žádné záludnosti. Doufám, že jste se při luštění této mysterky dozvěděli něco nového. 

Additional Hints (Decrypt)

I ncyvxnpv. Cbxhq wfgr fr arilqnyv gbhgb prfgbh, gnx žáqabh aácbirqh arqbfgnargr, nyr an zífgr mwvfgígr, žr wv iynfgar zágr.

Decryption Key

A|B|C|D|E|F|G|H|I|J|K|L|M
-------------------------
N|O|P|Q|R|S|T|U|V|W|X|Y|Z

(letter above equals below, and vice versa)