Funkcia pre kontrolu výhry pri Sudoku – Python – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Funkcia pre kontrolu výhry pri Sudoku – Python – Fórum – Programujte.comFunkcia pre kontrolu výhry pri Sudoku – Python – Fórum – Programujte.com

 

Task13370
Newbie
16. 7. 2015   #1
-
0
-

Dobrý deň. Chcem sa spýtať, či pri kontrolovaní správnosti Sudoku plochy nestačí skontrolovať len unikátne čísla v riadkoch a stĺpcoch, ale treba kontrolovať aj 3x3 polia. Prikladám aj svoju funkciu, ako som to riešil ja a som otvorený prípadným zlepšeniam a návrhom.

Ďakujem.

def Vyhral():
    vyhral1 = False
    vyhral2 = False

    for i in range( 9 ):
        listRiadok = [ 1,2,3,4,5,6,7,8,9 ]
        listStlpec = [ 1,2,3,4,5,6,7,8,9 ]
        for j in range( 9 ):
            for k in listRiadok: #pre kazde cislo v riadku loopujem listom cisel 1-9, ked najdem, tak ho vyhodim z listu, na konci riadka musi zostat prazdny list, ak je tam kazde cislo prave raz
                if k == thismodule.plocha[ i * 9 + j ]: #riadky
                    listRiadok.remove( k )
                    break
            for l in listStlpec:
                if l == thismodule.plocha[ j * 9 + i ]: #stlpce
                    listStlpec.remove( l )
                    break

        if not listRiadok: #je v kazdom riadku kazde cislo prave raz ( t.j. list musi byt prazdny )?
            vyhral1 = True
        else:
            vyhral1 = False #ak je aspon v jednom riadku nejaka duplicita, netreba ist dalej
            break

        if not listStlpec:
            vyhral2 = True
        else:
            vyhral2 = False
            break

    return vyhral1 and vyhral2

Nahlásit jako SPAM
IP: 87.244.248.–
Happiness is when your code runs without error.
hanpari0
Stálý člen
16. 7. 2015   #2
-
0
-

Co je thismodule.plocha?

Nahlásit jako SPAM
IP: 178.72.234.–
Task13370
Newbie
16. 7. 2015   #3
-
0
-

#2 hanpari
thismodule.plocha označuje používanie premennej "plocha" ako globálnej premennej. Podľa ľudí z ďalekých končín internetu to má výhody pred použitím klasickej deklarácie cez keyword "global", avšak moja znalosť jazyka a konceptov nesiaha tak vysoko, aby som ti dokázal povedať prečo. Používam to preto, lebo scopy v Pythone mi prídu veľmi divné a keď mením obsah premennej vo viacerých funkciách tak ma to nikdy nemá rado a robí neplechu. Inak táto premenná sama o sebe v mojom programe je list, ktorý obsahuje 81 položiek, kde sú uložené hodnoty všetkých čísel na ploche a od tadiaľ sa správne naformátované zobrazujú.

Nahlásit jako SPAM
IP: 87.244.248.–
Happiness is when your code runs without error.
hanpari0
Stálý člen
16. 7. 2015   #4
-
0
-

#3 Task1337

Globální proměnné nepoužívej, ušetříš si spoustu starostí.

Jinak můžeš pro reprezentaci sudoku použít slovník:

from itertools import product
r9 = range(1,10)

sudoku = {(x,y): None for x,y in product(r9, r9)}

print(sudoku)
Nahlásit jako SPAM
IP: 178.72.234.–
Task13370
Newbie
16. 7. 2015   #5
-
0
-

#4 hanpari
Zatiaľ sa python ešte len učím používať, takže obetujem špinavý kód na úkor funkčnosti. Ako hovorím, scopy mi robia dosť problém, som zvyknutý na C++sovksé a tu je princíp iný. Takže niektoré premenné špinavo nastavujem na globálne. Viem ale, že to nie je dobrá programátorská praktika.

Nahlásit jako SPAM
IP: 87.244.248.–
Happiness is when your code runs without error.
hanpari0
Stálý člen
16. 7. 2015   #6
-
0
-

#5 Task1337
Chápu,

v každém případě jsem ti doporučil si pro sudoku udělat slovník. Jeho klíči jsou souřadnice jako tuple (x,y)

Slovník jsem vytvořil pomocí slovníkové komprehenze a jako výchozí jsem dal hodnotu None, tedy nic.

Hodnotu můžeš zadat pomocí:

sudoku[(1,2)] = 10

Pokud se pokusíš zadat neexistující souřadnice, dostaneš tuším IndexError

r9 = range(1,10) je uložená posloupnost od 1 - 9.

POkud si ji chceš prohlédnout, musíš si ji rozbalit, například takto: tuple(r9)

product je například toto:

>>> list(product("ab", "xyz"))
[('a', 'x'), ('a', 'y'), ('a', 'z'), ('b', 'x'), ('b', 'y'), ('b', 'z')]

V našem případě ti to vytvoří 81 uspořádaných dvojici od 1,1 do 9,9

Nahlásit jako SPAM
IP: 178.72.234.–
Task13370
Newbie
16. 7. 2015   #7
-
+1
-
Zajímavé

#6 hanpari
Ďakujem, pokúsim sa to v budúcnosti implementovať, teraz som celkom spokojný s indexovaním cez 1D list. ( Zvyk z C++ ). Avšak aj tak moja prvotná otázka na toto fórum je iná. :)

Nahlásit jako SPAM
IP: 87.244.248.–
Happiness is when your code runs without error.
hanpari0
Stálý člen
17. 7. 2015   #8
-
0
-

#7 Task1337

som otvorený prípadným zlepšeniam a návrhom.

Nahlásit jako SPAM
IP: 195.5.186.–
qwertys0
Newbie
17. 7. 2015   #9
-
0
-

Myslim si ze se ten algoritmus da o neco vylepsit .. 
predevsim bych tedy jak uz bylo receno pouzival prednostne 2d pole (jako slovnik )

nicmene mas tam 2x loop jeden na radek a jeden na sloupec .. 
podle me by bylo lepsi mit jeden loop ve kterem bys nevyrazoval cisla z pole ale naopak zapisoval cisla do pole 
nasledne bys mel nejakou metodu na kontrolu jeslti v poli jsou cisla 1-9 
usetris tak program o jeden loop

protoze vis ze kazdy radek a kazdy sloupec ma prave 9 pozic

mas tam pak 2x if na kontrolu vyhry podle me zbytecnost stacil by jeden vzhledem k tomu ze mezi nimi je AND takze usetris dalsich par radku 

odpoved na tvoji otazku: 
kontrola v bunkach nemusi byt vyhazujes cisla z pole kde je 1-9 jak ve sloupci tak v radku 
tzn. nenaberes tam zadny bordel neco jako ze bys tam mel devet petek ktery daji stejny soucet.. metoda ti bude vracet spravny vysledek :)

Nahlásit jako SPAM
IP: 46.228.20.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 3 hosté

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý