Chci geek triko! Chci geek triko!
Extra 10 % bodů navíc a tričko zdarma při zadání kódu "TRIKO10"

Sudoku v JavaScripte

JavaScript Sudoku v JavaScripte

Unicorn College ONEbit hosting Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

Vytvoril som Sudoku aplikáciu (hru), ktorá sa skladá z troch základných častí (Play, Solve, PDF). Aplikácia je prispôsobená na rôzne veľkosti a typy obrazoviek.

Hra (Play)

Cieľom je vyplniť všetky prázdne polia podľa základných pravidiel sudoku.

  • hráč si môže vygenerovať novú náhodnú hru a zvoliť si jej obtiažnosť (easy, medium, hard).
  • aplikácia využíva lokálne úložisko (local storage), do ktorého sa ukladá hra, takže aj po zavretí prehliadača a následnom načítaní stránky, sa automaticky načíta posledný stav.
  • generovanie hry je náhodné.

Riešenie (Solve)

Užívateľ môže zadať sudoku a následne si ho nechať vyriešiť.

Poznámka: ak je zadané sudoku riešiteľné, výsledok sa vypočíta rýchlo. Ak sa zadá bez riešenia (a s minimom vstupných čísel), môže to spôsobiť zahltenie a nereagovanie aplikácie.

Vytvoriť PDF

Užívateľ si môže nechať vygenerovať pdf, zvoliť si obtiažnosť aj počet strán, pričom na jednu stranu sa vygeneruje 6 rôznych hier.

Poznámka:

  • generovanie môže chvíľu trvať, najmä na menej výkonných zariadeniach typu smartphone/tablet.
  • pre generovanie pdf som použil jsPDF.

Online verzia:

Aplikácia je dostupná online: sudoku

Možné vylepšenia
  • pri vytváraní sudoku, aplikácia nekontroluje, či sa jedná o sudoku, ktoré ma len jedno možné riešenia, ale len náhodne odstráni určitý počet čísel (závisí od obtiažnosti).

Budem vďačný za každý názor, pripomienku, kritiku, ... .


Galerie

Program byl vytvořen v roce 2017.

 

Stáhnout

Staženo 74x (333.03 kB)
Aplikace je včetně zdrojových kódů v jazyce JavaScript

 

 

Program pro vás napsal Peter Sciranka
Avatar
Jak se ti líbí článek?
5 hlasů
Autor sa venuje tvorbe webových aplikácii v Javascripte, tvorbe web stránok ale taktiež sa zaujíma o design, beckend a nové technológie.
Miniatura
Všechny články v sekci
JavaScript
Aktivity (2)

 

 

Komentáře
Zobrazit starší komentáře (2)

Avatar
Michal Žůrek - misaz:28.12.2017 22:56

btw. Jaký máš názor na tu knihovnu jsPdf? Když jsem se před několika lety snažil vygenerovat PDF z JS tak knihovny byli jedna velká tragédie. Jedna vedle druhé. Už si ani nepamatuji jakou jsem nakonec použil. Zlepšilo se to nějak? Musel ji řešit nějaké záludné problémy, nebo to fungovalo "na první dobrou"?

Editováno 28.12.2017 22:57
Odpovědět 28.12.2017 22:56
Nesnáším {}, proto se jim vyhýbám.
Avatar
David Čápka
Tým ITnetwork
Avatar
David Čápka:28.12.2017 23:18

Až teď jsem si všiml toho skvělého loga sovy :P

Odpovědět  +1 28.12.2017 23:18
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Peter Sciranka
Redaktor
Avatar
Odpovídá na Michal Žůrek - misaz
Peter Sciranka:31.12.2017 10:29

Ahoj, ospravedlňujem sa že reagujem až teraz (som na chate). Ďakujem ti za komentár a rady, budem sa ich držať :)
Co sa tyka toho pdf, tak to bola moja prvá voľba, na fórach som na túto knižnicu našiel celkom pozitívne reakcie. Ja som to vyriešil tak, že sudoku je najskôr vytvorené na canvas a následne je tento obrázok napasovany do pdf. Problém som s tým nemal žiadny (až ma to prekvapilo).
Ahoj a prajem všetko dobré do nového roku :)

Odpovědět 31.12.2017 10:29
Act as if it was Impossible to Fail
Avatar
neutr
Člen
Avatar
neutr:2. ledna 18:39

Jak máš očetřenu obtížnost / řešitelnost? Rád se nechám poučit. Mám koncept něčeho hodně podobného. Nastavit obtížnost explicitně nejde - tedy jde ale bez záruiky že je úloha ještě jednoznačně řešitelná.

Já osobně postavím nejprve úplné řešení a pak diskriminuji (mažu) čísla tak abych to posadil na řešení jediného čísla. Ale neumím vyřešit abstrakci vyloučení 2-3 možností aby zůstala jediná správná možnost.

