Práce s kombinacemi v tabulkových procesorech je dána omezeně prostřednictvím výchozího nastavení. Standardně lze využívat jen funkci pro výpočet množství (počtu) kombinací [b]=COMBIN(n;k)[/b]. [i]Nikde jsem nenašel (mimo jedné vyjímky) možnost použít funkci pro vytvoření tělesa (množiny) kombinací. Tou vyjímkou je práce ing Petra Pecháčka na adrese Excel čísla. Z této stránky také můžete stáhnout ZIP archiv se dvěma sešity. Ten správný se jmenuje [b]excel_rozbor_čísel[/b]. V něm je předposlední list s názvem : [b]kombinace,variace,permutace[/b]. Konkrétně stažení je zde : [url=http://officir.ic.cz/chipex04/10/soubory/excel_cisla.zip]Sešity Excel[/url][/i]
[i][u]Poznámka :[/u]
Už z náhledu následujícího obrázku pochopíme, že to je jen účelová demonstrace. Nedá se s tím prakticky pracovat, pokud nejste programátorem. Běžný uživatel si s tím moc neporadí. Je zde plno omezení. Mimo toho uživatel těžko z makra vytáhne jen funkci kterou by potřeboval nainstalovat do jiného sešitu. Vázanost jen na tento sešit (řekněme, že je to vazba na šablonu – „template“) není jediný problém. Funkce využívá buněk sloupce „B“ k zadávání parametrů. Další věcí je to, že autor si byl vědom možnosti pádu systému pokud by bylo k-tic (kombinací, variací ap.) mnoho. Při překročení kapacity sloupce (1,048.576 řádků) by to nastalo téměř určitě. Ale praktické HW vybavení stroje nemusí zvládnout ani celý sloupec. Prostě málo paměti a výsledek je tentýž. Z toho důvodu je omezeno [b]n[/b] a také [b]k[/b]. Praktické omezení je na jednociferná čísla. Další problém je s tím, že je generování prováděno do číselné podoby – tedy jakoby do formátu UV (unique value). To by znamenalo buď uložit jako CSV a zpětně načíst – už jako samostatná čísla v každém sloupci (čísla nejsou nijak oddělena), nebo výstupní tvar rozebrat textovými funkcemi.
Ovšem je to jediný případ tohoto druhu, který znám a za to autorovi patří pochvala. [color=blue]Když by jste věděli o něčem podobném – v jakémkoliv tabulkovém procesoru, rád bych dostal od Vás tip. Můžete také vložit například komentář a podobně.[/color].
Svět je veliký a já si ani náhodou nemyslím, že bych udělal úplnou rešerši. Hesla k tomuto tématu vrací prakticky výlučně výpočet množství. Ani v programech jsem nenašel nic jen pro tabulkový procesor. Nejspíš by to mohlo být někde pod Excelem kam jsem se neproklikal. Předem děkuji.[/i]

Vzorce kombinací pro všechny různé tabulkově procesory
Seznámíme se syntaxí vzorců pro všechny tabulkové procesory bez ohledu na to, pod jakým OS, či licencí běží. Defaultní nastavení funkcí [b]IF[/b], nebo ještě nanejvýš [b]SUM[/b] a [b]ISNUMBER[/b] je u všech druhů stejné. V extrémním případě vystačíme jen s podmínkou [b]IF[/b]. Tuto funkci i funkci [b]SUM[/b] a [b]ISNUMBER[/b] přečte například správně i jinak než anglicky lokalizovaný Excel.
———– [color=blue]Vzorec pro Kombinace všech 2. tříd C([b]n[/b][3..∞); [b]k[/b] = 2)[/color].———-
A combination of formula 2. classes [are specifically C(9.2) ] | ||||
1 | 2 | ← Start row (only numbers) | n = 9 | |
1 | 3 | ← The working formula (the only one we copy) | ||
↓ | ↓ | |||
→ | = Formula 2 | |||
→ | = Formula 1 |
Formula 1 :
=IF(OR(SUM(A3:B3)>=9*2-1;ISNUMBER(A3)=0)=1;1;IF(B3=9*1;A3+1;A3))
Formula 2 :
=IF(OR(SUM(A3:B3)>=9*2-1;ISNUMBER(B3)=0)=1;2;IF(B3=9*1;A3+2;B3+1))
[b][u]Ovládání vzorce[/u][/b]
Vzorec má 2 druhy nastavení. Je to určení [b]n[/b] a startovních hodnot. Obtížnější je nastavení [b]n[/b]. To můžeme provádět na každém vzorci samostatně, ale technicky správně je pouze pomocí dialogu [b]“Najdi a nahraď“[/b]. [i]Je to taktéž standardní nástroj každého tabulkového procesoru[/i]
[color=blue]Postup nastavení [b]n[/b] pomocí dialogu :[/color]
Dialogem změníme naráz všechny proměnné [b]n[/b]. → Vybereme všechny buňky se vzorci. Zavoláme dialog [b]Najdi a nahraď[/b]. Do vstupního pole [b]Najdi[/b] zadáme v našem případě [color=red] [b]=9*[/b] [/color]. Do vstupního pole [b]Nahraď[/b] zadáme například [color=blue] [b]=49*[/b] [/color]. A necháme nahradit všechny původní hodnoty za nové. Tím je operace skončena a náš vzorec bude generovat místo původního C(9,2) nově C(49,2). Tento vzorec pak kopírujeme tak jak jsme u vzorců zvyklí. Například tažením za růžek úseku se vzorci, nebo do předem vybraného úseku. [i]Pozor na manipulaci s dialogem: Musíte zadat „změnit vzorce“, a pouze [b]vybraný úsek[/b]. Jinak se dočkáte nemilého překvapení.[/i]
Ve vzorcích jsou červeně označeny původní hodnoty. V každém vzorci jich bývá více. Když by jste takto měnili například vzorce pro [b]k[/b] = 10 tak je v každé buňce tato hodnota obsažena tuším až 10x a buněk je také 10. To je pro ruční přepisování po jednom [b]n[/b] nemyslitelné. Určitě by jste udělali chybu, která se pak velice těžko hledá. Dialogem je to bezpečné a rychlé. Kvůli bezpečnosti je do syntaxe vzorce zabudováno to podivné spojení. Například v 1. vzorci máme výraz [u]SUM(A3:B3)>[color=red]=9*[/color]2-1[/u]. Nemusíte být matematicky zdatní, aby jste pochopili, že je to test na horní limity (zarážky) vzorce. 9*2-1 = 18-1 – tedy 17. To je součet limitních hodnot. Když je podmínka vyhodnocena jako „true“, vzorec se sám nastaví do startovní pozice 1,2 Tím je umožněno pracovat v cyklu bez konce. Jedna z bezpečnostních zásad je, že [b]n[/b] je největší hodnotou ve vzorci (nejméně [b]k[/b], respektive [b]k[/b] + 1. Žádná jiná hodnota ve vzorci nesmí překročit [b]k[/b]. [i]Snadno by se mohlo stát, že přepíšeme omylem úplně něco jiného. Největší riziko ale vychází z adres buněk. Představte si, že budeme stát zrovna v 10. řádku, a rekurzivně volané adresy buněk budou například SUM(A9:B9). Omylem bychom adresy přepsali na hodnotu nového [b]n[/b] – například na SUM(A49:B49). Proto je důležité, aby se nahrazovalo jen pomocí červeně zvýrazněné syntaxe [color=red]=9*[/color]. Tak je vyloučena záměna hodnot adres a [b]n[/b]. Takže když by jste například zapoměli předřadit „=“ nebo ukončit „*“, a nebo oboje, tak je malá pravděpodobnost, že budete zrovna stát na „špatném řádku“. Proto se Vám operace stejně nejspíš povede.[/i]
[color=blue]Postup nastavení startovních hodnot :[/color]
Standardní nastavení startovních hodnot je pro systémy [b]k[/b] následující :
[b]k[/b] = 2 → [i]1 , 2[/i]
[b]k[/b] = 3 → [i]1 , 2 , 3[/i]
[b]k[/b] = 4 → [i]1 , 2 , 3 , 4[/i]
[b]k[/b] = 5 → [i]1 , 2 , 3 , 4 , 5[/i] a tak dál
Nestandardní nastavení startovních hodnot pro systémy < [b]k[/b] je například :
[b]k[/b] = 2 → [i]0 , 1[/i] → generuje jednice
[b]k[/b] = 3 → [i]0 , 1 , 2[/i] → generuje dvojice
[b]k[/b] = 4 → [i]0 , 1 , 2 , 3[/i] → generuje trojice
[b]k[/b] = 5 → [i]0 , 0 , 0 , 1 , 2[/i] → generuje dvojice
Vzorec (generátor) po vygenerování nižšší třídy (záměrně nastartované) plynule přejde ke generování vyšší třídy. Jakmile je dosaženo konce plné třídy [b]k[/b], plynule přejde generování na standardní startovací hodnoty. Jde o nekonečný cyklus, který je vhodný pro generování dvou navzájem závislých paralelních vzorců. [i]Samozřejmě jednoduchou úpravou podmínky [b]IF[/b] můžeme dosáhnout ukončení cyklu například tím, že po vygenerování[/i] posledního řádku dosadíme místo startovní hodnoty písmeno – například „E“ jako End, nebo Error :
=IF(OR(SUM(A3:B3)>=9*2-1;ISNUMBER(A3)=0)=1;„E“;IF(B3=9*1;A3+1;A3))
-Když nastavíme například [b]k[/b] = 5 startovní hodnoty na „nuly“ dostaneme část, nebo celou Pascalovu třídu 2^[b]n[/b].
[b]k[/b] = 0 → [i]0 , 0 , 0 , 0 , 0[/i] → generuje nultou třídu
[b]k[/b] = 1 → [i]0 , 0 , 0 , 0 , 1[/i] → generuje první třídu (začátek)
………
[b]k[/b] = 1 → [i]0 , 0 , 0 , 0 , [b]n[/b][/i] → generuje první třídu (konec)
[b]k[/b] = 2 → [i]0 , 0 , 0 , 1 , 2[/i] → generuje druhou třídu (začátek)
………
[b]k[/b] = 2 → [i]0 , 0 , 0 , [b]n-1[/b] , [b]n[/b][/i] → 2. třída (konec)
[b]k[/b] = 3 → [i]0 , 0 , 1 , 2 , 3[/i] → generuje třetí třídu (začátek)
………
[b]k[/b] = 3 → [i]0 , 0 , [b]n-2[/b] , [b]n-1[/b] , [b]n[/b][/i] → 3. třída (konec)
[b]k[/b] = 4 → [i]0 , 1 , 2 , 3 , 4[/i] → generuje čtvrtou třídu (začátek)
………
[b]k[/b] = 4 → [i]0 , [b]n-3[/b] , [b]n-2[/b] , [b]n-1[/b] , [b]n[/b][/i] → 4. třída (konec)
[b]k[/b] = 5 → [i]1 , 2 , 3 , 4 , 5[/i] → generuje pátou třídu (začátek)
………
[b]k[/b] = 5 → [i][b]n-4[/b] , [b]n-3[/b] , [b]n-2[/b] , [b]n-1[/b] , [b]n[/b][/i] → 5. třída (konec)
[b]Bohu žel tyto systémy kombinací bývají nazývány různě, ale velice často jako Permutace[/b]. Správně jde o část Pascalovy třídy 2^[b]n[/b]. Je sice docela svůdnou myšlenka vyjádření pomocí Faktoriálu. Vlastně tedy pomocí variací například jako [b]n[/b]^[b]k[/b], ale najdou i se tací, kteří vyjádří [b]k[/b]^[b]n[/b] a ještě k tomu velice logicky přiřadí vlastnost [b]k[/b] ≥ [b]n[/b]. Pak je výběr [b]k[/b] větší (nanejvýš roven) počtu všech možných [b]n[/b]. Dostáváme pojem „s opakováním“. [i][color=red]Ale zkuste z devíti možných vybrat třeba jen 10, nebo více. Nebo zázračně vyberte třeba 35 z celku 9 možných !![/color][/i] Právě tyhle nesmysly jsou řešeny v Teorii kombinatoriky.
[i][u]Poznámka :[/u]
Samozřejmě výraz 2^[b]n[/b] jsou také variace s opakováním, protože [b]n=2[/b] ≤ [b]k[/b]. Dokonce je to nejčastěji používaný kombinatorický výraz (binární kód). Ale tento výraz popisuje [b]součet kombinací[/b]. Mohli bychom použít výraz, že se jedná o enumeraci, nebo dokonce faktorizaci tříd kombinací. 2^[b]n[/b] = Σ C([b]n[/b],0) + C([b]n[/b],1) +…+ C([b]n[/b],[b]n[/b])[/i].
[color=blue]———– Vzorce pro Kombinace tříd 2 až 5.———-[/color]
Tady se už příliš rozvádět k manipulaci nebudu. Uvedu pouze vzorce pro třídy [b]k[/b]=2, [b]k[/b]=3, [b]k[/b]=4 a [b]k[/b]=5. Kliknutím na následující odkaz se Vám otevře stránka se vzorci s podobou, kterou uvádím výše pro 2. třídu kombinací. Manipulace jsou stejné a snad tedy uživatel nebude mít problém s tím kam patří každá formula číslo 1. Samozřejmě do buňky A2, protože v buňce A1 je startovní hodnota. Samozřejmě všechny vzorce s názvem formula 2 patří do buňky B2, protože v B1 je startovní hodnota a tak dál.Vzorce kombinací
[i]Na stránce se vzorci je pouze formát TXT, takže stačí jen kopírovat a vložit na správné místo do tabulkového procesoru. Pro Open Office to stačí. Vzorec je ihned funkční, ale to nemusí platit pro jiné druhy tabulkových procesorů. V takovém případě bychom následně aktivovali vzorec (editační mód a Enter, nebo Insert ap). Vzorce z odkazu nakopírujeme nejprve na na své místo. Následně doporučuji změnit typ písma, protože to zkopírované je jiný druh nežli přednastavený (to je pouze estetické hledisko, mně to ale dost vadí).
formula 1 do buńky A2
formula 2 do buńky B2 [color=blue](pro všechny vzorce s [b]k[/b] > 1 )[/color]
formula 3 do buńky C2 [color=blue](pro všechny vzorce s [b]k[/b] > 2 )[/color]
formula 4 do buńky D2 [color=blue](pro všechny vzorce s [b]k[/b] > 3 )[/color]
formula 5 do buńky E2 [color=blue](pro všechny vzorce s [b]k[/b] > 4 )[/color]
Do buněk A1-E1 vložíme startovací hodnoty (samozřejmě jen podle toho jaké [b]k[/b] používáme). Pro [b]k[/b] = 2 stačí A1-B1, pro [b]k[/b] = 3 stačí A1-C1, a tak dál.
Jakmile máme základní vzorec sestrojený, můžeme ho libovolně kopírovat, nebo vystříhnou a vložit na úplně jiné místo, nebo jiný list v jiném sešitě a podobně. Funguje například přímé kopírování vzorce z AOO Calc do Gnumeric, nebo Excel. Ověřoval jsem například postup > uložit Calc (AOO) do Excel (zabudovaný konverzní formát v Calc-u pro MSO) > otevřít v Excel (original MSO) a fungují všechny typy vzorců. Nejen tedy vzorce kombinací, ale například i faktoriál, nebo variace bez opakování. Při tom vzorce faktoriál a variace bez opakování jsou konstruovány jako maticové, což je podstatný rozdíl oproti vzorcům kombinací a nebo variací s opakováním.[/i]
Vzorce kombinací pro Open Office (AOO a LO) jako extension
Pro OpenOffice jsem vytvořil plugin, který umožňuje vygenerování vzorců přímo na místo, kde stojí kurzor. Parametry se zadávájí pomocí vstupu „inputbox“ a dialogů. Dialogem se například zadají a vygenerují buď jen základní vzorce v té podobě, kterou popisuji výše (jen stratovní řádek a jeden řádek vzorců), nebo je možné vygenerovat celou množinu (vzorec se vykopíruje sám od první až do poslední k- tice. Tedy v tomto případě kombinace). Vzorce nabízí standardně možnost „zachovat vzorce“, nebo jen výsledek jako čísla. Další možností je vygenerování „asociativní množiny“. Je to množina vytvořená z kombinací (obecně také například z variací, faktoriál ap.), která má jen poziční odkazy na buňky, které jsou unikátně první. [i]Ostatní buňky se stejným znakem na první buňku odkazují. Například všechny buňky které mají v obsahu číslo 1 odkazují na buňku, která která má v pořadí jako první znak jedničky. Znakem jsou samozřejmě čísla, ale jen do doby, nežli je přepíšeme na jiné znaky, zejména alfanumerické. Takovou množinu už vůbec nezajímá co kombinuje, takže můžeme zadat například slovo, které obsahuje stejné znaky. Tato „asociativní množina“ vykonává [b]substituci[/b] ve smyslu kryptografickém. Hodí se proto zejména k šifrování, ale i jinde.[/i]
Plugin nabízí standardně všechny druhy kombinatorických vzorců mimo nesmyslných kombinací a permutací s opakováním. Konkrétně vždy od třídy 2 do třídy 5. [i]Do původního konceptu jsem zahrnul třdy 2-10. V nabídce tak byly 4 kvalitativní poddruhy každý s 9 – ti vzorci třídy 2 – 10 + jedno makro generující do „foldru“ k – tice CSV – kvalitativní druh (stejný jako vzorce). Plus odkaz na šablony (template), které jsou také součástí a sice pro každý druh jedna. Pak mne napadlo, že takový rozsah nikdo nevyužije, a když tak jedině snad 1 člověk z milionu. Nabídka by každému zamotala hlavu – ani by nevěděl k čemu a kde co použít. Počet jsem zredukoval na 5 položek, tedy třídy 2. – 5. + šablona.[/i] Do šablony jsem zabudoval ukázková makra a výukové texty. Bohu žel texty bych musel překládat nejméně do Angličtiny (pomocí Google překladače). Takže jsem zvolil variantu tuto. Popisy (návody, teorie, triky a jiné) budou zde. Každý si zvolí svou řeč. Takže toto rozšíření zde bude mít domovskou stránku. Ale nejdřív to musím postavit a je toho hodně.
Stažení extension jako celku, nebo jen šablony, či pouze knihovny maker bude k dispozici v sekci Download. (Ta v této fázi výstavby webu ještě neexistuje, ale určitě se k tomu za čas dopracuji.)
Na závěr :
Ostatní činností (práce) v tabulkových procesorech se nalézá na stránce [b]“Algoritmus kombinací“[/b]. To se týká programování ale nejen v tabulkových procesorech. Další záležitosti, týkající se spíš vzorců jsou na stránce [b]“Grafický algoritmus kombinací“[/b]. Tam jsou návody jak pracovat se vzorci. Například se dozvíte, že pokud máte už jen vzorce pro generování dvojic, můžete za pomocí tohoto generovat i [b]k[/k] mnohem větší. Klidně i [b]k[/k] < 10, nebo [b]k[/k] < 50. Je však lepší mít více modulů, zejména alespoň 1 s lichým počtem [b]k[/b]. Ke všem pracem postačují tedy pouhé 2 třídy kombinací [b]k[/b] = 2, a [b]k[/b] = 3. Smysl dávají ještě [b]k[/b] = 5. [b]k[/b] = 6 už je stejně jen dobré pro hazard. Pokud to někdo potřebuje pro seriózní práci, sáhne určitě raději po makru a ne po vzorci.