Allereerst: excuses voor de bijzonder slechte titel, maar ik weet geen betere.
Momenteel ben ik een sudoku solver aan het schrijven in ruby, en hiervoor heb ik een array van arrays (waar je normaal een 2d array zou pakken ) gedefinieerd:
Square is een klasse die netjes die 2d array opslaat.
Nu heb ik een functie geschreven die vanuit elke sudoku (op die met allemaal 9's na...) de volgende sudoku generereert. Dit doet hij door het getal linksboven met 1 te verhogen. Wordt dat getal dan 10, dan moet het getal ernaast met 1 worden verhoogd.
Hiervoor flatten ik die 2d array, zodat het lekker makkelijk gaat.
Dit werkt prima, maar als ik meer dan 9 9's achter elkaar heb schiet plotseling de waarde op positie 11 (als 1-9 de 9's zijn) op 11. Gevolg is dus dat ik denk dat mijn lus dan teveel optelt, ik zit er echter al de halve avond op en zie niet waar het fout gaat.
Hier zien we een voorbeeld (van een flattend versie ) van de array waar het misgaat:
We zien dus dat het best goed misgaat in dit geval (overige gevallen werken goed), bij gebruik van deze code:
Het is mijn eerste ruby-progsel dus ik verwacht een dom stom foutje ergens ,maar heb geen idee waar.
Mijn idee is dat de increments allemaal over de 10e positie komen , die dan 10 wordt waardoor de 11e positie 11 wordt. Snap alleen niet waarom dit niet wordt opgevangen door mijn lus.
Kan iemand me een zetje geven?
Momenteel ben ik een sudoku solver aan het schrijven in ruby, en hiervoor heb ik een array van arrays (waar je normaal een 2d array zou pakken ) gedefinieerd:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| r0 = Array[9,9,9,9,9,9,9,9,9] r1 = Array[1,1,1,2,2,2,7,8,9] r2 = Array[1,1,1,2,2,2,7,8,9] r3 = Array[1,2,3,4,5,6,7,8,9] r4 = Array[1,2,3,4,5,6,7,8,9] r5 = Array[1,2,3,4,5,6,7,8,9] r6 = Array[1,2,3,4,5,6,7,8,9] r7 = Array[1,2,3,4,5,6,7,8,9] r8 = Array[1,2,3,4,5,6,7,8,9] rX = Array[r0,r1,r2,r3,r4,r5,r6,r7,r8] sq = Square.new(rX) sq.increment |
Square is een klasse die netjes die 2d array opslaat.
Nu heb ik een functie geschreven die vanuit elke sudoku (op die met allemaal 9's na...) de volgende sudoku generereert. Dit doet hij door het getal linksboven met 1 te verhogen. Wordt dat getal dan 10, dan moet het getal ernaast met 1 worden verhoogd.
Hiervoor flatten ik die 2d array, zodat het lekker makkelijk gaat.
Dit werkt prima, maar als ik meer dan 9 9's achter elkaar heb schiet plotseling de waarde op positie 11 (als 1-9 de 9's zijn) op 11. Gevolg is dus dat ik denk dat mijn lus dan teveel optelt, ik zit er echter al de halve avond op en zie niet waar het fout gaat.
Hier zien we een voorbeeld (van een flattend versie ) van de array waar het misgaat:
code:
1
2
| 9,9,9,9,9,9,9,9,9,1,1,1,2,2,2,7,8,9,1,1,1,2,2,2,7,8,9,1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9 1,1,1,1,1,1,1,1,1,1,11,9,9,9,9,9,9,9,9,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,7,7,7,7,8,8,8,8,9,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,7,7,7,7,7,7,8,9,9,9,9,9,1,1,2,3,3,3,3,3,4,4 |
We zien dus dat het best goed misgaat in dit geval (overige gevallen werken goed), bij gebruik van deze code:
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
| def increment @fields[0][0]=@fields[0][0]+1 #als we ergens een 10 hebben staan moet het veld erna worden geupdate flatFields= @fields.flatten while (@fields.flatten.index(10) != nil) do #jaja die flatFields.index(10) kan mooi in een var... idx=flatFields.index(10) flatFields[idx]=1 flatFields[idx+1] = flatFields[idx+1]+1 #controleren op eindconditie, dit treedt alleen op als de sudoku unsolveable is if (flatFields.sort() == flatFields && flatFields[0].sort()== 9) return false end for i in (0..SudokuSize) @fields[i]=flatFields.slice((i*SudokuSize),SudokuSize+1) end flatFields=@fields.flatten end puts flatFields * "," return true end |
Het is mijn eerste ruby-progsel dus ik verwacht een dom stom foutje ergens ,maar heb geen idee waar.
Mijn idee is dat de increments allemaal over de 10e positie komen , die dan 10 wordt waardoor de 11e positie 11 wordt. Snap alleen niet waarom dit niet wordt opgevangen door mijn lus.
Kan iemand me een zetje geven?