Accueil Ti-Gen Foire Aux Questions Chat sur le chan #tigcc sur IRC
Liste des membres Rechercher Aide
Bienvenue Invité !   Se connecter             Mes sujets   
Administrer
0 membre(s) et 1 visiteur(s) actif(s) durant les 5 dernières minutes Utilisateurs actifs : Aucun membre + 1 visiteur
Avant de poster sur le forum, il y a des régles de bases à respecter pour une bonne entente et un respect de tous.
Veuillez lire la charte du forum.
  :: Index » GFA-Basic TI68K » Sources et exemples » Su doku en GFA (9 réponse(s))
./POST DE DEPART (post n°0)   Marquer comme non lu.
Mortarion Ecrit le: Jeudi 20 octobre 2005 à 12:55 Déconnecté(e)    Voir le profil de Mortarion Envoyer un email à Mortarion Envoyer un message privé à Mortarion  

Alors voila j'ai réalisé en gfa un programme qui permet de résoudre les grilles de Sudoku
Il marche mais je crois qu'il peut etre amélioré. Si vous avez des idées ... :)


 :'*******Debut prg******
 :Cls
 :I=5
 :Do
 : I=I+10
 : Box 5,5,I,I
 : Box 95,95,I,I
 : Exit If I=95
 :Loop
 :Box 95,95,5,5
 :Box 4,4,96,96
 :Line 5,34,95,34
 :Line 5,64,95,64
 :Line 34,5,34,95
 :Line 64,5,64,95
 :
 :'******Memo ecran******
 :Get 0,0,159,99,Screen$
 :
 :'******Virtuelles******
 :Dim Xx(9),Yy(9)
 :Dim Grille(9,9)
 :Dim Virtu1(9,9)
 :Dim Virtu2(9,9)
 :Dim Virtu3(9,9)
 :Dim Virtu4(9,9)
 :Dim Virtu5(9,9)
 :Dim Virtu6(9,9)
 :Dim Virtu7(9,9)
 :Dim Virtu8(9,9)
 :Dim Virtu9(9,9)
 :Dim Virtu(9,9)
 :Dim Resu(9,9)
 :
 :'******Cache noir******
 :Cache$=Mki$(0)+Mki$(0)+Mki$(&H0009)
 :For I=1 To 9
 : Read Data
 : Cache$=Cache$+Mki$(Data)
 :Next I
 :Data 65408,65408,65408,65408,65408,65408,65408,65408,65408
 :
 :'*******Donnees********
 :X=6
 :Y=6
 :C=-1
 :Setfont F_4X6
 :Repeat
 : Pause 1
 : Sprite Cache$,X,Y,1
 : C=-C
 : If RR_RIGHT And X<86 And C=-1 Then
 :  X=X+10
 : Elseif RR_LEFT And X>6 And C=-1 Then
 :  X=X-10
 : Elseif RR_UP And Y>6 And C=-1 Then
 :  Y=Y-10
 : Elseif RR_DOWN And Y<86 And C=-1 Then
 :  Y=Y+10
 : ElseIf RR_CLEAR And C=-1 Then
 :   Grille((X+4)/10,(Y+4)/10)=0
 :  Sprite Cache$,X,Y,0 
 :  Sprite Cache$,X,Y,1
 : Elseif RR_ESC Then
 :  @Paus.exe()
 : Elseif RR_1 And C=ª1 Then
 :  @Regle.exe(1)
 : Elseif RR_2 And C=ª1 Then
 :  @Regle.exe(2)
 : Elseif RR_3 And C=ª1 Then
 :  @Regle.exe(3)
 : Elseif RR_4 And C=ª1 Then
 :  @Regle.exe(4)
 : Elseif RR_5 And C=ª1 Then
 :  @Regle.exe(5)
 : Elseif RR_6 And C=ª1 Then
 :  @Regle.exe(6)
 : Elseif RR_7 And C=ª1 Then
 :  @Regle.exe(7)
 : Elseif RR_8 And C=ª1 Then
 :  @Regle.exe(8)
 : Elseif RR_9 And C=ª1 Then
 :  @Regle.exe(9)
 : Endif
 :Until RR_ENTER And C=-1
 :
 :Print At(28,1);"Processing..."
 :
 :'******Var Reflex******
 :Meth1=0
 :
 :'******Affichage*******
 :Cls
 :Put 0,0,Screen$
 :For A=1 To 9
 : For B=1 To 9
 :  If Grille(A,B)?0 Then
 :   Text A*10-3,B*10-3,Str$(Grille(A,B))
 :  EndIf
 : Next B
 :Next A
 :'*******Timer**********
 :Tim=Timer()
 :
 :'*******Boucle*********
 :Repeat
 : No1=0
 : No2=0
 : No3=0
 : No4=0
 : No5=0
 : No6=0
 : No7=0
 : No8=0
 : No9=0
 : @Cherche.exe()
 :Until RR_ESC
 :
 :'*******Reflexion******
 :Procedure Reflex.exe()
 :For A=1 To 9
 : Noz=0
 : Noz2=0
 : Tot=0
 : Tot2=0
 : X1=0
 : X2=0
 : Y1=0
 : Y2=0
 : For B=1 To 9
 :  Tot=Tot+Grille(A,B)
 :  Tot2=Tot2+Grille(B,A)
 :  If Grille(A,B)=0 Then
 :   Inc Noz
 :   X1=A
 :   Y1=B
 :  EndIf
 :  If Grille(B,A)=0 Then
 :   Inc Noz2
 :   X2=B
 :   Y2=A
 :  EndIf
 : Next B
 : If Noz=1 Then
 :  Kiki=45-Tot
 :  Grille(X1,Y1)=Kiki
 :  Text X1*10-3,Y1*10-3,Str$(Kiki)  
 :  Meth1=0
 : EndIf
 : If Noz2=1 Then
 :  Kiki=45-Tot2
 :  Grille(X2,Y2)=Kiki
 :  Meth1=0
 :  Text X2*10-3,Y2*10-3,Str$(Kiki)
 : EndIf
 :Next A
 :Return
 :
 :'********Pause*********
 :Procedure Paus.exe()
 : Pause 15
 :Print At(30,12);"Pause"
 :Print At(30,14);Tim
 : Repeat
 : Until RR_ESC
 : Stop
 :Return
 :
 :'*******Procedure******
 :Procedure Cherche.exe()
 :For X=1 To 9
 : For Y=1 To 9
 :  Help=Grille(X,Y)
 :  If Help=1 Then
 :   Inc No1
 :   For O=1 To 9
 :    Virtu1(X,O)=1
 :    Virtu1(O,Y)=1
 :   Next O
 :   For O=1 To 3
 :    For U=1 To 3
 :     Virtu1(U+Int(X/(31/10))*3,O+Int(Y/(31/10))*3)=1
 :    Next U
 :   Next O
 :  Elseif Help=2 Then
 :   Inc No2
 :   For O=1 To 9
 :    Virtu2(X,O)=1
 :    Virtu2(O,Y)=1
 :   Next O
 :   For O=1 To 3
 :    For U=1 To 3
 :     Virtu2(U+Int(X/(31/10))*3,O+Int(Y/(31/10))*3)=1
 :    Next U
 :   Next O
 :  Elseif Help=3 Then
 :   Inc No3
 :   For O=1 To 9
 :    Virtu3(X,O)=1
 :    Virtu3(O,Y)=1
 :   Next O
 :   For O=1 To 3
 :    For U=1 To 3
 :     Virtu3(U+Int(X/(31/10))*3,O+Int(Y/(31/10))*3)=1
 :    Next U
 :   Next O
 :  Elseif Help=4 Then
 :   Inc No4
 :   For O=1 To 9
 :    Virtu4(X,O)=1
 :    Virtu4(O,Y)=1
 :   Next O
 :   For O=1 To 3
 :    For U=1 To 3
 :     Virtu4(U+Int(X/(31/10))*3,O+Int(Y/(31/10))*3)=1
 :    Next U
 :   Next O
 :  Elseif Help=5 Then
 :   Inc No5
 :   For O=1 To 9
 :    Virtu5(X,O)=1
 :    Virtu5(O,Y)=1
 :   Next O
 :   For O=1 To 3
 :    For U=1 To 3
 :     Virtu5(U+Int(X/(31/10))*3,O+Int(Y/(31/10))*3)=1
 :    Next U
 :   Next O
 :  Elseif Help=6 Then
 :   Inc No6
 :   For O=1 To 9
 :    Virtu6(X,O)=1
 :    Virtu6(O,Y)=1
 :   Next O
 :   For O=1 To 3
 :    For U=1 To 3
 :     Virtu6(U+Int(X/(31/10))*3,O+Int(Y/(31/10))*3)=1
 :    Next U
 :   Next O
 :  Elseif Help=7 Then
 :   Inc No7
 :   For O=1 To 9
 :    Virtu7(X,O)=1
 :    Virtu7(O,Y)=1
 :   Next O
 :   For O=1 To 3
 :    For U=1 To 3
 :     Virtu7(U+Int(X/(31/10))*3,O+Int(Y/(31/10))*3)=1
 :    Next U
 :   Next O
 :  Elseif Help=8 Then
 :   Inc No8
 :   For O=1 To 9
 :    Virtu8(X,O)=1
 :    Virtu8(O,Y)=1
 :   Next O
 :   For O=1 To 3
 :    For U=1 To 3
 :     Virtu8(U+Int(X/(31/10))*3,O+Int(Y/(31/10))*3)=1
 :    Next U
 :   Next O
 :  Elseif Help=9 Then
 :   Inc No9
 :   For O=1 To 9
 :    Virtu9(X,O)=1
 :    Virtu9(O,Y)=1
 :   Next O
 :   For O=1 To 3
 :    For U=1 To 3
 :     Virtu9(U+Int(X/(31/10))*3,O+Int(Y/(31/10))*3)=1
 :    Next U
 :   Next O
 :  Endif
 : Next Y
 :Next X
 :
 :'******Pourcentage*****
 :Som2=Somme
 :Somme=No1+No2+No3+No4+No5+No6+No7+No8+No9
 :Text 110,50,"Place:"
 :Sprite Cache$,143,48,0
 :Sprite Cache$,143,48,1
 :Text 145,50,Str$(Somme)
 :If Somme=81 Then
 : @Paus.exe()
 :ElseIf Somme=Som2 And Meth1=0 Then
 : Meth1=1
 : @Reflex.exe()
 :ElseIf Somme=Som2 And Meth1=1 Then
 : @Paus.exe()
 :EndIf
 :
 :'******Remplissage*****
 :For H=1 To 9
 : If H=1 Then
 :  Noo=No1
 :  For A=1 To 9
 :  For B=1 To 9  
 : Virtu(A,B)=Virtu1(A,B)
 :  Next B
 :  Next A
 : Elseif H=2 Then
 :  Noo=No2
 :  For A=1 To 9
 :  For B=1 To 9  
 : Virtu(A,B)=Virtu2(A,B)
 :  Next B
 :  Next A
 : Elseif H=3 Then
 :  Noo=No3
 :  For A=1 To 9
 :  For B=1 To 9  
 : Virtu(A,B)=Virtu3(A,B)
 :  Next B
 :  Next A
 : Elseif H=4 Then
 :  Noo=No4
 :  For A=1 To 9
 :  For B=1 To 9  
 : Virtu(A,B)=Virtu4(A,B)
 :  Next B
 :  Next A
 : Elseif H=5 Then
 :  Noo=No5
 :  For A=1 To 9
 :  For B=1 To 9  
 : Virtu(A,B)=Virtu5(A,B)
 :  Next B
 :  Next A
 : Elseif H=6 Then
 :  Noo=No6
 :  For A=1 To 9
 :  For B=1 To 9  
 : Virtu(A,B)=Virtu6(A,B)
 :  Next B
 :  Next A
 : Elseif H=7 Then
 :  Noo=No7
 :  For A=1 To 9
 :  For B=1 To 9  
 : Virtu(A,B)=Virtu7(A,B)
 :  Next B
 :  Next A
 : Elseif H=8 Then
 :  Noo=No8
 :  For A=1 To 9
 :  For B=1 To 9  
 : Virtu(A,B)=Virtu8(A,B)
 :  Next B
 :  Next A
 : Elseif H=9 Then
 :  Noo=No9
 :  For A=1 To 9
 :  For B=1 To 9  
 : Virtu(A,B)=Virtu9(A,B)
 :  Next B
 :  Next A
 : Endif
 :
 : Print At(27,12);H
 :
 : If Noo=9 Then
 :  Continue
 : EndIf
 :
 :For A=1 To 9
 : For B=1 To 9
 :  Resu(A,B)=Virtu(A,B) Or Grille(A,B)
 : Next B
 :Next A
 :
 :For Ax=1 To 3
 : For Ay=1 To 3
 :  Noz=0
 :  Numx=1
 :  For X=1 To 3
 :  For Y=1 To 3
 :   If RR_ESC Then
 :    @Paus.exe()
 :   Endif
 :   If Resu(X+(Ax-1)*3,Y+(Ay-1)*3)=0 Then
 :    Inc Noz
 :    Xx(Numx)=X+(Ax-1)*3
 :    Yy(Numx)=Y+(Ay-1)*3
 :    Inc Numx
 :   Endif
 :  Next Y
 : Next X
 : If Noz=1 Then
 :  Grille(Xx(1),Yy(1))=H
 :  Text Xx(1)*10-3,Yy(1)*10-3,Str$(H)
 : Endif
 : Next Ay
 :Next Ax
 :Next H
 :Return
 :
 :'******Proc.Regle******
 :Procedure Regle.exe(nono)
 :Grille((X+4)/10,(Y+4)/10)=nono
 :Text X+1,Y+1,Str$(nono)
 :Return

