Po drátě 3: Řešení úlohy č. 7
Jak název přílohy (babylon.c) napovídá, v této úloze půjde o jazyky.
První jazyk je Céčko. Pravda, trochu zvláštní Céčko (main obvykle nebývá rekurzivní), ale zkompilovat jde a dokonce i spustit. Když tak učiníte, ejhle, vypadne další program. Úloha totiž připomíná matrjošku - stačí programy jenom kompilovat a spouštět, až ten poslední vydá heslo. Jediný problém je přijít na to, čím je vlastně kompilovat.
Druhý jazyk je už totiž zajímavější: Vypadá to na něco funkcionálního, komentáře se zřejmě píší za dvě pomlčky, pseudonápověda skrytá v morseovce v tom komentáři povídá nějaké nesmysly, ale radí také značně podezřelé slovo "monáda", některá klíčová slova vypadají poměrně googlitelně. Pokud nám to nebylo jasné ihned, trocha snahy by nás měla dovést k tomu, že je to Haskell. Jeho výstup nám vydá například ghc nebo hugs.
Třetí zdroják si také na nic nehraje, přesto jej na první pohled pravděpodobně poznají zejména ti, kdo ještě pamatují doby, kdy po zemi chodili plechoví dinosauři. Komu nestačí klíčová slova a formátování evidentně pocházející z časů děrných štítků, ten by se měl dostat k cíli prostým vygooglením komentáře: Ano, je to dědeček Fortran 77. Můžeme si na něj pustit dle distribuce třeba g77 nebo gfortran.
Poslední prográmek je úložkou nejen pro latiníky, ale také pro perlové hackery. Modulek Lingua::Romana::Perligata z klávesnice Damiana Conwaye využívá toho, že v perlu si každý může upravit svůj parser k obrazu svému, a dává nám tak první programovací jazyk na světě, který má flexi a díky tomu téměř naprosto volný slovosled: Perligatu. A jak na to přijít, pokud ji neznáte? Inu, v první řadě si musíte uvědomit, že je to skutečně program, nikoli latinská poezie - na to by měla navést indentace, v bloku začínajícím "per quisque" by i nepříliš jazykově nadaný hacker mohl tušit for cyklus. Potom už stačí googlit kandidáty na klíčová slova, fráze jako "programming in Latin" rovněž vedou k cíli okamžitě. Můžete si také všimnout slova Perligata, která obsahuje (ale nevypisuje - přesněji, vypisuje jen ve verzi zasílané jako nápověda) předcházející fortranovský program. Perlový skriptík můžeme spustit například příkazem "perl -MLingua::Romana::Perligata" a následně se nám dostane kýženého hesla.
Komentář
Nejednoho řešitele samozřejmě může zajímat, co ty prográmky vlastně dělají.Céčkový program dekóduje velice jednoduše zkomprimovaný text. Obrovské pole curses[] rozebere na nibbly (4-bitové kousky), hodnoty 0-14 kódují nejčetnějších 15 písmen (viz pole broomsticks[]), nibble 15 značí, že se jedná o méně četné písmenko, jehož kód je uložen v následujících dvou nibblech.
Haskellový program je poměrně přímočarý - obsahuje jedno obrovské magické číslo skrývající text dalšího programu v 96kové soustavě, funkci impera, která jej převádí na ASCII kódy, a funkci pigLatin vytvářející výstupní string.
Ani fortranovský program nedělá nic složitého. Nachází se v něm pole A obsahující všechna slova vyskytující se v následujícím perlovém programu, pole X se seznamem pozic v poli A a cyklus, který slova z A podle X vypisuje. Můžete si všimnout i poněkud podezřelých čísel -1, která používáme k tomu, abychom z výstupu odstranili nadbytečné mezery.
Prográmek v Perligatě je zdaleka nejjednodušší. Doslovně přeložený z latiny do normální perlovštiny by vypadal nějak takto:
print STDOUT qq(Heslo je) . " "; my $Repositori = qq(coc); my $Temporali = qq(ci); $Repositori = $Repositori . $Temporali; my @Ageri = (qq(nel), qq(la)); unshift @Ageri, $Repositori; foreach $Locul (@Ageri) { print STDOUT $Locul; } print STDOUT "\n";V této ukázce můžete ocenit nejpokrokovější vlastnost Perligaty, která ji dělá tím pravým jazykem pro XXI. století, totiž onu výše zmiňovanou flexi: Skalární proměnná má koncovku -o, pokud do ní přiřazujeme, a -um, pokud z ní bereme data. Své vlastní koncovky (tentokrát ale přirozeně množného čísla) mají i pole.
Podotkněme ještě, že psát a ladit v Perligatě složitější programy vyžaduje jisté zkušenosti a notnou dávku trpělivosti. Ve zdrojácích lze používat pouze římská čísla (zobecněná) a všechny chybové hlášky jsou v latině. Například touto hláškou vás Perligata oblaží, pokud do programu omylem napíšete středník:
Aliquod barbarum inveni: ';' ad versum XIV
Mezi nejpodivuhodnější špatná hesla, která chodila k této úloze, patří například lorem ipsum, kostel, curses nebo hello world.
Úlohu vymyslela Anička, dlouhý zimní večer si její výrobou krátila společně s Martinem.
Tahle úloha se mi líbila nejvíc. I když jsem jí řešil "hrubou silou" - neznámý jazyk ale zjevný algoritmus lze napsat ve známém jazyce.
Ještě jednou díky.
Pochopil jsem ze sic/cis jsou zavorky a pak jsem se ridil instrukcema v latine ... u toho for cyklu jsem si jen tipl ze to vypise po posmenech a heslo se poskladalo z tech retezcu pred nim :)
Fortran šel poznat snadno; i kdybych ho nikdy předtím neviděl, kdo někdy četl historku o nejdražší programátorské chybě, řádek "DO 23 I=1,120" mu musel být povědomý.
Jo jo, také jsme se divili, v čem programujeme :-)
> Fortran šel poznat snadno; i kdybych ho nikdy předtím neviděl, kdo
> někdy četl historku o nejdražší programátorské chybě, řádek "DO 23
> I=1,120" mu musel být povědomý.
Přesně tak. Navíc je to jazyk známý tím, že vypadá jako stvořený
k tesání do kamene (kupodivu víc než Perligata, která se latině
navzdory píše spíš malými písmenky, navíc case-sensitivně).
> zdrojáku mi tvrdil, že je to "ASCII Java program text, with very long
> lines" :-)
Jojo, taky jsem si to zkusila, a taky jsem z toho mela radost :-)
Ale coz, ascii a very long lines bylo spravne, to je skoro 70 procent
uspechu :-)
A jaké bylo mé překvapení, když jsem po ukončení soutěže zjistil, že Karla použili v úloze 10 (k ní jsem se už nedostal). ??!! :-D
> apod. Jen, poté, co mi přišel po vyřešení komentář, že exotičtější
> jazyky orgy nenapadly, jsem měl nutkání jim pro příště doporučit ještě
> Karla.
Ale kdež, naopak :-)
Robůtek říkal tohle:
A to jsme zdaleka nepouzili ty nejobskurnejsi jazyky, ktere zname!
Původně jsem chtěla dát do posledního kroku unlambdu, ona by se
podstatně líp komprimovala :-) Ale pro Perligatu mám prostě slabost...
(Kolega tester: "já jsem to dal jenom proto, že s Aničkou chodém na
oběd. Zkoušel jsem to pouštět už na ten Haskell."
Nedokážu teď posoudit, zda by pro mě byl rozdíl v použití perlygaty a unlambdy. Možná byl, protože perl mám (ale až do soboty bez toho latinského modulu).
Inu, to nevím :-)
Když ji člověk nezná, asi není úplně snadné přijít na to, co to je. A
zatímco člověk znalý latiny si Perligatu mohlinterpretovat sám,
rozluštit unlambdu by byl myslím docela quest.
http://www.madore.org/~david/programs/unlambda/#what_looks
A jak jsem právě zjistil, můj oblíbený Debian Unlambdu obsahuje, takže možná stejná složitost, jako s Hashellem.
Ale nechci navádět, jinak určitě příště skončím právě na Unlambdě. :-)
Kdyz clovek porovnal data v programu fortranu a vystup, zjistil, ze se nepouzily ctyri retezce - 'use', 'Lingua', 'Romana', 'Perligata;'
To bylo nakonec to, co me pomohlo prenest se pres tuhle bestialitku.
> nepouzily ctyri retezce - 'use', 'Lingua', 'Romana', 'Perligata;'
Ještě '::' :-)
Původně jsem úlohu napsala tak, jak pak byla zasílána jako nápověda.
Ostatní orgové mě pak přesvědčili, že zadat to bez prvního řádku je
lepší, že to není zas tak těžké. Asi měli pravdu, ale lenost předělávat
ten Fortran (jako jediný zdroják nebyl generovaný) pak vynesla řešitelům
aspoň tuhle malou nápovědu. Jsem ráda, že pomohla :-)
P.S.: Aspon ze na FORTH castecne doslo v jeho zmekcile, lec prekrasne PostScriptove inkarnaci.
> PostScriptove inkarnaci.
Hmm, prave jsi me privedl na siiileny napad. Sice si nejsem jista,
jestli ho budu umet zrealizovat (a nebudu spechat, minule i tentokrat
byly zasobniky), ale jestli ano, bude to legrace :-)
A pokud jde o jeste divnejsi jazyky nez unlambda, mame v zasobe
minimalne jeden, ktery je jeste divnejsi nez vsechno, co jsme zatim
pouzili :-) Mozna priste :-)