Mp3tag je velice užitečný nástroj na správu názvů a ID3 tagů hudebních souborů. Informace o souboru umí zformátovat do názvu souboru. Napsal jsem si krátké makro, které odstraní českou a slovenskou diakritiku:
$num(%track%,2) - $replace($ansi(%title%),á,a,ä,a,č,c,ď,d,é,e,ě,e,í,i,ĺ,l,ľ,l,ň,n,ó,o,ô,o,ŕ,r,š,s,ť,t,ú,u,ý,y,ž,z)
úterý 14. září 2010
středa 11. srpna 2010
Project Euler - Problem #060
Najít pětici určitých prvočísel je oříšek problému č. 60. Sebevědomě jsem si stanovil, že žádné z prvočísel nebude větší než 10000 a pustil jsem se do skládání vnořených for cyklů. Protože je úloha výpočetně náročná, zvolil jsem jazyk C.
Když jsem pochopil, jak je potřeba ořezávat vyhledávání prvočísel, dostavil se první výsledek. Pět opakujících se forů v sobě se mi ani trochu nelíbilo a tak jsem si vytyčil za cíl přepsat je do jediného cyklu. Není nad to zjistit po deseti letech programování, že nevím, jak funguje for...
Řešení.
Když jsem pochopil, jak je potřeba ořezávat vyhledávání prvočísel, dostavil se první výsledek. Pět opakujících se forů v sobě se mi ani trochu nelíbilo a tak jsem si vytyčil za cíl přepsat je do jediného cyklu. Není nad to zjistit po deseti letech programování, že nevím, jak funguje for...
Řešení.
pátek 6. srpna 2010
Project Euler - Problem #081
Tento problém byl velice poučný. Zadání zní jednoduše - najděte cestu maticí tak, aby součet hodnot navštívených polí byl co nejnižší. Začátek je v levém horním rohu, konec v pravém dolním rohu. Povolený směr pohybu je vpravo a dolů (viz Procházení šachovnice věží).
V ukázkovém příkladu se hledá nejnižší součet ve čtverci 5 × 5 polí, řešit se má matice 80 × 80 prvků. Jen pro představu je v takovém poli přibližně 2.315*10^46 různých cest. Nejkratší cestu lze najít efektivně pomocí Dijkstrova algoritmu, ale nejdříve je potřeba sestavit samotný graf, nad kterým bude algoritmus pracovat.
Pro jednoduchost ukážu řešení na příkladu v zadání. Takto vypadá naše matice:

Jednotlivé položky matice považujme za uzly a vložme mezi ně ohodnocené hrany (světle žlutá pole). Hodnota hrany je polovina součtu hodnot uzlů, které spojuje; pouze u počátečního (resp. koncového) pole se dělí dvěma jen hodnota pole uvnitř tabulky. Při průchodu a sčítání hodnot na hranách dospějeme ke stejnému součtu, jako bychom sčítali hodnoty procházených polí.

Ohodnotíme všechny uzly kladným nekonečnem, jen výchozí uzel ohodnotíme nulou. Sytě azurová pole jsou uzly, které už jsme zpracovali.

Procházíme (poslední) zpracované uzly a součet hodnoty uzlu a příslušné hrany ukládáme do následujícího uzlu vodorovným (resp. svislým) směrem, ale jen pokud je nový součet nižší, než aktuální hodnota následujícího uzlu (viz. obrázek).

Ohodnocená tabulka po průchodu grafem:

Řešení na pastebinu Ideone.
V ukázkovém příkladu se hledá nejnižší součet ve čtverci 5 × 5 polí, řešit se má matice 80 × 80 prvků. Jen pro představu je v takovém poli přibližně 2.315*10^46 různých cest. Nejkratší cestu lze najít efektivně pomocí Dijkstrova algoritmu, ale nejdříve je potřeba sestavit samotný graf, nad kterým bude algoritmus pracovat.
Pro jednoduchost ukážu řešení na příkladu v zadání. Takto vypadá naše matice:
Jednotlivé položky matice považujme za uzly a vložme mezi ně ohodnocené hrany (světle žlutá pole). Hodnota hrany je polovina součtu hodnot uzlů, které spojuje; pouze u počátečního (resp. koncového) pole se dělí dvěma jen hodnota pole uvnitř tabulky. Při průchodu a sčítání hodnot na hranách dospějeme ke stejnému součtu, jako bychom sčítali hodnoty procházených polí.
Ohodnotíme všechny uzly kladným nekonečnem, jen výchozí uzel ohodnotíme nulou. Sytě azurová pole jsou uzly, které už jsme zpracovali.
Procházíme (poslední) zpracované uzly a součet hodnoty uzlu a příslušné hrany ukládáme do následujícího uzlu vodorovným (resp. svislým) směrem, ale jen pokud je nový součet nižší, než aktuální hodnota následujícího uzlu (viz. obrázek).
Ohodnocená tabulka po průchodu grafem:
Řešení na pastebinu Ideone.
Procházení šachovnice věží
Mějme šachovnici o rozměrech n × n. Z levého horního rohu do pravého dolního rohu máme přesunout věž posunováním vpravo a dolů. Kolika různými způsoby lze takto věž přesunout?

Odpověď:

Pokud je šachovnice obdélníková rozměru m × n (m > n), tak lze počet průchodů vypočítat následovně:
Odpověď:
Pokud je šachovnice obdélníková rozměru m × n (m > n), tak lze počet průchodů vypočítat následovně:
středa 4. srpna 2010
Project Euler - Problem #092
Další zajímavou vlastnost přirozených čísel ukazuje problém č. 92. Řešení není těžké, jen je potřeba pořádně pochopit zadání. Abych mohl problém vyřešit v rozumném čase, musel jsem jej přepsat do kompilovaného jazyka. Skript v Pythonu běží na mém stroji (2.66 GHz) zhruba 20 sekund.
Řešení.
Řešení.
úterý 3. srpna 2010
Project Euler - Problem #063
Správce projektu Euler chtěl vyvolat diskuzi o tom, zda je nula přirozené číslo a proto vymyslel tento jednoduchý úkol. Vyřešeno z mobilu v trolejbuse.
Řešení.
Řešení.
Project Euler - Problem #079
Znáte telefonické ověření hesla tak, jak je například na zákaznických linkách bank?
A: "Zadejte druhé, třetí a šesté písmeno Vašeho hesla."
B: "PRD" (v případě, že heslo zní OPRAVDU)
Rozluštění odchycených odpovědí na podobné otázky je téma problému č. 79. Pokusím se nastínit myšlenku řešení.
Předpoklady: Čísla v tajném hesle se neopakují a v daných odpovědích jsou použita všechna čísla z hesla.
1. Nejdřív slovníkem zjistíme, které znaky bude heslo obsahovat.
2. Vytvoření porovnávací funkce (dvou argumentů, samozřejmě), která určí vztah mezi pozicemi jednotlivých čísel v hesle na základě daných odpovědí. K výsledku tato funkce dospěje součtem porovnání indexů předaných čísel. Například mezi čísly 1 a 9 bude hodnota vztahu -6, to znamená, že v odpovědích je šestkrát 1 před 9 (čtyři odpovědi 319, 129 a 719).
3. Setřízení znaků hesla pomocí porovnávací funkce.
Kód řešení.
A: "Zadejte druhé, třetí a šesté písmeno Vašeho hesla."
B: "PRD" (v případě, že heslo zní OPRAVDU)
Rozluštění odchycených odpovědí na podobné otázky je téma problému č. 79. Pokusím se nastínit myšlenku řešení.
Předpoklady: Čísla v tajném hesle se neopakují a v daných odpovědích jsou použita všechna čísla z hesla.
1. Nejdřív slovníkem zjistíme, které znaky bude heslo obsahovat.
2. Vytvoření porovnávací funkce (dvou argumentů, samozřejmě), která určí vztah mezi pozicemi jednotlivých čísel v hesle na základě daných odpovědí. K výsledku tato funkce dospěje součtem porovnání indexů předaných čísel. Například mezi čísly 1 a 9 bude hodnota vztahu -6, to znamená, že v odpovědích je šestkrát 1 před 9 (čtyři odpovědi 319, 129 a 719).
3. Setřízení znaků hesla pomocí porovnávací funkce.
Kód řešení.
Přihlásit se k odběru:
Příspěvky (Atom)