[Édit : désactiver les smileys -Thepro-]
-Edité le Jeudi 20 octobre 2005 à 16:46 par Thepro-
    
./Post n°1   Marquer comme non lu.
geogeo Ecrit le: Jeudi 20 octobre 2005 à 15:52 Déconnecté(e)    Voir le profil de geogeo Envoyer un email à geogeo Visiter le site WEB de geogeo Envoyer un message privé à geogeo  


merci :) Car tu exploites beuacoups de choses de GFA.
Quand j'aurai du temps je te donnerais les trucs à modifier pour optimiser un peu tout ça.
Sinon il manque au début de ton code la première lettre des instructions genre Dim et Data.
Webmaster du site.
Programmeur sur TI68K. Arkanoid, Nebulus, GFA-Basic.

Plus d'informations sur GFA-Basic (un langage Basic pour TI68K).
http://www.tigen.org/gfabasic
    
./Post n°2   Marquer comme non lu.
RHJPP Ecrit le: Jeudi 20 octobre 2005 à 16:48 Déconnecté(e)    Voir le profil de RHJPP Envoyer un email à RHJPP Envoyer un message privé à RHJPP  


Les ":D" n'apparaissaient pas à cause du smiley.
    
./Post n°3   Marquer comme non lu.
geogeo Ecrit le: Jeudi 20 octobre 2005 à 17:53 Déconnecté(e)    Voir le profil de geogeo Envoyer un email à geogeo Visiter le site WEB de geogeo Envoyer un message privé à geogeo  


