Úloha 18: Věštění (matematické čtení myšlenek)
Cíl úlohy
Vytvořte interaktivní webovou aplikaci pro zdánlivé „čtení myšlenek“. Uživatel si v duchu zvolí libovolné dvojciferné číslo, odečte od něj součet jeho číslic, v tabulce vyhledá symbol odpovídající výsledku a počítač tento myšlený symbol s naprostou jistotou uhodne.
Matematický princip a důkaz (MathML)
Každé dvojciferné číslo s číslicí desítek a jednotek má hodnotu . Jeho ciferný součet je .
Pokud od čísla odečteme jeho ciferný součet, získáme:
Závěr: Bez ohledu na to, jaké dvojciferné číslo si uživatel zvolí, výsledek bude vždy násobkem devíti: !
Skriptu tedy stačí přiřadit všem násobkům čísla 9 () jeden a tentýž náhodně vygenerovaný symbol a ten si uložit do $_SESSION['spravny'].
Úvahy a doporučený postup řešení
- Generování náhodného symbolu: Na začátku vyberte náhodný symbol pomocí
rand(1, count($symboly))a uložte jej do session. - Sestavení tabulky ve sloupcích: Čísla vypisujte do sloupců od 1 do 100 (první sloupec shora dolů obsahuje čísla 1 až 10, druhý 11 až 20 atd.). Pokud je
$cislo % 9 === 0, přiřaďte vybraný tajný symbol. V ostatních případech přiřaďte náhodný jiný symbol, aby tabulka působila pestře a náhodně. - Session persistence: Prohlížeč si v session pamatuje, který symbol byl přiřazen násobkům devíti v okamžiku zobrazení tabulky.
Doplňující otázky k zamyšlení a náměty na rozšíření
- 1. Jak s dělitelností devíti souvisí pravidlo pro kontrolu dělitelnosti libovolného čísla devíti (tzv. devítkový zbytek a ciferný součet)?
- 2. Co by se stalo, kdyby uživatel zvolil jednociferné číslo (např. 7)? Platí pravidlo i pro něj (, což je také násobek 9)?
- 3. Proč se při každém novém načtení stránky musí symbol pro násobky 9 znovu náhodně vylosovat? (Aby si uživatel při opakování nevšiml, že symbol je stále stejný).
- 4. Proč při responzivním zobrazení na mobilních zařízeních (přeskupení do menšího počtu sloupců) nesmí být počet sloupců nikdy roven 9? (Při 9 sloupcích by se všechny násobky devíti seřadily přesně do jednoho sloupce pod sebe a trik by byl na první pohled odhalen!).
Vyzkoušejte funkční řešení: Otevřít vzorovou úlohu vesteni.php