En dessous de 17 révélés tous les problèmes ont plusieurs solutions
Boris
Je voudrais commencer la journée en saluant chaleureusement
celui qui dans l'ombre corrige mes messages pour les mettre en français
Merci à toi
Boris
Version imprimable
En dessous de 17 révélés tous les problèmes ont plusieurs solutions
Boris
Je voudrais commencer la journée en saluant chaleureusement
celui qui dans l'ombre corrige mes messages pour les mettre en français
Merci à toi
Boris
Nous avons la un problème de définition:
Pour aller plus loin dans ta grille on va utiliser la méthode de 'couleurs"
c'est a dire une méthode d'hypothèses parfaitement maitrisée. Et donc doit-on considère que la méthode des couleurs est une méthode logiue
ou une méthode Brute force
En réalité les soldeurs par restriction ou contrainte (essai de tous les candidats possibles) utilisent la méthode des couleurs
En fait toutes les problemes sont solubles en n'utilisant que les couleurs
car couleur = hypothèse
Boris
C'est rapide, mais je vous donne directement la simplification ! L'énoncé a beaucoup moins de valeurs.
Haha, je m'en doutais ! Pourtant je pense que c'est possible sans :D (toujours la meme chose) !
Je dirais, une méthode logique avec hypothese ;) ! Je connaissais déja cette technique, ce n'est rien d'autre que des techniques que nous appliquons déja en vrai. C'est juste pour aller plus vite a l'écrit. Mais, pour l'instant, je code autre chose
Bon sinon, je viens de me faire une petite fonction récursive qui me trouve les candidats doubles, triples, ..., octuples 8O !!
Tout à fait, d'accord, pour le moment, je n'ai bossé que 4 heures sur mon Sudoku Solver, la 1er Algo de résolution des grilles faciles et moyennes fut rapidement au point, maintenant, je n'avance plus ... j'ai un algo en tête, mais il ne veut pas sortir, faut que je le couche sur le papier ... avant de penser à la performance, je m'interesse juste à sa réussite et cela risque d'être long car j'ai enfin un peu de temps pour tester D2009 (Trial), et migrer les 1ers éléments de la lib interne de mon employeur, enfin un taf interessant !
J'essayerais quand même d'avancer mon sudoku ... qui lui restera en D6 :mouarf:
Je suis d'accord avec ta démarche : d'abord la méthode bien formalisée et ensuite le code, et ensuite l'optimisation.
Il faut savoir que je n'ai fait aucun effort d'optimisation de mon code. A l'époque, quand j'ai vu que l'application mettait 1 milliseconde pour la plupart des grilles avec un 20ms pour AI Escargot, je n'ai même pas cherché à aller plus loin, parce que c'est suffisant, en tant qu'utilisateur, je ne verrai pas la différence entre ça et 1 pico seconde.
Ensuite, une fois que l'algo est rôdé et que l'appli marche bien, je peux toujours m'amuser à gratter des micro-secondes, ce qui constitue une discipline en soi tout à fait consistante.
Celui qui gagnera le concours de vitesse au final est celui qui aura la meilleur méthode, car une fois optimisée en term de code, elle sera imbattable à mon avis.
On pourrait faire un concours d'optimisation en partant tous du même code, mais ceci ferait l'objet d'un autre défi.
Ps : ton code en D6 est compilable directement en 2009 à mon avis.
ShaiLeTroll > Je viens de trouver un truc super : C'est que tu peux resoudre plein de grilles diaboliques avec UNE SEULE fonction.
Est ce que tu as déja entendu parler des candidats Doubles, triples, quadruples, et des paires cachées, triplets cachés, ... (j'imagine que oui) Ben, sur une zone donnée, si il y a 5 cases vides, rechercher une paire cachée, c'est comme rechercher des candidats triples.
En fait, pour une ligne a X cases vides, rechercher un ensemble Nieme caché, c'est comme rechercher des candidats (X-N)ieme
Donc, si tu arrives a coder une fonction (récursive :ccool:) qui recherche des candidats Nieme, tu resoud en meme temps les ensembles cachés, et tu pourras résoudre plein de grilles diaboliques. (ensuite, faut l'optimiser, parce que niveau vitesse, ...)
Le code est compatible a une donnée pret:
avec D2009 les strings sont en Unicode: chaque caractère est codeé sur 16 bits
Toutes les array of char (comme les string) doivent etrte remplacés par de array of byte si tu as besoin de conserver une taille de 8
Les delete et autre fillchar réservent quelques surprises.
A part cela le code marche bien
Si tu fais par exemple
cela ne compile pas.Code:
1
2 Inc(byte(Monhstring[8])):
Il fait définir mon string: array of byte et non string
C'est parfois un gros boulot
Boris
[EDIT]
Quelqu'un aurait-il des routines rusées pour inverser ou
pivoter de 90° une matrice: faire que les colonnes
deviennent rangées?
Merci
[\EDIT]
Bonjour
Je pars en juillet :P et je serai chargé en Aout coté boulot:oops:.
Alors, j'ai adressé ma solution a Felix.
Je passerai ici entre 2;
Pour moi , les dès sont jetés.
Bonne chance à tous. :ccool:
Pascal
Merci Anapurna mais ton code (efficace) c'est la methode traditionnelle
je cherche si nos matheux n'ont pas imaginer des cosinus de Log...
Pour les couleurs et hypothèses cela n'a rien a voir avec la methode
des graphes : il y a un problème de vocabulaire. On ne parle pas de la meme chose!
Si cela intéresse j'ai écrit une petite routine qui 'tasse' les grilles
On fait remonter les zéros et on garde le rang du révéléCode:
1
2
3
4
5
6
7
8
9
10 931804075 090045780 800900450 475182369 000000070 030804780 891945455 475182369
Boris
Felix a ecrit
Oups.... je corrige immédiatement.Citation:
Arg ! Pascal, tu as utilisé le TPageExtControl, c'est un composant additionel, c'est interdit par le règlement, et de plus, je ne peux pas compiler ton code...
Remet un TPageControl...vite...
Pascal
pour faire des tests rapide assembleur est inevitable il faut utiliser les bits d'un entier
initializationCode:
1
2
3
4
5
6 var lignes :array[0..8] of integer; colonnes:array[0..8] of integer; subTabs :array[0..8] of integer; sudoku :array[0..80] of array[0..80] of integer;
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 for i:=0 to 8 do begin lignes [i]:=511; colonnes[i]:=511; subTabs [i]:=511; end; for i:=0 to 8 do for j:=0 to 8 do begin b:= (j div 3)+((i div 3)*3); if(sudoku[j,i]<>0) then begin ExcludeBit(lignes[i],sudoku[j,i]); ExcludeBit(subTabs[b],sudoku[j,i]); end ; if(sudoku[i,j]<>0) then ExcludeBit(colonnes[i],sudoku[i,j]); end ; ...
fonctions assembleur
fonction de test pascalCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 //bit a zéro procedure ExcludeBit(var Bits:integer;Index: Integer);register; asm DEC EDX BTR [EAX],EDX end; //premier bit a 1 function Firstidx(value:integer):integer; register; asm BSF EAX,EAX JZ @exit INC EAX RET @exit: end; //test si un bit est a 1 function _in(A,b : integer) : boolean ; register; asm DEC EDX BT EAX,EDX SETC AL end ;
j'espere que le code ne sera pas supprimerCode:
1
2
3
4
5
6
7
8
9
10
11 //premier occurence function PremierOc(c,r,s:integer):integer; begin result:= Firstidx(lignes[r] and colonnes[c] and subTabs[s]); end; //Intersection function Intersec(c,r,s:integer):integer; begin result:= lignes[r] and colonnes[c] and subTabs[s]; end;
salut
genre un modulo 3 pour eviter de faire les 81 cases
fait une recherche sur "Sudoku Squares and Chromatic Polynomials"
tu comprendra peut etre la relation entre les couleurs ,les graphes et le sudoku
ta matrice résultante n'est pas exact tu as perdu le premier 9
sinon il y as une possibilité d'utilisation des matrice appelée
"Diagonally Distinct Sudoku Squares"
il faut que je verifie quelque petit truc mais cela parait prometteur
@+ Phil
comme ca tu perds quelques us;)
Merci Mentor c'est exactement se que je cherchais: un autre algo
L' exemple pour la matrice je l'ai tapé a l'écran et j'ai defait
oublié un neuf
Promis elle fonctionne (si on en a besoin)
Merci
Boris (je me suis fait expliqué combien ca representait une
pico secondes :je confondais avec un picon....:lol:)
Salut a tous ! :D
Je me posais la question sur l'utilité du X-Wing ... est ce que quelqu'un aurait sous la souris une grille complete ou il existerai un X Wing ? Toutes celles que j'ai (et j'en ai) n'en ont pas !
Merci :mrgreen: !
Edit : a c'est bon, j'en ai trouvé une !!
Bon, va falloir coder ;) !
voici une procedure qui permet de recuperer la vitesse de cpu ca peut etre utile pour toi:mouarf:
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 const ID_BIT=$200000; // EFLAGS ID bit function GetCPUSpeed: Double; const DelayTime = 500; var TimerHi, TimerLo: DWORD; PriorityClass, Priority: Integer; begin try PriorityClass := GetPriorityClass(GetCurrentProcess); Priority := GetThreadPriority(GetCurrentThread); SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS); SetThreadPriority(GetCurrentThread,THREAD_PRIORITY_TIME_CRITICAL); Sleep(10); asm dw 310Fh // rdtsc mov TimerLo, eax mov TimerHi, edx end; Sleep(DelayTime); asm dw 310Fh // rdtsc sub eax, TimerLo sbb edx, TimerHi mov TimerLo, eax mov TimerHi, edx end; SetThreadPriority(GetCurrentThread, Priority); SetPriorityClass(GetCurrentProcess, PriorityClass); Result := TimerLo / (1000.0 * DelayTime); except end; end; procedure TForm1.Button1Click(Sender: TObject); var cpuspeed:string; begin cpuspeed:=Format('%f MHz', [GetCPUSpeed]); edit1.text := cpuspeed; end;
Sur ce site, il existe des grilles avec des exemples 'x-wings' etc...
http://www.mots-croises.ch/Manuels/Sudoku/
Pascal
Tu fais quoi dans la vraie vie: prédicateur de branchements?Citation:
Un bon programmeur n'utilise pas trop de "IF" ça brise la linéarité de l'automation
J'y vais moi aussi de ma routine ASM (dont je ne suis pas l'auteurr)
Comme son nom l'indique elle initialise une zone mémoire avec une vcaleur sur 32 bits. Par définition 4 fois plus rapide qu'un fillchar..Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 procedure FillMem32(var Buff; Size: Cardinal; Value: Cardinal); asm { ->EAX Pointer to destination } { EDX count } { ECX value } PUSH EDI PUSH ESI MOV EDI,EAX MOV EAX, ECX MOV ECX,EDX SAR ECX,2 JS @@exit REP STOSD MOV ECX,EDX AND ECX,3 JZ @@exit STOSB DEC ECX JZ @@exit SHR EAX, 8 STOSB DEC ECX JZ @@exit SHR EAX, 8 STOSB @@exit: POP ESI POP EDI end;
Pour initialiser lignes,colonnes...
elle accepte les longueurs qui ne sont pas modulo 8
Size est le nombre de byte pas d'int64
Boris
effectivement c'est impossible mais si un jour quelqu'un arrive à linéariser les grilles tu peux utiliser la recherche dichotomique.Citation:
Envoyé par FullSpeed
cest terminer pour moi bonne chance
mon code a trebucher sur ces grilles
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 000 000 000 000 390 280 040 021 093 600 070 900 900 502 006 005 060 001 180 250 030 064 018 000 000 000 000 100 007 090 030 020 008 009 600 500 005 300 900 010 080 002 600 004 000 300 000 010 040 000 007 007 000 300
mick tu dois integrer plisieus solveurs si tu veux gagner
je viens de trouver sur un jeu :
Pair
Triple
X wing
Swordfish
Multi
SolveByCell
SolveBySingleCan
SolveByLockedCan
SolveByRepeatCan
SolveByFishCan
SolveByMultiColor
SolveByLogic
bonne chance a vous tous
Mon solveur résoud la premiere sans utiliser toutes ses techniques ...
Quand a la deuxieme, ca m'aurait (agréablement) étonné qu'un solveur logique la résolve ... c'est AI Escargot !!
Quelles sont les techniques qui ont des points d'interrogation ??
Qu'entends tu par plusieurs solvers ?? Plusieurs techniques de résolution ? Si c'est cela, oui, c'est le cas ;) !!
Mick je te conseille ce logiciel
http://pgailhac.free.fr/index.html
Il utilise un certain nombre de techniques et a surtout des exemples de chaque .
Boris
cool ce défi.
on peut faire un solver avec un algorithme génétique ou c'est la vitesse à tout prix?
Non, ce n'est pas la vitesse qui compte ... (enfin, on veut la réponse dans l'heure ^^ :D )
Tu peux faire n'importe quel algo, et c'est meme le bienvenu ! Ca ne sera pas interressant si tout le monde a un brute force !
Bonne chance ;)
Je confirme, ceci n'est pas un benchmark pour microprocesseurs ou un concours d'assembleur mais bien défi Delphi (= un jeu) dont les règles ont été clairement définies dès le départ.
Donc il est ouvert à tous, et toutes les idées sont les bienvenues.
Amusez vous bien :ccool:
L'ASM fait partie de Delphi. On peut donc a priori s'en servir?
J'utilise une seule routine ASM de (3) trois instructions.(usage REP)
C'est permis?
Boris
Cela apporte seulement si cela a besoin accéder a des techno non disponibles dans le langage Par exemple si tu veux utiliser le MMX ou les capacités SSE2 tu es obligé de passer en ASM. Mais pour faire un inttostr ou un Pos on peut aller plus vite en ASM mais c'est tellement plus agréable d'utiliser la RTL ou al:ors dans des optiques de vitesse pure ou les compilateurs sont generiques et ne savent pas se montrer astucieux comme un humain qui verra la particularité de la situation.
C'est pour cela que je dis pourquoi j'utilise de l'ASM je ne sais pas comment faire un xchange et un REP en Pascal.
Je pense avoir trouver une fonctionnalité sympa pour les juges.J'espère qu'ils aimeront! Tu t'en sors de ton solveur logique?. Moi je sais que c'était pas la programmation des méthodes qui m'avaient arrêté mais leur enchainement pour faire un produit complet
Bon je retourne à mon code
Boris