Bon la première optimisation que je vois c'est passer les variables numériques en entier avec le suffixe %.
De plus les additions de ce genre ce simplfies:
I=I+10 en Add I,10
I=I+1 en Inc I
I=I-1 en Dec I

En tout cas je suis content de voir un programme complet en GFA Basic est assez complexe. :)
Webmaster du site.
Programmeur sur TI68K. Arkanoid, Nebulus, GFA-Basic.

Plus d'informations sur GFA-Basic (un langage Basic pour TI68K).
http://www.tigen.org/gfabasic
    
./Post n°4   Marquer comme non lu.
Mortarion Ecrit le: Vendredi 21 octobre 2005 à 12:22 Déconnecté(e)    Voir le profil de Mortarion Envoyer un email à Mortarion Envoyer un message privé à Mortarion  

Le gain en vitesse entre I = I+10 et Add I,10 est il vraiment significatif ?

Sinon te réjoui pas trop vite en fait ce programme n'est pas fini il arrive pas a tout résoudre :(
    
./Post n°5   Marquer comme non lu.
geogeo Ecrit le: Vendredi 21 octobre 2005 à 15:57 Déconnecté(e)    Voir le profil de geogeo Envoyer un email à geogeo Visiter le site WEB de geogeo Envoyer un message privé à geogeo  