Nechat to ve stavu když to nepůjde jednoznačně řešit je šit. Jak otestuješ že to nemá víc správných řešení, nebo že to není řešitelné?

 
Odpovědět 2. ledna 18:39
Avatar
Peter Sciranka
Redaktor
Avatar
Odpovídá na neutr
Peter Sciranka:2. ledna 19:06

Ahoj, ako som písal v popise v časti "možné vylepšenia", aplikácia nekontroluje, či má sudoku jediné možné riešenie. Je to nastavené tak, že sa náhodne vygeneruje plné (vyriešené) sudoku a následne sa náhodne odstránia čísla (easy: ostane 45 čísel, medium: ostane 35 čísel, hard: ostane 27 čísel; alebo nejak tak, teraz presne neviem, ale približne takto).

Pretože je to v Javascripte a všetky výpočty bežia len na strane klienta, tak som to nechcel zaťažovať tým, že budem kontrolovať "jedinečnosť riešenia" a čakať, kým sa vytvorí takéto sudoku.

Jeden spôsob ako to dosiahnuť je, že si pripravíš pár takýchto sudoku, ktoré už budeš mať skontrolované a následne im môžeš prehadzovať riadky, stĺpce, otáčať ich a tým pádom dokážeš z jedného sudoku urobiť na prvý (aj druhý a aj tretí) pohľad rôzne sudoku.

Ďalšia možnosť je, že užívateľovi sa na začiatku stiahne už predpripravené sudoku a následne na pozadí spustíš generovanie nového, ktoré sa stane predpripravené (prípadne budeš mať nejakú zásobu sudoku).

Prípadne toto všetko nastaviť na backende a následne len cez AJAX/API by sa užívateľovi sťahovali predpripravené sudoku.

Ale ako som napísal, ja som toto zatiaľ neimplementoval, jedná sa čisto o FrontEnd aplikáciu.

Odpovědět 2. ledna 19:06
Act as if it was Impossible to Fail
Avatar
neutr
Člen
Avatar
neutr:2. ledna 20:12

Víš ode mne je to docela zákeřené. Explicitně nic takového neuděláš. Nejspíš bys musel oslovit někoho z praktiků aby Ti dali ta nejobtížnější řešení. No a pak udělat jen substituci čísel. Dělám 40 let kombinatoriku a poradím si v mnoha věcech ale garantovat obtížnost s unikátním řešením na to nemám.

Dá se udělat i substituce posic čísel na stejné řešení u dělat "milionkrát?" jinak. Ale explicitně vygenerovat obtížnost s určitým a jediným řešením je nad úrovní extrémní inteligence.

Ta praktika in line (Front end) nemá šanci bez důkazu. Ve výsledku může být jen vágní úvaha "asi to lze řešit" - když ne tak tak sorry. Jako úvaha k přemýšlení komunity vývojářů je to dobré, ale nasadit to do soutěže??

Ti co řeší závodně? Sudoku je pošahaná parta, ale já si nedovolím predikovat obtížnost pro tuhle bandu.Šel bych se zeptat s velkou pokorou co a proč je obtížné - a ani tak bych si nedovolil tvrdit, že vytvořím pravidla obtížnosti.

Řeším různé věci od algoritmů Partition, kombinace, variace with repetition a třeba faktoriál (Variace bez opakování) v extrémním rozsahu. Sudoku jsou pro mne kombinace typu C(9;3) - celkem systémy z 84 trojic uspořádaných do obsahů všech dvojic (840 systémů) které se dají uspořádat do 15360 systémů všech trojic 7x4 matiace 3x3. Měl bych z toho vytvořit QR kód a právě "Sudoku" jednoznačně predikovatelné bych potřeboval jako explicitní systém. - Nemám neumím.

Když bys to uměl seknu hlubokou poklonu.

 
Odpovědět 2. ledna 20:12
Avatar
Peter Sciranka
Redaktor
Avatar
Odpovídá na neutr
Peter Sciranka:2. ledna 20:50

Popravde, neviem, čo ti na to napísať. To čo píšeš tak máš pravdu, ale mojím zámerom nebolo vytvoriť algoritmus na generovanie sudoku s jediným možným riešením a garantovaným stupňom obtiažnosti a ani to nikde netvrdím. Práve naopak, myslím si, že je to v popise všetko uvedené, ako to funguje.

Aplikácia je tu uvedená vrátane celého zdrojového kódu, je poskytnutá zdarma, nič za to nechcem a jedná sa len o ukážku, ako sa dá vytvoriť web-app v čistom JavaScripte + HTML/CSS.

Jako úvaha k přemýšlení komunity vývojářů je to dobré, ale nasadit to do soutěže??

Neviem ako si to presne myslel, aplikáciu som do žiadnej súťaže nenasadil a ani som to nikdy nemal v pláne.

V tom generovaní jedinečnosti riešenia a garantovania obtiažnosti máš pravdu a som rád, že si to tu napísal :)

Odpovědět  +1 2. ledna 20:50
Act as if it was Impossible to Fail
Avatar
neutr
Člen
Avatar
Odpovídá na Peter Sciranka
neutr:3. ledna 12:56

Mrzí mne že se Tě moje příspěvky dotkly. Takhle jsem to určitě nemyslel. Jistě si ale rozumíme. Vím že jsi udělal dobrou věc. Měl jsem asi lépe zvýraznit že to není kritika na Tvou adresu, ale spíš motivační dotaz který by zajímal mne.

Asi jsem měl brát zřetel jen vytvořený obsah. Mne by právě zajímalo komplexní řešení na úrovni která by byla vhodná pro vrcholové soutěže. Někdo takové Sudoku staví a umí jít na hranici možného. Existují soutěže a někdo to musí umět. Celkem si myslím, že to dělají intuitivně, ale pokud mají nějaké algoritmy tak je asi nebudou zveřejňovat.

Naopak otestovat existující zadání není zdaleka takový problém jako postavit obtížné ale řešitelné zadání. Teoreticky by to mělo být stejně obtížné ale není.

Zajímalo mne spíš to zda někdo bude reagovat na takovou výzvu a postrčí mne. Jak jsem už psal - potřeboval bych to pro QR kód - matice 92. Ono to funguje i bez této podstaty, ale moc bych docenil minimalistický zápis který by měl garantované unikátní řešení.

Myslím žes to vzal správně [V tom generovaní jedinečnosti riešenia a garantovania obtiažnosti máš pravdu a som rád, že si to tu napísal ] - díky.

 
Odpovědět  +1 3. ledna 12:56
Avatar
Peter Sciranka
Redaktor
Avatar
Odpovídá na neutr
Peter Sciranka:3. ledna 13:13

Musím popracovať na svojom vyjadrovaní :)

Myslím, že si rozumieme ako to kto myslel a mňa mrzí, že som to napísal tak, že sa ma to dotklo, len som chcel poukázať, že mojím cieľom bolo niečo iné ako to čo si sa pýtal, ale teraz to už je jasné :)

Ak by sa ti to podarilo nejak vyriešiť, tak mi prosím ťa napíš, budem veľmi rád :)

Odpovědět  +1 3. ledna 13:13
Act as if it was Impossible to Fail
Avatar
neutr
Člen
Avatar
Odpovídá na Peter Sciranka
neutr:3. ledna 14:47

Ano děkuji. Určitě se na Tebe a tohle fórum obrátím. Mám k tomu dobrý důvod.
Osobně se angažuji na fóru OpenOffice.cz (nick stejný - neutr). Mojí velkou a ne příliš úspěšnou snahou je řešit potřeby státní správy a samosprávy. Má to více důvodů. To co nyní chystám je právě QR kód nového typu. Dnes bez čárového, nebo QR kódu úřady nefungují.

To co jsou dnes kvadratické obrázky QR se musí načítat přes OCR a jsou zbytečně "velké". Při tom mají docela malý obsah informací. Kombinatoricky čtená matice 92 má možnost zaznamenat mnohem více informací nežli 81 pozic dlouhý string.

Rozhodl jsem se pro JavaScript zejména proto, že kancelářské aplikace (Libre Office, Apache Open Office, ale asi i většina ostatních) lze skriptovat pomocí JavaScriptu. Matice používá samozřejmě všechny tisknutelné znaky. Takže takovou matici lze přepsat i klávesnicí když například klekne scaner a myslím že by standard mohl být v rámci velikosti fontu 6, nebo i méně. To souvisí s velikostí - řeknu okolo 4x4 cm, ale matice může být vytvořena jen důlčíkem v miniaturní podobě a také bude fungovat i když nevezme zdaleka tolik co matice alfanumerických znaků.

Osobně zastávám názor že vědomosti patří všem - zdarma, a jsem i protagonista hnutí Public money - public code PublicMoney-PublicCode. Nemyslím tím, že by IT specialisté měli pracovat zadarmo. Lidé si to často pletou OpenSource je zdarma a tak i programátor dělá za dobré slovo.

Například Vigenèrova šifra pro mne znamená tabulku 2562 generovanou z potenciálu 256! (faktoriál čísla 256), která se za běhu přešifruje a překonává tak Vernamovu šifru. Mimo toho už jsem zveřejnil typ šifry PNBT - žádný velký bratr už nebude moci nahlížet přes rameno.

Umím udělat zápis devítkových systémů pomocí 8-bitů - i když to není plnohodnotné tak objem umí také opravdu hodně. Mojí slabinou je skutečnost že jsem se naučil jen něco málo a nejvíc dělám ve StarBasicu. Samozřejmě si poradim se čtením Javy, nebo C a s JavaScriptem nemám žádný velký problém. Jsem ale stejně starý jako Rock&Roll a nemám moc chuti implementovat a zejména ladit aplikace - to dělám jen velmi nerad a ještě když neumím jazyk tak je to na mrtvici.

 
Odpovědět 3. ledna 14:47
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 12. Zobrazit vše