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.

Re: Po drátě 3: Řešení úlohy č. 7 george.gabriel (3. 12. 2008 - 20:39) Sbalit(2)
I když jsem nepoznal a nevygooglil ani haskel ani fortran77 úspěch se dostavil pomocí přepsání algoritmu do C s použitím bignum knihovny (ten fortran). Pak jsem asi hodinu hledal latinské slovníky a narazil na perl knihovnu.
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.
Re: Po drátě 3: Řešení úlohy č. 7 Bilbo (3. 12. 2008 - 20:51) Sbalit(1)
Ono to v ty latine slo spustit?
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 :)
Re: Po drátě 3: Řešení úlohy č. 7 Michal Kubeček (3. 12. 2008 - 22:42) Sbalit(3)
Mimochodem, tady mne taky vyšplouchl příkaz file: o tom haskellovém zdrojáku mi tvrdil, že je to "ASCII Java program text, with very long lines" :-)

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ý.
Re: Po drátě 3: Řešení úlohy č. 7 mj (3. 12. 2008 - 22:43) Sbalit(1)
> "ASCII Java program text, with very long lines" :-)

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ě).

Re: Po drátě 3: Řešení úlohy č. 7 anicka (3. 12. 2008 - 22:44) Sbalit(1)
> Mimochodem, tady mne taky vyšplouchl příkaz file: o tom haskellovém
> 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 :-)

Re: Po drátě 3: Řešení úlohy č. 7 d.petr (4. 12. 2008 - 9:27) Sbalit(6)
Nebudu zde popisovat jak jsem překládal nepřeložitelný latinský text 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.
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
Re: Po drátě 3: Řešení úlohy č. 7 anicka (4. 12. 2008 - 9:32) Sbalit(5)
> Nebudu zde popisovat jak jsem překládal nepřeložitelný latinský text
> 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."

Re: Po drátě 3: Řešení úlohy č. 7 d.petr (4. 12. 2008 - 9:52) Sbalit(4)
Aááá, tak jsem si to špatně zapamatoval a PC s úlohami mám doma. Omlouvám se za veliké podcenění vkusu orgů. :-))
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).
Re: Po drátě 3: Řešení úlohy č. 7 anicka (4. 12. 2008 - 10:11) Sbalit(3)
> Nedokážu teď posoudit, zda by pro mě byl rozdíl v použití perlygaty a unlambdy.

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

Re: Po drátě 3: Řešení úlohy č. 7 d.petr (4. 12. 2008 - 10:33) Sbalit(2)
Já neznám ani Hashell, ani tu Perligatu (s měkkým "i"? no dobře :-) ). Možná bych podle "nesmyslů" Unlambdy našel tento jazyk dřív, než zkoušet překládat Perligatu se slovníkem a "být z toho magor" a teprve pak dál pátrat po stopách a teprve pak hledat ...
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ě. :-)
Re: Po drátě 3: Řešení úlohy č. 7 Mosquitoe (4. 12. 2008 - 18:25) Sbalit(1)
Tož ještě jste mohli použít takovou úchylárnu jako whitespace nebo brainfuck ... ale což ...
Re: Po drátě 3: Řešení úlohy č. 7 tcech (6. 12. 2008 - 18:51) Sbalit(3)
Na tehle uloze jsem take pekne vytuhnul, prekladat latinu ve 3 rano bylo narocne i na me, nastesti jsem nakonec nasel napovedu, ktera tady nezaznela.
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.
Re: Po drátě 3: Řešení úlohy č. 7 mj (6. 12. 2008 - 18:53) Sbalit(1)
Však to zmiňujeme i v řešení :-)

Re: Po drátě 3: Řešení úlohy č. 7 anicka (6. 12. 2008 - 18:55) Sbalit(1)
> Kdyz clovek porovnal data v programu fortranu a vystup, zjistil, ze se
> 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 :-)

Re: Po drátě 3: Řešení úlohy č. 7 robotron (15. 12. 2008 - 23:58) Sbalit(2)
Unlambdu jsem cekal od spusteni prvniho programu. Docela jsem se na ni tesil, treba by stacilo vygrepovat pryc tech par funkcnich znaku a premyslet, jak preskupit zbytek, aby vyslo smysluplne ceske slovo. Zato brainfuck by podle me moc nepobavil. Jsem zvedav, co exotictejsiho byste jeste nasli... Doufam, ze by nikdo nehledal ve strojovych kodech jedno- az ctyrinstrukcnich CPU. Ale tam nastesti neni definovan stdout, tedy ABI. (ABIch se teda nedivil ;-))

P.S.: Aspon ze na FORTH castecne doslo v jeho zmekcile, lec prekrasne PostScriptove inkarnaci.
Re: Po drátě 3: Řešení úlohy č. 7 anicka (16. 12. 2008 - 0:33) Sbalit(1)
> P.S.: Aspon ze na FORTH castecne doslo v jeho zmekcile, lec prekrasne
> 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 :-)