Le gain en vitesse entre I = I+10 et Add I,10 est il vraiment significatif ?


Oui assez mais le gain sera encore plus significatif (2.5x plus rapide) si tu passes toutes les variables qui le peuvent en entiers.
Donc faire ceci Add I%,10 pour ton exemple.
Webmaster du site.
Programmeur sur TI68K. Arkanoid, Nebulus, GFA-Basic.

Plus d'informations sur GFA-Basic (un langage Basic pour TI68K).
http://www.tigen.org/gfabasic
    
./Post n°6   Marquer comme non lu.
Mortarion Ecrit le: Jeudi 27 octobre 2005 à 15:18 Déconnecté(e)    Voir le profil de Mortarion Envoyer un email à Mortarion Envoyer un message privé à Mortarion  

J'ai tout remplacé par des entiers et le programme est 2.10 fois plus rapide #pcool#

Donc oui en effet le gain est significatif :)
    
./Post n°7   Marquer comme non lu.
Professeur Shadocko Ecrit le: Lundi 31 octobre 2005 à 17:11 Déconnecté(e)    Voir le profil de Professeur Shadocko Envoyer un email à Professeur Shadocko Envoyer un message privé à Professeur Shadocko  

Juste pour te remercier Mortarion, car j'ai une foi profonde en GFA Basic mais ni le temps (un peu) ni les compétences (surtout! :p) pour aider geo² (pourtant mon grand maître spirituel avec jf #dieu# ).

Donc voilà, un grand merci à toi :)
Pour qu'il y ait le moins de mécontents possible, il faut toujours taper sur les mêmes! (Devise shadock)
    
./Post n°8   Marquer comme non lu.
geogeo Ecrit le: Lundi 31 octobre 2005 à 22:26 Déconnecté(e)    Voir le profil de geogeo Envoyer un email à geogeo Visiter le site WEB de geogeo Envoyer un message privé à geogeo  


lol :)
Webmaster du site.
Programmeur sur TI68K. Arkanoid, Nebulus, GFA-Basic.

Plus d'informations sur GFA-Basic (un langage Basic pour TI68K).
http://www.tigen.org/gfabasic
    
./Post n°9   Marquer comme non lu.
Mortarion Ecrit le: Jeudi 3 novembre 2005 à 12:18 Déconnecté(e)    Voir le profil de Mortarion Envoyer un email à Mortarion Envoyer un message privé à Mortarion  

merci merci c tout naturel :D
    
  :: Index » GFA-Basic TI68K » Sources et exemples » Su doku en GFA (9 réponse(s))
Pages : 1/1     « [1] » »|

.Répondre à ce sujet
Les boutons de code
[B]old[I]talic[U]nderline[S]trikethrough[L]ine Flip Hori[Z]ontallyFlip [V]erticallySha[D]ow[G]low[S]poilerCode [G][C]ite
Bullet [L]istList Item [K] Link [H][E]mail[P]icture SmileysHelp
Couleurs :
Saisissez votre message
Activer les smileys
     

Forum de Ti-Gen v3.0 Copyright ©2004 by Geoffrey ANNEHEIM
Webmaster: Kevin KOFLER, Content Admins: list, Server Admins: Tyler CASSIDY and Kevin KOFLER, DNS Admin: squalyl
Page générée en 44.64ms avec 18 requetes