µit - März

  • @K1773R
    die Testroutine gibt sowohl in die Konsole, als auch in eine Msgbox aus.
    Allerdings gibt die Testroutine nichts aus, wenn von dir kein Sudokusolver ausgewählt wurde s. Zeilen 1-5. Dieser ist hier im Thread von den Teilnehmern downzuloaden und per #include einzubinden.
    ciao
    Andy

  • Zitat

    Er funktioniert schon, jedoch benötigt er 20 mal solange, wie eure Algos


    Ich befürchte, dass sich das rapide verbessert:thumbup:

    Zitat

    Das geht relativ problemlos und die Geschwindigkeit nimmt deutlich zu

    Bestimmt...

    Sollten wir uns ggf mal Gedanken über eine "Schnittstelle" innerhalb der Solver machen?
    So daß man auch "externe" Funktionen zum lösen einsetzen kann.
    irgendwie sowas:

    [autoit]

    func _Sudokulösefunktion_Y-WING(Array1,Array2,Array3,$wasweisdennich)
    eliminiere Möglichkeiten nach der y-wing-Methode und gib die Arrays usw zurück
    endfunc

    [/autoit]


    Dann könnte man mit mehreren Leuten an einem Projekt arbeiten und muss nicht immer das Rad neu erfinden.

  • Hallo,

    Zitat

    Damit wurden, genau wie bei den 20 Sudokus, in etwa ähnliche Ergebnisse von Blackmail, Eukalyptus und mir erzielt.

    Das ist nett gesagt. Ich kann aber auch (nicht ganz neidlos) zugeben, dass Eure Skripte eine ganze Ecke schneller sind, als meins.
    Ich habe mal von Andy und mir 5000 Sudokus rechnen lassen und bin auf dieses Ergebnis gekommen

    Code
    BlackMail:
    Ergebnis Zeit gesamt: 1594291.77618944 Zeit Durchschnitt: 318.858355237887
    
    
    Andy:
    Ergebnis Zeit gesamt: 1219127.23153361 Zeit Durchschnitt: 244.020662836992

    Das sind schon deutliche 30 % Unterschied!

    Ich find's gut, dass ihr weiter dran seid. Mich lässt das Thema auch noch nicht los.

    Versuche gerade herauszufinden, wo ich so viel Zeit verliere ...

    Zitat

    Blackmails Solver gibt bei einigen Sudokus immer denselben String zurück, der zwar eine Lösung ist (leeres sudoku ausgefüllt?), aber mit der richtigen Lösung nichts zu tun hat^^

    Das ist ja peinlich :whistling: . Hast du mal ein Beispiel, damit ich den Fehler suchen kann?

    Gruß BlackMail.

  • Hallo Blackmail,
    Schande über mich^^
    Dein Solver löst natürlich richtig, nur meine Brille war nicht geputzt 8) , wenn du mal bei uns in der Gegend bist, gibts zur Entschuldigung ne lecker Spätlese oder ein frisches Met oder Pils oder was auch immer^^
    Ich wurde nur darauf aufmerksam, dass sämtliche deiner Lösungen, die beim durchrechnen SEHR viel Zeit brauchten, alle mit 123456....anfingen, beim Vergleichen mit der "richtigen" Lösung bin ich dann um eine Zeile verrutscht...
    Mein "Prüfalgorithmus" checkt zzt. nämlich nur, ob die Sudokuregeln eingehalten wurden, d.h. ob in Zeile/Spalte/Box nur jeweils eine Ziffer genau einmal vorkommt, und prüft NOCH nicht, ob auch wirklich das ursprüngliche Sudoku gelöst wurde.
    ciao
    und haut rein!
    Andy

  • So, ich habe nun meinen Solver ziemlich überarbeitet.
    Ich verwende nun die Array-Variante, welche um einiges schneller arbeitet.
    Den Backtrack hab ich mir von Blackmail abgeschaut, jedoch mit kleinen Änderungen.
    Auch sonst sind viele Sachen von euren Solvern in dieses Script eingeflossen!

    Von den 48000 Sudokus (Link von Andy), konnte ich alle korrekt in knapp 220min lösen.

    GUI kommt erst später mal ;)

    viel Vergnügen!

    Spoiler anzeigen
    [autoit]

    Func _SolveSudoku($sSudoku)
    Local $aSudoku, $bSolved = False
    $aSudoku = _Sudoku_StringToArray($sSudoku)
    $aSudoku = _Sudoku_Solve($aSudoku, $bSolved)
    If Not $bSolved Then _Sudoku_BackTrack($aSudoku)
    $sSudoku = ""
    For $i = 0 To 80
    $sSudoku &= $aSudoku[$i][0]
    Next
    Return $sSudoku
    EndFunc ;==>_SolveSudoku

    [/autoit] [autoit][/autoit] [autoit]

    Func _Sudoku_BackTrack(ByRef $aSudoku, $iLevel = 0)
    Local $aSudoku_1, $iCell = _Sudoku_BackTrack_GetCell($aSudoku) ; Erste Zelle mit den wenigsten Möglichkeiten
    For $val = 1 To 9
    If Not $aSudoku[$iCell][$val] Then ContinueLoop ; Zahl ist nicht möglich, also nächste Zahl probieren
    $aSudoku_1 = $aSudoku ; Sicherung
    _Sudoku_SetCell($aSudoku, $iCell, $val) ; Zelle wird gesetzt
    If _Sudoku_BackTrack_Solve($aSudoku) Then Return True ; Falls Sudoku gelöst, dann aus der Rekursion aussteigen
    If _Sudoku_BackTrack($aSudoku, $iLevel + 1) Then Return True ; Rekursiv next level
    $aSudoku = $aSudoku_1 ; Original wiederherstellen, bevor nächste Zahl probiert wird
    Next
    Return False ; Wenn alle möglichen Zahlen der Zelle probiert wurden und kein Ergebnis erzielt wurde, dann ein Level zurück
    EndFunc ;==>_Sudoku_BackTrack

    [/autoit] [autoit][/autoit] [autoit]

    Func _Sudoku_BackTrack_Solve(ByRef $aSudoku)
    Local $aSudoku_1
    Do
    $aSudoku_1 = $aSudoku
    For $i = 0 To 8
    _Sudoku_Hidden_Single($aSudoku, _Sudoku_CellsOfRow($i))
    _Sudoku_Hidden_Single($aSudoku, _Sudoku_CellsOfCol($i))
    _Sudoku_Hidden_Single($aSudoku, _Sudoku_CellsOfBox($i))
    Next
    While _Sudoku_New_Singles($aSudoku)
    _Sudoku_Naked_Single($aSudoku)
    WEnd
    Until _Sudoku_Compare($aSudoku, $aSudoku_1)
    If _Sudoku_Is_Solved($aSudoku) Then Return True
    Return False
    EndFunc ;==>_Sudoku_BackTrack_Solve

    [/autoit] [autoit][/autoit] [autoit]

    Func _Sudoku_BackTrack_GetCell($aSudoku)
    Local $iCnt
    For $cnt = 0 To 9 ; die erste Zelle, die $cnt-viele Möglichkeiten besitzt, wird genommen; 0 & 1 könnte man eigentlich überspringen, aber manchmal gibts da einen Fehler !?!?!?
    For $cel = 0 To 80
    If $aSudoku[$cel][0] > 0 Then ContinueLoop
    $iCnt = 0
    For $val = 1 To 9
    If $aSudoku[$cel][$val] Then $iCnt += 1
    Next
    If $iCnt = $cnt Then Return $cel
    Next
    Next
    EndFunc ;==>_Sudoku_BackTrack_GetCell

    [/autoit] [autoit][/autoit] [autoit]

    Func _Sudoku_Solve($aSudoku, ByRef $bSolved)
    Local $aSudoku_1, $iMethode = 0
    Do
    $aSudoku_1 = $aSudoku
    If $iMethode = 0 Then
    _Sudoku_Naked_Single($aSudoku)
    If _Sudoku_Is_Solved($aSudoku) Then ExitLoop
    $iMethode = 1
    If _Sudoku_New_Singles($aSudoku) Then $iMethode = 0
    EndIf
    If $iMethode = 1 Then
    For $i = 0 To 8
    _Sudoku_Hidden_Single($aSudoku, _Sudoku_CellsOfRow($i))
    _Sudoku_Hidden_Single($aSudoku, _Sudoku_CellsOfCol($i))
    _Sudoku_Hidden_Single($aSudoku, _Sudoku_CellsOfBox($i))
    Next
    If _Sudoku_Is_Solved($aSudoku) Then ExitLoop
    $iMethode = 2
    If _Sudoku_New_Singles($aSudoku) Then $iMethode = 0
    EndIf
    If $iMethode = 2 Then
    For $i = 0 To 8
    _Sudoku_CandidatesOfRow($aSudoku, $i)
    _Sudoku_CandidatesOfCol($aSudoku, $i)
    _Sudoku_CandidatesOfBox($aSudoku, $i)
    Next
    $iMethode = 3
    If _Sudoku_New_Singles($aSudoku) Then $iMethode = 0
    EndIf
    If $iMethode = 3 Then
    For $i = 0 To 8
    _Sudoku_Naked_Multi($aSudoku, _Sudoku_CellsOfRow($i), 2)
    _Sudoku_Naked_Multi($aSudoku, _Sudoku_CellsOfCol($i), 2)
    _Sudoku_Naked_Multi($aSudoku, _Sudoku_CellsOfBox($i), 2)
    Next
    $iMethode = 4
    If _Sudoku_New_Singles($aSudoku) Then $iMethode = 0
    EndIf
    If $iMethode = 4 Then
    For $i = 0 To 8
    _Sudoku_Hidden_Multi($aSudoku, _Sudoku_CellsOfRow($i), 2)
    _Sudoku_Hidden_Multi($aSudoku, _Sudoku_CellsOfCol($i), 2)
    _Sudoku_Hidden_Multi($aSudoku, _Sudoku_CellsOfBox($i), 2)
    Next
    $iMethode = 0 ; Auf 5 setzen, wenn man auch triples suchen möchte
    If _Sudoku_New_Singles($aSudoku) Then $iMethode = 0
    EndIf
    If $iMethode = 5 Then
    For $i = 0 To 8
    _Sudoku_Naked_Multi($aSudoku, _Sudoku_CellsOfRow($i), 3)
    _Sudoku_Naked_Multi($aSudoku, _Sudoku_CellsOfCol($i), 3)
    _Sudoku_Naked_Multi($aSudoku, _Sudoku_CellsOfBox($i), 3)
    Next
    $iMethode = 6
    If _Sudoku_New_Singles($aSudoku) Then $iMethode = 0
    EndIf
    If $iMethode = 6 Then
    For $i = 0 To 8
    _Sudoku_Hidden_Multi($aSudoku, _Sudoku_CellsOfRow($i), 3)
    _Sudoku_Hidden_Multi($aSudoku, _Sudoku_CellsOfCol($i), 3)
    _Sudoku_Hidden_Multi($aSudoku, _Sudoku_CellsOfBox($i), 3)
    Next
    $iMethode = 0
    EndIf
    $bSolved = _Sudoku_Is_Solved($aSudoku)
    Until $bSolved Or _Sudoku_Compare($aSudoku, $aSudoku_1)
    Return $aSudoku
    EndFunc ;==>_Sudoku_Solve

    [/autoit] [autoit][/autoit] [autoit]

    Func _Sudoku_New_Singles($aSudoku)
    Local $iCnt
    For $i = 0 To 80
    $iCnt = 0
    For $j = 1 To 9
    If $aSudoku[$i][$j] Then $iCnt += 1
    Next
    If $iCnt = 1 Then Return True
    Next
    Return False
    EndFunc ;==>_Sudoku_New_Singles

    [/autoit] [autoit][/autoit] [autoit]

    Func _Sudoku_Compare($aSudoku, $aSudoku_1)
    For $i = 0 To 80
    For $j = 0 To 9
    If $aSudoku[$i][$j] <> $aSudoku_1[$i][$j] Then Return False
    Next
    Next
    Return True
    EndFunc ;==>_Sudoku_Compare

    [/autoit] [autoit][/autoit] [autoit]

    Func _Sudoku_Is_Solved($aSudoku)
    For $i = 0 To 80
    If $aSudoku[$i][0] = 0 Then Return False
    Next
    Return True
    EndFunc ;==>_Sudoku_Is_Solved

    [/autoit] [autoit][/autoit] [autoit]

    Func _Sudoku_CandidatesOfRow(ByRef $aSudoku, $iIndex)
    Local $aBox[3] = [0, 0, 0], $aCells = _Sudoku_CellsOfRow($iIndex)
    For $val = 1 To 9
    $aBox[0] = 0
    $aBox[1] = 0
    $aBox[2] = 0
    For $cel = 0 To 8
    If Not $aSudoku[$aCells[$cel]][$val] Then ContinueLoop
    $aBox[Floor($cel / 3)] += 1
    Next
    If $aBox[0] > 0 And $aBox[1] = 0 And $aBox[2] = 0 Then ; If... ElseIf...EndIf ist hier ein klein wenig schneller als Switch
    _Sudoku_Candidates_Remove($aSudoku, _Sudoku_CellGetBox($aCells[0]), $val, Mod($iIndex, 3), 3)
    ElseIf $aBox[0] = 0 And $aBox[1] > 0 And $aBox[2] = 0 Then
    _Sudoku_Candidates_Remove($aSudoku, _Sudoku_CellGetBox($aCells[3]), $val, Mod($iIndex, 3), 3)
    ElseIf $aBox[0] = 0 And $aBox[1] = 0 And $aBox[2] > 0 Then
    _Sudoku_Candidates_Remove($aSudoku, _Sudoku_CellGetBox($aCells[6]), $val, Mod($iIndex, 3), 3)
    EndIf
    Next
    EndFunc ;==>_Sudoku_CandidatesOfRow

    [/autoit] [autoit][/autoit] [autoit]

    Func _Sudoku_CandidatesOfCol(ByRef $aSudoku, $iIndex)
    Local $aBox[3] = [0, 0, 0], $aCells = _Sudoku_CellsOfCol($iIndex)
    For $val = 1 To 9
    $aBox[0] = 0
    $aBox[1] = 0
    $aBox[2] = 0
    For $cel = 0 To 8
    If Not $aSudoku[$aCells[$cel]][$val] Then ContinueLoop
    $aBox[Floor($cel / 3)] += 1
    Next
    If $aBox[0] > 0 And $aBox[1] = 0 And $aBox[2] = 0 Then ; If... ElseIf...EndIf ist hier ein klein wenig schneller als Switch
    _Sudoku_Candidates_Remove($aSudoku, _Sudoku_CellGetBox($aCells[0]), $val, Mod($iIndex, 3) * 3, 1)
    ElseIf $aBox[0] = 0 And $aBox[1] > 0 And $aBox[2] = 0 Then
    _Sudoku_Candidates_Remove($aSudoku, _Sudoku_CellGetBox($aCells[3]), $val, Mod($iIndex, 3) * 3, 1)
    ElseIf $aBox[0] = 0 And $aBox[1] = 0 And $aBox[2] > 0 Then
    _Sudoku_Candidates_Remove($aSudoku, _Sudoku_CellGetBox($aCells[6]), $val, Mod($iIndex, 3) * 3, 1)
    EndIf
    Next
    EndFunc ;==>_Sudoku_CandidatesOfCol

    [/autoit] [autoit][/autoit] [autoit]

    Func _Sudoku_CandidatesOfBox(ByRef $aSudoku, $iIndex)
    Local $aRow[3] = [0, 0, 0], $aCol[3] = [0, 0, 0], $aCells = _Sudoku_CellsOfBox($iIndex)
    For $val = 1 To 9 ; Alle Zahlen
    $aRow[0] = 0
    $aRow[1] = 0
    $aRow[2] = 0
    $aCol[0] = 0
    $aCol[1] = 0
    $aCol[2] = 0
    For $cel = 0 To 8 ; Alle Zellen
    If Not $aSudoku[$aCells[$cel]][$val] Then ContinueLoop
    $aRow[Mod($cel, 3)] += 1 ; Zähle in welchen Reihen die Zahl vorkommt
    $aCol[Floor($cel / 3)] += 1 ; Zähle in welchen Spalten die Zahl vorkommt
    Next
    If $aRow[0] > 0 And $aRow[1] = 0 And $aRow[2] = 0 Then ; If... ElseIf...EndIf ist hier ein klein wenig schneller als Switch
    _Sudoku_Candidates_Remove($aSudoku, _Sudoku_CellGetRow($aCells[0]), $val, Mod($iIndex, 3) * 3, 1)
    ElseIf $aRow[0] = 0 And $aRow[1] > 0 And $aRow[2] = 0 Then
    _Sudoku_Candidates_Remove($aSudoku, _Sudoku_CellGetRow($aCells[1]), $val, Mod($iIndex, 3) * 3, 1)
    ElseIf $aRow[0] = 0 And $aRow[1] = 0 And $aRow[2] > 0 Then
    _Sudoku_Candidates_Remove($aSudoku, _Sudoku_CellGetRow($aCells[2]), $val, Mod($iIndex, 3) * 3, 1)
    EndIf
    If $aCol[0] > 0 And $aCol[1] = 0 And $aCol[2] = 0 Then
    _Sudoku_Candidates_Remove($aSudoku, _Sudoku_CellGetCol($aCells[0]), $val, Floor($iIndex / 3) * 3, 1)
    ElseIf $aCol[0] = 0 And $aCol[1] > 0 And $aCol[2] = 0 Then
    _Sudoku_Candidates_Remove($aSudoku, _Sudoku_CellGetCol($aCells[3]), $val, Floor($iIndex / 3) * 3, 1)
    ElseIf $aCol[0] = 0 And $aCol[1] = 0 And $aCol[2] > 0 Then
    _Sudoku_Candidates_Remove($aSudoku, _Sudoku_CellGetCol($aCells[6]), $val, Floor($iIndex / 3) * 3, 1)
    EndIf
    Next
    EndFunc ;==>_Sudoku_CandidatesOfBox

    [/autoit] [autoit][/autoit] [autoit]

    Func _Sudoku_Candidates_Remove(ByRef $aSudoku, $aCells, $iValue, $iNot1, $iNotPlus = 0)
    Local $iNot2, $iNot3
    $iNot2 = $iNot1 + $iNotPlus
    $iNot3 = $iNot2 + $iNotPlus
    For $i = 0 To 8
    If $i = $iNot1 Or $i = $iNot2 Or $i = $iNot3 Then ContinueLoop
    $aSudoku[$aCells[$i]][$iValue] = 0
    Next
    EndFunc ;==>_Sudoku_Candidates_Remove

    [/autoit] [autoit][/autoit] [autoit]

    Func _Sudoku_Hidden_Multi(ByRef $aSudoku, $aCells, $iLevel)
    Local $aCell[10], $iValues, $iCnt
    For $val = 1 To 9 ; Alle Zahlen
    $aCell[$val] = 0
    For $cel = 0 To 8 ; Alle Zellen
    If $aSudoku[$aCells[$cel]][0] = $val Then ContinueLoop
    If Not $aSudoku[$aCells[$cel]][$val] Then ContinueLoop
    $iCnt += 1 ; Zähle, in wie vielen Zellen die Zahl vorkommt
    $aCell[$val] = BitOR($aCell[$val], 2 ^ $cel) ; Speichere die Zellen, in welchen die Zahl vorkommt in $aCell
    Next
    If $iCnt <> $iLevel Then $aCell[$val] = 0
    Next
    For $i = 1 To 9
    If $aCell[$i] = 0 Then ContinueLoop ; Nur weitermachen, wenn Zahl in genau $iLevel Zellen gefunden wurde
    $iCnt = 0
    $iValues = 0
    For $j = $i To 9
    If $aCell[$i] <> $aCell[$j] Then ContinueLoop
    $iCnt += 1
    $iValues = BitOR($iValues, 2 ^ $j)
    Next
    If $iCnt <> $iLevel Then ContinueLoop ; Nur weitermachen, wenn es genau $iLevel Zahlen in $iLevel Zellen gibt
    For $j = $i To 9
    If Not BitAND($aCell[$i], 2 ^ $j) Then ContinueLoop ; Nur weitermachen, wenn es die Zellen mit den Zahlen sind
    For $val = 1 To 9
    If BitAND($iValues, 2 ^ $val) Then ContinueLoop
    $aSudoku[$aCells[$j]][$val] = 0
    Next
    Next
    Next
    EndFunc ;==>_Sudoku_Hidden_Multi

    [/autoit] [autoit][/autoit] [autoit]

    Func _Sudoku_Hidden_Single(ByRef $aSudoku, $aCells)
    Local $iCnt
    For $val = 1 To 9 ; Suche alle Zahlen
    $iCnt = 0
    For $cel In $aCells ; In allen Zellen
    If $aSudoku[$cel][0] = $val Then ContinueLoop 2
    If $aSudoku[$cel][$val] Then $iCnt += 1
    Next
    If $iCnt <> 1 Then ContinueLoop ; Nur weitermachen, wenn Zahl genau in 1 Zelle gefunden wurde
    For $cel In $aCells
    If Not $aSudoku[$cel][$val] Then ContinueLoop
    _Sudoku_SetCell($aSudoku, $cel, $val)
    ContinueLoop 2
    Next
    Next
    EndFunc ;==>_Sudoku_Hidden_Single

    [/autoit] [autoit][/autoit] [autoit]

    Func _Sudoku_Naked_Multi(ByRef $aSudoku, $aCells, $iLevel = 2)
    Local $aValues[9], $iCnt
    For $cel = 0 To 8 ; Alle Zellen
    $iCnt = 0
    $aValues[$cel] = 0
    For $val = 1 To 9 ; Zähle, wie viele Zahlen in der Zelle vorkommen
    If $aSudoku[$aCells[$cel]][$val] Then $iCnt += 1
    Next
    If $iCnt <> $iLevel Then ContinueLoop ; nur weitermachen, wenn genau $iLevel Zahlen vorkommen
    For $val = 1 To 9
    If $aSudoku[$aCells[$cel]][$val] Then $aValues[$cel] = BitOR($aValues[$cel], 2 ^ $val) ; Zahlen in $aValues speichern
    Next
    Next
    For $i = 0 To 8
    If $aValues[$i] = 0 Then ContinueLoop
    $iCnt = 0
    For $j = $i To 8
    If $aValues[$i] = $aValues[$j] Then $iCnt += 1 ; Zähle, ob es genau $iLevel Zellen mit den gleichen Zahlen gibt
    Next
    If $iCnt <> $iLevel Then ContinueLoop ; Nur weitermachen, wenn genau $iLevel Zellen mit den gleichen $iLevel Zahlen gefunden wurden
    For $val = 1 To 9
    If Not BitAND($aValues[$i], 2 ^ $val) Then ContinueLoop
    For $j = $i To 8
    If $aValues[$i] = $aValues[$j] Then ContinueLoop ; Nur weitermachen, wenn es sich nicht um eine der gefundenen Zellen handelt
    $aSudoku[$aCells[$j]][$val] = 0
    Next
    Next
    Next
    EndFunc ;==>_Sudoku_Naked_Multi

    [/autoit] [autoit][/autoit] [autoit]

    Func _Sudoku_Naked_Single(ByRef $aSudoku)
    Local $iCnt
    For $cel = 0 To 80 ; Suche in allen Zellen
    If $aSudoku[$cel][0] > 0 Then ContinueLoop
    $iCnt = 0
    For $val = 1 To 9 ; nach allen Zahlen
    If $aSudoku[$cel][$val] Then $iCnt += 1
    Next
    If $iCnt <> 1 Then ContinueLoop ; Wenn NICHT 1 mal gefunden, dann Schleife von vorne (nachfolgender Code wird nur ausgeführt, wenn Zahl 1mal gefunden wurde)
    For $val = 1 To 9
    If Not $aSudoku[$cel][$val] Then ContinueLoop
    _Sudoku_SetCell($aSudoku, $cel, $val)
    ContinueLoop 2
    Next
    Next
    EndFunc ;==>_Sudoku_Naked_Single

    [/autoit] [autoit][/autoit] [autoit]

    Func _Sudoku_SetCell(ByRef $aSudoku, $iIndex, $iValue)
    $aSudoku[$iIndex][0] = $iValue
    For $i = 1 To 9
    $aSudoku[$iIndex][$i] = 0
    Next
    For $i In _Sudoku_CellGetRow($iIndex)
    $aSudoku[$i][$iValue] = 0
    Next
    For $i In _Sudoku_CellGetCol($iIndex)
    $aSudoku[$i][$iValue] = 0
    Next
    For $i In _Sudoku_CellGetBox($iIndex)
    $aSudoku[$i][$iValue] = 0
    Next
    EndFunc ;==>_Sudoku_SetCell

    [/autoit] [autoit][/autoit] [autoit]

    Func _Sudoku_StringToArray($sSudoku)
    Local $aReturn[81][10], $aSudoku = StringSplit($sSudoku, "", 2)
    For $i = 0 To 80
    $aReturn[$i][0] = $aSudoku[$i]
    If $aSudoku[$i] > 0 Then ContinueLoop
    For $j = 1 To 9
    $aReturn[$i][$j] = 1
    Next
    Next
    For $i = 0 To 80
    If $aSudoku[$i] > 0 Then _Sudoku_SetCell($aReturn, $i, $aSudoku[$i])
    Next
    Return $aReturn
    EndFunc ;==>_Sudoku_StringToArray

    [/autoit] [autoit][/autoit] [autoit]

    Func _Sudoku_CellsOfRow($iIndex) ; Return = alle Zellen einer Reihe ( $iIndex = 0-8 )
    Local $aReturn[9]
    For $i = 0 To 8
    $aReturn[$i] = $iIndex * 9 + $i
    Next
    Return $aReturn
    EndFunc ;==>_Sudoku_CellsOfRow

    [/autoit] [autoit][/autoit] [autoit]

    Func _Sudoku_CellGetRow($iIndex) ; Return = alle Zellen einer Reihe einer bestimmten Zelle ( $iIndex = 0-80 )
    Local $aReturn[9]
    For $i = 0 To 8
    $aReturn[$i] = Floor($iIndex / 9) * 9 + $i
    Next
    Return $aReturn
    EndFunc ;==>_Sudoku_CellGetRow

    [/autoit] [autoit][/autoit] [autoit]

    Func _Sudoku_CellsOfCol($iIndex) ; Return = alle Zellen einer Spalte ( $iIndex = 0-8 )
    Local $aReturn[9]
    For $i = 0 To 8
    $aReturn[$i] = $iIndex + $i * 9
    Next
    Return $aReturn
    EndFunc ;==>_Sudoku_CellsOfCol

    [/autoit] [autoit][/autoit] [autoit]

    Func _Sudoku_CellGetCol($iIndex) ; Return = alle Zellen einer Spalte einer bestimmten Zelle ( $iIndex = 0-80 )
    Local $aReturn[9]
    For $i = 0 To 8
    $aReturn[$i] = Mod($iIndex, 9) + (9 * $i)
    Next
    Return $aReturn
    EndFunc ;==>_Sudoku_CellGetCol

    [/autoit] [autoit][/autoit] [autoit]

    Func _Sudoku_CellsOfBox($iIndex) ; Return = alle Zellen einer Box ( $iIndex = 0-8 )
    Local $aReturn[9], $iCnt = -1
    For $i = 0 To 2
    For $j = 0 To 2
    $iCnt += 1
    $aReturn[$iCnt] = Floor($iIndex / 3) * 27 + Mod($iIndex, 3) * 3 + $i + ($j * 9)
    Next
    Next
    Return $aReturn
    EndFunc ;==>_Sudoku_CellsOfBox

    [/autoit] [autoit][/autoit] [autoit]

    Func _Sudoku_CellGetBox($iIndex) ; Return = alle Zellen einer Box einer bestimmten Zelle ( $iIndex = 0-80 )
    Local $aReturn[9], $iCnt = -1
    For $i = 0 To 2
    For $j = 0 To 2
    $iCnt += 1
    $aReturn[$iCnt] = Floor(Mod($iIndex, 9) / 3) * 3 + Floor($iIndex / 27) * 27 + $i + (9 * $j)
    Next
    Next
    Return $aReturn
    EndFunc ;==>_Sudoku_CellGetBox

    [/autoit]

    lge

    • Offizieller Beitrag

    Hallo,

    da ich eine solche Routine schon mal mit c++ in einer DLL umgesetzt hatte, habe ich mich heute mal hingesetzt und das ganze nach AutoIt portiert.

    Hier meine Lösung:

    Spoiler anzeigen
    [autoit]

    ; http://moritz.faui2k3.org/de/yasss

    [/autoit] [autoit][/autoit] [autoit]

    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $bDebug = False

    [/autoit] [autoit][/autoit] [autoit]

    Const $ciStackElements = 5

    [/autoit] [autoit][/autoit] [autoit]

    Dim $arSheet[9][9][10] ; Spielfeld
    Dim $arStack[1][$ciStackElements] ; Stack zum zwischenspeichern der Spielfelder bei der Lösungsfindung

    [/autoit] [autoit][/autoit] [autoit]

    ; --------------------------------------------------------
    ; $arStack[n][0] = kopie von $arSheet (als String)
    ; $arStack[n][1] = kopie von $iSeverity
    ; $arStack[n][2] = kopie von $iSolutions
    ; $arStack[n][3] = kopie von $bUniqueSheet
    ; $arStack[n][4] = kopie $bCountSolutions
    ; -------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    Global $iSeverity ; Schwierigkeitsgrad
    Global $iSolutions ; Anzahl der möglichen Lösungen
    Global $bUniqueSheet ; ist True wenn das Spielblatt einmalig ist
    Global $bCountSolutions ; ist True wenn die Lösungsmöglichkeiten gezählt werden sollen

    [/autoit] [autoit][/autoit] [autoit]

    $szSodukos = "506020903008000500000000000600285009000903000800761004000000000004000300201050607" & @CRLF
    $szSodukos &= "000300800640800050875000001500070206000090000209080005400000769020008013007005000" & @CRLF
    $szSodukos &= "050060001004800070800000052200057030000000000030690005790000008010006500500030060" & @CRLF
    $szSodukos &= "000060080020000000001000000070000102500030000000000400004201000300700600000000050" & @CRLF
    $szSodukos &= "000000000005010700070602090009020800060835010004070500030408020001090400000000000" & @CRLF
    $szSodukos &= "060090050704050609000362000006005700982030546003600100000246000601070308050010060" & @CRLF
    $szSodukos &= "007000000000010000000040005000008900400000000906007000008609000000000050030000041" & @CRLF
    $szSodukos &= "530070000600195000098000060800060003400803001700020006060000280000419005000080079" & @CRLF
    $szSodukos &= "100050000006009000080200004040030008007000060900000100030800002000004050000010700" & @CRLF
    $szSodukos &= "000000103900050000000000800060020070001000000000300000000001460720000050000800000" & @CRLF
    $szSodukos &= "000670900360005028805002100020506004009407000700100583070054261000703000084090050" & @CRLF
    $szSodukos &= "628009000109056004500872001900510467807000030060020900004907103000201709091000280" & @CRLF
    $szSodukos &= "076930000000108400300026000045080130010567090200310058068002005704000982020003710" & @CRLF
    $szSodukos &= "120500360300009020007208004019000873403897001002350400000000087850016900200980140" & @CRLF
    $szSodukos &= "906020100020050460000009730004260070700030608030871204800700041213000090490308006" & @CRLF
    $szSodukos &= "007000300050908004900030060070004080102070900000500006800010000000000405060007000" & @CRLF
    $szSodukos &= "060070008900104070003000500200007000008050906030900020000600010805000000000030007" & @CRLF
    $szSodukos &= "000400050107000000000060003800003000001070904060900080040030001900502030006000700" & @CRLF
    $szSodukos &= "004010050050900208300006000020000100000403000005000060000700005901004030070060900" & @CRLF
    $szSodukos &= "500000006004902010070050900020004060900060803007100000000080200401000000000006070" & @CRLF
    $szSodukos &= "009050200500000004000907000000204000100000005003010600035060720010000080074080510" & @CRLF
    $szSodukos &= "700100002010070000008005300800000650006809000400300000009004000503600000000003071" & @CRLF
    $szSodukos &= "200000140001209000500800000600700003070060000002004800009005000408100000000008067" & @CRLF
    $szSodukos &= "000300150309001000200800000008009000100502000002000046600400007040060000005003200" & @CRLF
    $szSodukos &= "003500100000010050700004008240000800000809002000700600000006009000200407015007000" & @CRLF
    $szSodukos &= "000003050060004008800170000000710042040008700009005800790800000003050070004000200" & @CRLF
    $szSodukos &= "000000000009040602087006010020004038040039000010008046064003050003050401000000000" & @CRLF
    $szSodukos &= "000007002010000000000250108002030090006405000800090005004000609000500007607002840" & @CRLF
    $szSodukos &= "000000000073080500092003070004070800708036020900000000000019650010000290000240000" & @CRLF
    $szSodukos &= "060050002800000010000002600000020000500903208007010394006074000010006050200035000" & @CRLF
    $szSodukos &= "004002080002000401500070060820040007060005100700000000090000023003098000000201600" & @CRLF
    $szSodukos &= "000000000205980430006207009000030280040000000000090170009508006502460790000000000" & @CRLF
    $szSodukos &= "000000800000640005009700004248000601060009000971000403003100008000570006000000700" & @CRLF
    $szSodukos &= "000000020000008539000596080000000350051000700904700200402810000500040000086300000" & @CRLF
    $szSodukos &= "000020000020000100365840070001050020840000000003060080214680030070000500000010000" & @CRLF
    $szSodukos &= "100020008020004070003500600005400000300000407002006010004305700030000080000060009" & @CRLF
    $szSodukos &= "000670900360005028805002100020506004009407000700100583070054261000703000084090050" & @CRLF
    $szSodukos &= "628009000109056004500872001900510467807000030060020900004907103000201709091000280" & @CRLF
    $szSodukos &= "076930000000108400300026000045080130010567090200310058068002005704000982020003710" & @CRLF
    $szSodukos &= "120500360300009020007208004019000873403897001002350400000000087850016900200980140" & @CRLF
    $szSodukos &= "906020100020050460000009730004260070700030608030871204800700041213000090490308006" & @CRLF
    $szSodukos &= "007000300050908004900030060070004080102070900000500006800010000000000405060007000" & @CRLF
    $szSodukos &= "060070008900104070003000500200007000008050906030900020000600010805000000000030007" & @CRLF
    $szSodukos &= "000000000005010700070602090009020800060835010004070500030408020001090400000000000" & @CRLF
    $szSodukos &= "004010050050900208300006000020000100000403000005000060000700005901004030070060900" & @CRLF
    $szSodukos &= "500000006004902010070050900020004060900060803007100000000080200401000000000006070" & @CRLF
    $szSodukos &= "000000103000050000000000800060020070001000000000300000000001460720000050000800000" & @CRLF
    $szSodukos &= "100050000006009000080200004040030008007000060900000100030800002000004050000010700" & @CRLF
    $szSodukos &= "000300800640800050805000001500070206000090000209080005400000709020008013007005000" & @CRLF
    $szSodukos &= "050060001004800070800000052200057030000000000030690005790000008010006500500030060" & @CRLF
    $szSodukos &= "000000000005010700070602090009020800060835010004070500030408000001090400000000000" & @CRLF
    $szSodukos &= "060090050000050609000362000006005700982030546003600100000246000601070308050010060" & @CRLF
    $szSodukos &= "007000000000010000000040005000008900400000000906007000008609000000000050030000040" & @CRLF
    $szSodukos &= "530070000600005000098000060800060003400803001700020006060000280000400005000080079" & @CRLF
    $szSodukos &= "100050000006009000080200004040030008007000060900000100030800002000004050000010700" & @CRLF
    $szSodukos &= "000000000000000000000000000000000000000000000000000000000000000000000000000000000" & @CRLF

    [/autoit] [autoit][/autoit] [autoit]

    Local $aszSodukos = StringSplit($szSodukos, @CRLF, 3)
    If $bDebug Then _ArrayDisplay($aszSodukos)

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To UBound($aszSodukos) - 1
    If $aszSodukos[$i] = "" Then ContinueLoop
    $tRunning = TimerInit()
    ConsoleWrite($aszSodukos[$i] & @TAB & SudokuSolve($aszSodukos[$i]) & @TAB & TimerDiff($tRunning) & " ms" & @CRLF)
    Next

    [/autoit] [autoit][/autoit] [autoit]

    Func SudokuSolve($acField)
    Local $iRow, $iCol
    $acField = StringSplit($acField, "", 2)

    [/autoit] [autoit][/autoit] [autoit]

    Init()
    ResetArrays()

    [/autoit] [autoit][/autoit] [autoit]

    For $iRow = 0 To 8
    For $iCol = 0 To 8
    If $bDebug Then ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $iVal = ' & Int($acField[$iRow * 9 + $iCol]) & ' $iRow = ' & $iRow & ' $iCol = ' & $iCol & @CRLF)
    SetCell(Int($acField[$iRow * 9 + $iCol]), $iRow, $iCol) ; Wert eintragen
    Next
    Next

    [/autoit] [autoit][/autoit] [autoit]

    AutoPlay()

    [/autoit] [autoit][/autoit] [autoit]

    Return GetSudokuString()
    EndFunc ;==>SudokuSolve

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; Initialisiert die Array mit Anfangswerten
    Func ResetArrays()
    ClearSheet($arSheet)
    EndFunc ;==>ResetArrays

    [/autoit] [autoit][/autoit] [autoit]

    ; Startwerte für Variablen setzten
    Func Init()
    $iSeverity = 0
    $iSolutions = 0
    $bUniqueSheet = False
    $bCountSolutions = False
    EndFunc ;==>Init

    [/autoit] [autoit][/autoit] [autoit]

    ; Spiel automatisch durchspielen
    Func AutoPlay()
    Local $bSimplePlay = True

    [/autoit] [autoit][/autoit] [autoit]

    While $bSimplePlay ; Solange Spielen bis kein Wert mehr gesetzt wird
    $bSimplePlay = BitOR(AutoPlayModeOne(), AutoPlayModeTwo())
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    If IsUnsolvable() Then Return False ; Falls unlösbar, beenden

    [/autoit] [autoit][/autoit] [autoit]

    If IsSolved() Then
    $iSolutions += 1
    Return True
    Else
    Return AutoPlayTrialAndError()
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Return True
    EndFunc ;==>AutoPlay

    [/autoit] [autoit][/autoit] [autoit]

    ; Wert aus Zelle auslesen
    Func GetCell($iRow, $iCol)
    Return Int($arSheet[$iRow][$iCol][0])
    EndFunc ;==>GetCell

    [/autoit] [autoit][/autoit] [autoit]

    ; Wert in Zelle setzen
    Func SetCell($iVal, $iRow, $iCol)
    Local $iBRow, $iBCol

    [/autoit] [autoit][/autoit] [autoit]

    If $bDebug Then ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $iVal = ' & $iVal & ' $iRow = ' & $iRow & ' $iCol = ' & $iCol & @CRLF) ;### Debug Console

    [/autoit] [autoit][/autoit] [autoit]

    If IsAllowedValue($iVal, $iRow, $iCol) Then
    $arSheet[$iRow][$iCol][0] = $iVal

    [/autoit] [autoit][/autoit] [autoit]

    For $iIndex = 0 To 8
    $arSheet[$iRow][$iIndex][$iVal] = False ; Dieser Wert ist in der Zeile und ...
    $arSheet[$iIndex][$iCol][$iVal] = False ; in der Spalte und ...
    $iBRow = 3 * Int($iRow / 3) + Int($iIndex / 3)
    $iBCol = 3 * Int($iCol / 3) + Int(Mod($iIndex, 3))
    $arSheet[$iBRow][$iBCol][$iVal] = False ; im Block nicht mehr erlaubt
    $arSheet[$iRow][$iCol][$iIndex + 1] = False ; Die Zelle als belegt markieren
    Next
    EndIf
    EndFunc ;==>SetCell

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; Spielmodus 1 - Sucht alle Felder in denen nur noch ein
    ; Wert reinpasst und trägt den Wert ein
    Func AutoPlayModeOne()
    Local $bRetFlag = False ; ist True wenn mindestens 1 Wert gesetzt wurde
    Local $iCheck, $iValSet

    [/autoit] [autoit][/autoit] [autoit]

    For $iRow = 0 To 8
    For $iCol = 0 To 8
    If GetCell($iRow, $iCol) = 0 Then
    $iCheck = 0
    $iValSet = 0
    For $iVal = 1 To 9
    If IsAllowedValue($iVal, $iRow, $iCol) Then
    $iValSet = $iVal
    $iCheck += 1
    EndIf
    Next

    [/autoit] [autoit][/autoit] [autoit]

    If $iCheck = 1 Then ; Feld gefunden
    SetCell($iValSet, $iRow, $iCol) ; Wert eintragen
    $iSeverity += 2
    $bRetFlag = True
    EndIf
    EndIf
    Next
    Next
    If Not $bRetFlag Then $iSeverity += 1

    [/autoit] [autoit][/autoit] [autoit]

    Return $bRetFlag
    EndFunc ;==>AutoPlayModeOne

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; Spielmodus 2 - sucht alle Zeilen, Spalten und Blocks nach
    ; Zellen in den nur noch 1 Wert möglich ist
    Func AutoPlayModeTwo()
    Local $bRetFlag = False ; ist True wenn mindestens 1 Wert gesetzt wurde
    Local $iVBlock, $iHBlock

    [/autoit] [autoit][/autoit] [autoit]

    ; zuerst Zeilenweise
    For $iRow = 0 To 8
    Local $arCheck[9] = [0, 0, 0, 0, 0, 0, 0, 0, 0]

    [/autoit] [autoit][/autoit] [autoit]

    For $iCol = 0 To 8
    If GetCell($iRow, $iCol) = 0 Then
    For $iVal = 1 To 9
    If IsAllowedValue($iVal, $iRow, $iCol) Then
    $arCheck[$iVal - 1] += 1
    EndIf
    Next
    EndIf
    Next

    [/autoit] [autoit][/autoit] [autoit]

    For $iVal = 1 To 9
    If $arCheck[$iVal - 1] = 1 Then ; Feld gefunden
    For $iCol = 0 To 8
    If IsAllowedValue($iVal, $iRow, $iCol) Then
    SetCell($iVal, $iRow, $iCol) ; Wert eintragen
    $iSeverity += 2
    $bRetFlag = True
    EndIf
    Next
    EndIf
    Next
    Next

    [/autoit] [autoit][/autoit] [autoit]

    ; jetzt Spaltenweise
    For $iCol = 0 To 8
    Local $arCheck[9] = [0, 0, 0, 0, 0, 0, 0, 0, 0]

    [/autoit] [autoit][/autoit] [autoit]

    For $iRow = 0 To 8
    If GetCell($iRow, $iCol) = 0 Then
    For $iVal = 1 To 9
    If IsAllowedValue($iVal, $iRow, $iCol) Then
    $arCheck[$iVal - 1] += 1
    EndIf
    Next
    EndIf
    Next

    [/autoit] [autoit][/autoit] [autoit]

    For $iVal = 1 To 9
    If $arCheck[$iVal - 1] = 1 Then ; Feld gefunden
    For $iRow = 0 To 8
    If IsAllowedValue($iVal, $iRow, $iCol) Then
    SetCell($iVal, $iRow, $iCol) ; Wert eintragen
    $iSeverity += 2
    $bRetFlag = True
    EndIf
    Next
    EndIf
    Next
    Next

    [/autoit] [autoit][/autoit] [autoit]

    ; zuletzt Blockweise
    For $iBlock = 0 To 8
    Local $arCheck[9] = [0, 0, 0, 0, 0, 0, 0, 0, 0]
    $iVBlock = 3 * Int($iBlock / 3) ; Block in vertikaler Richtung
    $iHBlock = 3 * Int(Mod($iBlock, 3)) ; Block in horizontaler Richtung

    [/autoit] [autoit][/autoit] [autoit]

    For $iCell = 0 To 8
    $iRow = $iVBlock + Int(Mod($iCell, 3))
    $iCol = $iHBlock + Int($iCell / 3)
    If GetCell($iRow, $iCol) = 0 Then
    For $iVal = 1 To 9
    If IsAllowedValue($iVal, $iRow, $iCol) Then
    $arCheck[$iVal - 1] += 1
    EndIf
    Next
    EndIf
    Next

    [/autoit] [autoit][/autoit] [autoit]

    For $iVal = 1 To 9
    If $arCheck[$iVal - 1] = 1 Then ; Feld gefunden
    For $iCell = 0 To 8
    $iRow = $iVBlock + Int(Mod($iCell, 3))
    $iCol = $iHBlock + Int($iCell / 3)
    If IsAllowedValue($iVal, $iRow, $iCol) Then
    SetCell($iVal, $iRow, $iCol) ; Wert eintragen
    $iSeverity += 2
    $bRetFlag = True
    EndIf
    Next
    EndIf
    Next
    Next

    [/autoit] [autoit][/autoit] [autoit]

    If Not $bRetFlag Then $iSeverity += 1

    [/autoit] [autoit][/autoit] [autoit]

    Return $bRetFlag
    EndFunc ;==>AutoPlayModeTwo

    [/autoit] [autoit][/autoit] [autoit]

    ; Spielt nach dem trial and Error Verfahren
    Func AutoPlayTrialAndError()
    Dim $arTempSheet[9][9][10]
    Dim $arSolutionSheet[9][9][10]
    Local $iTempSeverity, $iTempSolutions
    Local $iSolutionSeverity, $iSolutionSolutions

    [/autoit] [autoit][/autoit] [autoit]

    Local $bSolved = False

    [/autoit] [autoit][/autoit] [autoit]

    If IsUnsolvable() Then Return False
    $iSeverity += 7
    ClearSheet($arSolutionSheet)

    [/autoit] [autoit][/autoit] [autoit]

    For $iRow = 0 To 8
    For $iCol = 0 To 8
    If GetCell($iRow, $iCol) = 0 Then
    For $iVal = 1 To 9
    If IsAllowedValue($iVal, $iRow, $iCol) Then
    PushSheet() ; Aktuelles Blatt auf den Stack legen
    SetCell($iVal, $iRow, $iCol)
    If AutoPlay() Then
    $bSolved = True
    If $bCountSolutions Then
    ConsoleWrite(GetSudokuString() & @CRLF)
    If $bDebug Then ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $iSolutions = ' & $iSolutions & @CRLF) ;### Debug Console
    If $bUniqueSheet And ($iSolutions > 1) Then
    Return True
    EndIf
    CopySheet($arSheet, $arSolutionSheet)
    $iSolutionSeverity = $iSeverity
    $iSolutionSolutions = $iSolutions
    PopSheet()
    $iSolutions = $iSolutionSolutions
    Else
    Return True
    EndIf
    Else
    PopSheet()
    EndIf
    EndIf
    Next

    [/autoit] [autoit][/autoit] [autoit]

    If $bSolved Then
    CopySheet($arSolutionSheet, $arSheet)
    $iSeverity = $iSolutionSeverity
    $iSolutions = $iSolutionSolutions
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Return $bSolved
    EndIf
    Next
    Next
    Return False
    EndFunc ;==>AutoPlayTrialAndError

    [/autoit] [autoit][/autoit] [autoit]

    ; Gibt True zurück wenn der Wert in der Zelle möglich ist
    Func IsAllowedValue($iVal, $iRow, $iCol)
    Return $arSheet[$iRow][$iCol][$iVal]
    EndFunc ;==>IsAllowedValue

    [/autoit] [autoit][/autoit] [autoit]

    ; Gibt True zurück wenn das Spiel gelöst ist
    Func IsSolved()
    For $iRow = 0 To 8
    For $iCol = 0 To 8
    If GetCell($iRow, $iCol) = 0 Then Return False
    Next
    Next
    If $bDebug Then GetSudokuString()

    [/autoit] [autoit][/autoit] [autoit]

    Return True
    EndFunc ;==>IsSolved

    [/autoit] [autoit][/autoit] [autoit]

    ; Gibt True zurück wenn das Spiel unlösbar ist
    Func IsUnsolvable()
    Local $bSolvable

    [/autoit] [autoit][/autoit] [autoit]

    For $iRow = 0 To 8
    For $iCol = 0 To 8
    $bSolvable = False
    If GetCell($iRow, $iCol) = 0 Then
    For $iVal = 1 To 9
    $bSolvable = BitOR($bSolvable, $arSheet[$iRow][$iCol][$iVal])
    Next
    If Not $bSolvable Then Return True
    EndIf
    Next
    Next

    [/autoit] [autoit][/autoit] [autoit]

    Return False
    EndFunc ;==>IsUnsolvable

    [/autoit] [autoit][/autoit] [autoit]

    ; Gibt den Inhalt des Soduko als String zurück
    Func GetSudokuString()
    Local $strOuput = ""

    [/autoit] [autoit][/autoit] [autoit]

    For $iRow = 0 To 8
    For $iCol = 0 To 8
    $strOuput &= String(GetCell($iRow, $iCol)); & " "
    Next
    ;~ $strOuput &= @CRLF
    Next
    If $bDebug Then
    ConsoleWrite($strOuput & @CRLF)
    Sleep(500)
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Return $strOuput
    EndFunc ;==>ShowSudoku

    [/autoit] [autoit][/autoit] [autoit]

    ; Daten im Stack speichern
    Func PushSheet()
    Local $iCountStack

    [/autoit] [autoit][/autoit] [autoit]

    $arStack[0][0] += 1

    [/autoit] [autoit][/autoit] [autoit]

    $iCountStack = $arStack[0][0]

    [/autoit] [autoit][/autoit] [autoit]

    If UBound($arStack) <= $iCountStack Then ReDim $arStack[$iCountStack + 5][$ciStackElements]

    [/autoit] [autoit][/autoit] [autoit]

    $arStack[$iCountStack][0] = ""
    For $iRow = 0 To 8
    For $iCol = 0 To 8
    For $iVal = 0 To 9
    $arStack[$iCountStack][0] &= String(Int($arSheet[$iRow][$iCol][$iVal]))
    Next
    Next
    Next
    If $bDebug Then ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : ' & $arStack[$iCountStack][0] & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    $arStack[$iCountStack][1] = $iSeverity
    $arStack[$iCountStack][2] = $iSolutions
    $arStack[$iCountStack][3] = $bUniqueSheet
    $arStack[$iCountStack][4] = $bCountSolutions
    ;~ If $bDebug Then _ArrayDisplay($arStack)
    If $bDebug Then ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $iSolutions = ' & $iSolutions & @CRLF) ;### Debug Console
    EndFunc ;==>PushSheet

    [/autoit] [autoit][/autoit] [autoit]

    ; Daten vom Stack holen
    Func PopSheet()
    Local $iCountStack = $arStack[0][0]

    [/autoit] [autoit][/autoit] [autoit]

    If $iCountStack Then
    For $iRow = 0 To 8
    For $iCol = 0 To 8
    For $iVal = 0 To 9
    $arSheet[$iRow][$iCol][$iVal] = Int(StringMid($arStack[$iCountStack][0], $iRow * 90 + $iCol * 10 + $iVal + 1, 1))
    Next
    Next
    Next

    [/autoit] [autoit][/autoit] [autoit]

    $iSeverity = $arStack[$iCountStack][1]
    $iSolutions = $arStack[$iCountStack][2]
    $bUniqueSheet = $arStack[$iCountStack][3]
    $bCountSolutions = $arStack[$iCountStack][4]

    [/autoit] [autoit][/autoit] [autoit]

    $arStack[0][0] -= 1

    [/autoit] [autoit][/autoit] [autoit]

    ;~ ReDim $arStack[$iCountStack][$ciStackElements]
    ;~ _ArrayDisplay($arStack)
    EndIf
    EndFunc ;==>PopSheet

    [/autoit] [autoit][/autoit] [autoit]

    Func CopySheet($arSource, ByRef $arDestination)
    For $iRow = 0 To 8
    For $iCol = 0 To 8
    For $iVal = 0 To 9
    $arDestination[$iRow][$iCol][$iVal] = $arSource[$iRow][$iCol][$iVal]
    Next
    Next
    Next
    EndFunc ;==>CopySheet

    [/autoit] [autoit][/autoit] [autoit]

    Func ClearSheet(ByRef $arDestination)
    For $iRow = 0 To 8
    For $iCol = 0 To 8
    $arDestination[$iRow][$iCol][0] = 0
    For $iVal = 1 To 9
    $arDestination[$iRow][$iCol][$iVal] = $iVal
    Next
    Next
    Next
    EndFunc ;==>ClearSheet

    [/autoit] [autoit][/autoit] [autoit]

    Func SwapSheets(ByRef $arSheet1, ByRef $arSheet2)
    Dim $arTempSheet[9][9][10]

    [/autoit] [autoit][/autoit] [autoit]

    CopySheet($arSheet1, $arTempSheet)
    CopySheet($arSheet2, $arSheet1)
    CopySheet($arTempSheet, $arSheet2)
    EndFunc ;==>SwapSheets

    [/autoit]

    BugFix , für dein Sudoko gibt es übrigens 1905 Lösungsmöglichkeiten! :thumbup:

    Spoiler anzeigen

    516427983378196542429538761647285139152943876893761254735619428964872315281354697
    516427983378196542429538761647285139152943876893761254765319428984672315231854697
    516427983378196542429538761647285139152943876893761254935672418764819325281354697
    516427983378196542429538761647285139152943876893761254965372418784619325231854697
    516427983378196542492538176643285719127943865859761234735619428964872351281354697
    516427983378196542492538176643285719127943865859761234765319428984672351231854697
    516427983378196542492538716643285179127943865859761234735619428964872351281354697
    516427983378196542492538716643285179127943865859761234765319428984672351231854697
    516427983378196542492538761643285179127943856859761234735619428964872315281354697
    516427983378196542492538761643285179127943856859761234765319428984672315231854697
    516427983378196542492538761643285179127943856859761234935672418764819325281354697
    516427983378196542492538761643285179127943856859761234965372418784619325231854697
    516427983378196542492538761647285139125943876839761254753619428964872315281354697
    516427983378196542492538761647285139125943876839761254763819425954672318281354697
    516427983378196542492538761647285139125943876839761254953672418764819325281354697
    516427983378196542492538761647285139125943876839761254963872415754619328281354697
    516427983378619542429538761647285139152943876893761254735196428964872315281354697
    516427983378619542429538761647285139152943876893761254765392418984176325231854697
    516427983378619542429538761647285139152943876893761254935176428764892315281354697
    516427983378619542429538761647285139152943876893761254965372418784196325231854697
    516427983378619542492538176643285719127943865859761234735196428964872351281354697
    516427983378619542492538176643285719127943865859761234735896421964172358281354697
    516427983378619542492538176643285719127943865859761234785396421964172358231854697
    516427983378619542492538176643285719127943865859761234935176428764892351281354697
    516427983378619542492538176643285719127943865859761234935876421764192358281354697
    516427983378619542492538176643285719127943865859761234985376421764192358231854697
    516427983378619542492538716643285179127943865859761234735196428964872351281354697
    516427983378619542492538716643285179127943865859761234735896421964172358281354697
    516427983378619542492538716643285179127943865859761234785396421964172358231854697
    516427983378619542492538716643285179127943865859761234935176428764892351281354697
    516427983378619542492538716643285179127943865859761234935876421764192358281354697
    516427983378619542492538716643285179127943865859761234985376421764192358231854697
    516427983378619542492538761643285179127943856859761234735196428964872315281354697
    516427983378619542492538761643285179127943856859761234765392418984176325231854697
    516427983378619542492538761643285179127943856859761234935176428764892315281354697
    516427983378619542492538761643285179127943856859761234965372418784196325231854697
    516427983378619542492538761647285139125943876839761254753196428964872315281354697
    516427983378619542492538761647285139125943876839761254763892415954176328281354697
    516427983378619542492538761647285139125943876839761254953176428764892315281354697
    516427983378619542492538761647285139125943876839761254963872415754196328281354697
    516427983428396571379518426647285139152943768893761254765134892984672315231859647
    516427983428396571379518426647285139152943768893761254765139842984672315231854697
    516427983428396571397518426643285719172943865859761234785634192964172358231859647
    516427983428396571397518426643285719172943865859761234785639142964172358231854697
    516427983428639571379518426647285139152943768893761254735196842964872315281354697
    516427983428639571379518426647285139152943768893761254935176842764892315281354697
    516427983428639571397518426643285719172943865859761234735896142964172358281354697
    516427983428639571397518426643285719172943865859761234765392148984176352231854697
    516427983428639571397518426643285719172943865859761234785396142964172358231854697
    516427983428639571397518426643285719172943865859761234935876142764192358281354697
    516427983428639571397518426643285719172943865859761234965372148784196352231854697
    516427983428639571397518426643285719172943865859761234985376142764192358231854697
    516427983428639571397518462643285719172943856859761234765392148984176325231854697
    516427983428639571397518462643285719172943856859761234965372148784196325231854697
    516427983428639571739518426643285719172943865895761234357896142964172358281354697
    516427983428639571739518426647285139152943768893761254375196842964872315281354697
    516427983428639571739518462643285719172943856895761234367892145954176328281354697
    516427983428639571793518426647285139152943768839761254375196842964872315281354697
    516427983428639571937518426643285719172943865859761234395876142764192358281354697
    516427983428639571937518426643285719172943865895761234359876142764192358281354697
    516427983428639571937518462643285719172943856895761234369872145754196328281354697
    516427983428639571973518426647285139152943768839761254395176842764892315281354697
    516427983438196572729538146643285719172943865895761234357619428964872351281354697
    516427983438196572792538146643285719127943865859761234365879421974612358281354697
    516427983438196572792538146643285719127943865859761234375619428964872351281354697
    516427983438196572927538146643285719172943865859761234365879421794612358281354697
    516427983438196572927538146643285719172943865895761234369872451754619328281354697
    516427983438196572927538461643285719172943856859761234395672148764819325281354697
    516427983438196572927538461643285719172943856859761234395674128764812395281359647
    516427983438196572927538461643285719172943856895761234359672148764819325281354697
    516427983438196572927538461643285719172943856895761234359674128764812395281359647
    516427983438196572927538461643285719172943856895761234369872145754619328281354697
    516427983438196572927538461643285719172943856895761234369874125754612398281359647
    516427983438196572972538146643285719127943865859761234365879421794612358281354697
    516427983438196572972538146643285719127943865895761234369872451754619328281354697
    516427983438196572972538416647285139125943768893761254359672841764819325281354697
    516427983438196572972538416647285139125943768893761254359674821764812395281359647
    516427983438196572972538461643285719127943856859761234395672148764819325281354697
    516427983438196572972538461643285719127943856859761234395674128764812395281359647
    516427983438196572972538461643285719127943856895761234359672148764819325281354697
    516427983438196572972538461643285719127943856895761234359674128764812395281359647
    516427983438196572972538461643285719127943856895761234369872145754619328281354697
    516427983438196572972538461643285719127943856895761234369874125754612398281359647
    516427983438619572729538146643285719172943865895761234357196428964872351281354697
    516427983438619572729538146643285719172943865895761234357896421964172358281354697
    516427983438619572729538146643285719172943865895761234367192458954876321281354697
    516427983438619572729538146643285719172943865895761234367892451954176328281354697
    516427983438619572729538461643285719172943856895761234367892145954176328281354697
    516427983438619572792538146643285719127943865859761234375196428964872351281354697
    516427983438619572792538146643285719127943865859761234375896421964172358281354697
    516427983438619572927538146643285719172943865859761234395176428764892351281354697
    516427983438619572927538146643285719172943865859761234395876421764192358281354697
    516427983438619572927538146643285719172943865895761234359176428764892351281354697
    516427983438619572927538146643285719172943865895761234359876421764192358281354697
    516427983438619572927538146643285719172943865895761234369172458754896321281354697
    516427983438619572927538146643285719172943865895761234369872451754196328281354697
    516427983438619572927538461643285719172943856895761234369872145754196328281354697
    516427983438619572972538146643285719127943865859761234395176428764892351281354697
    516427983438619572972538146643285719127943865859761234395876421764192358281354697
    516427983438619572972538146643285719127943865895761234359176428764892351281354697
    516427983438619572972538146643285719127943865895761234359876421764192358281354697
    516427983438619572972538146643285719127943865895761234369172458754896321281354697
    516427983438619572972538146643285719127943865895761234369872451754196328281354697
    516427983438619572972538416647285139125943768893761254369172845754896321281354697
    516427983438619572972538461643285719127943856895761234369872145754196328281354697
    516427983478396512392518746643285179127943865859761234765139428984672351231854697
    516427983478396512392518746643285179127943865859761234785639421964172358231854697
    516427983478396521329518476647285139152943768893761254765134892984672315231859647
    516427983478396521329518476647285139152943768893761254765139842984672315231854697
    516427983478396521392518476643285719127943865859761234785634192964172358231859647
    516427983478396521392518476643285719127943865859761234785639142964172358231854697
    516427983478396521392518746643285179127943865859761234785639412964172358231854697
    516427983478639512329518476647285139152943768893761254765392841984176325231854697
    516427983478639512329518476647285139152943768893761254965372841784196325231854697
    516427983478639512392518476647285139125943768839761254763192845954876321281354697
    516427983478639512392518476647285139125943768839761254963172845754896321281354697
    516427983478639512392518746643285179127943865859761234735196428964872351281354697
    516427983478639512392518746643285179127943865859761234735896421964172358281354697
    516427983478639512392518746643285179127943865859761234785396421964172358231854697
    516427983478639512392518746643285179127943865859761234935176428764892351281354697
    516427983478639512392518746643285179127943865859761234935876421764192358281354697
    516427983478639512392518746643285179127943865859761234985376421764192358231854697
    516427983478639512932518476647285139125943768893761254369172845754896321281354697
    516427983478639512932518746643285179127943865859761234395176428764892351281354697
    516427983478639512932518746643285179127943865859761234395876421764192358281354697
    516427983478639512932518746643285179127943865895761234359176428764892351281354697
    516427983478639512932518746643285179127943865895761234359876421764192358281354697
    516427983478639512932518746643285179127943865895761234369172458754896321281354697
    516427983478639512932518746643285179127943865895761234369872451754196328281354697
    516427983478639521329518476647285139152943768893761254735196842964872315281354697
    516427983478639521329518476647285139152943768893761254935176842764892315281354697
    516427983478639521392518476643285719127943865859761234735896142964172358281354697
    516427983478639521392518476643285719127943865859761234765392148984176352231854697
    516427983478639521392518476643285719127943865859761234785396142964172358231854697
    516427983478639521392518476643285719127943865859761234935876142764192358281354697
    516427983478639521392518476643285719127943865859761234965372148784196352231854697
    516427983478639521392518476643285719127943865859761234985376142764192358231854697
    516427983478639521392518476647285139125943768839761254753196842964872315281354697
    516427983478639521392518476647285139125943768839761254763192845954876312281354697
    516427983478639521392518476647285139125943768839761254953176842764892315281354697
    516427983478639521392518476647285139125943768839761254963172845754896312281354697
    516427983478639521392518746643285179127943865859761234735896412964172358281354697
    516427983478639521392518746643285179127943865859761234765392418984176352231854697
    516427983478639521392518746643285179127943865859761234785396412964172358231854697
    516427983478639521392518746643285179127943865859761234935876412764192358281354697
    516427983478639521392518746643285179127943865859761234965372418784196352231854697
    516427983478639521392518746643285179127943865859761234985376412764192358231854697
    516427983478639521923518476647285139152943768839761254395176842764892315281354697
    516427983478639521932518476643285719127943865859761234395876142764192358281354697
    516427983478639521932518476643285719127943865895761234359876142764192358281354697
    516427983478639521932518476647285139125943768893761254359176842764892315281354697
    516427983478639521932518476647285139125943768893761254369172845754896312281354697
    516427983478639521932518746643285179127943865859761234395876412764192358281354697
    516427983478639521932518746643285179127943865895761234359876412764192358281354697
    516427983478639521932518746643285179127943865895761234369172458754896312281354697
    516427983498136572327598146643285719172943865859761234735619428964872351281354697
    516427983498136572327598146643285719172943865859761234765319428984672351231854697
    516427983498136572327598461643285719172943856859761234935672148764819325281354697
    516427983498136572327598461643285719172943856859761234935674128764812395281359647
    516427983498136572327598461643285719172943856859761234965372148784619325231854697
    516427983498136572327598461643285719172943856859761234965374128784612395231859647
    516427983498136572372598146643285719127943865859761234735619428964872351281354697
    516427983498136572372598146643285719127943865859761234765319428984672351231854697
    516427983498136572372598416647285139125943768839761254953672841764819325281354697
    516427983498136572372598416647285139125943768839761254953674821764812395281359647
    516427983498136572372598461643285719127943856859761234935672148764819325281354697
    516427983498136572372598461643285719127943856859761234935674128764812395281359647
    516427983498136572372598461643285719127943856859761234965372148784619325231854697
    516427983498136572372598461643285719127943856859761234965374128784612395231859647
    516427983498136572732598146643285719127943865859761234365879421974612358281354697
    516427983498136572732598146643285719127943865859761234375619428964872351281354697
    516427983498316572327598146643285719172943865859761234765139428984672351231854697
    516427983498316572327598146643285719172943865859761234785639421964172358231854697
    516427983498316572372598146643285719127943865859761234765139428984672351231854697
    516427983498316572372598146643285719127943865859761234785639421964172358231854697
    516427983728639541439518726643285179172943865895761234357896412964172358281354697
    516427983728639541439518726643285179172943865895761234367192458954876312281354697
    516427983728639541439518762643285179172943856895761234357196428964872315281354697
    516427983728639541439518762643285179172943856895761234367892415954176328281354697
    516427983728639541439518762647285139152943876893761254375196428964872315281354697
    516427983728639541493518762647285139152943876839761254375196428964872315281354697
    516427983738196542429538176643285719172943865895761234357619428964872351281354697
    516427983738196542429538716643285179172943865895761234357619428964872351281354697
    516427983738196542429538761643285179172943856895761234357619428964872315281354697
    516427983738196542429538761643285179172943856895761234367819425954672318281354697
    516427983738196542429538761647285139152943876893761254375619428964872315281354697
    516427983738196542492538176643285719127943865859761234365879421974612358281354697
    516427983738196542492538176643285719127943865859761234375619428964872351281354697
    516427983738196542492538716643285179127943865859761234365879421974612358281354697
    516427983738196542492538716643285179127943865859761234375619428964872351281354697
    516427983738196542492538761643285179127943856859761234375619428964872315281354697
    516427983738619542429538176643285719172943865895761234357196428964872351281354697
    516427983738619542429538176643285719172943865895761234357896421964172358281354697
    516427983738619542429538176643285719172943865895761234367192458954876321281354697
    516427983738619542429538176643285719172943865895761234367892451954176328281354697
    516427983738619542429538716643285179172943865895761234357196428964872351281354697
    516427983738619542429538716643285179172943865895761234357896421964172358281354697
    516427983738619542429538716643285179172943865895761234367192458954876321281354697
    516427983738619542429538716643285179172943865895761234367892451954176328281354697
    516427983738619542429538761643285179172943856895761234357196428964872315281354697
    516427983738619542429538761643285179172943856895761234367892415954176328281354697
    516427983738619542429538761647285139152943876893761254375196428964872315281354697
    516427983738619542492538176643285719127943865859761234375196428964872351281354697
    516427983738619542492538176643285719127943865859761234375896421964172358281354697
    516427983738619542492538716643285179127943865859761234375196428964872351281354697
    516427983738619542492538716643285179127943865859761234375896421964172358281354697
    516427983738619542492538761643285179127943856859761234375196428964872315281354697
    516427983798136542423598761647285139152943876839761254375619428964872315281354697
    516427983798136542432598176643285719127943865859761234365879421974612358281354697
    516427983798136542432598176643285719127943865859761234375619428964872351281354697
    516427983798136542432598716643285179127943865859761234365879421974612358281354697
    516427983798136542432598716643285179127943865859761234375619428964872351281354697
    516427983798136542432598761643285179127943856859761234375619428964872315281354697
    516427983978136542423598761647285139152943876839761254395672418764819325281354697
    516427983978136542432598176643285719127943865859761234365879421794612358281354697
    516427983978136542432598176643285719127943865895761234369872451754619328281354697
    516427983978136542432598716643285179127943865859761234365879421794612358281354697
    516427983978136542432598716643285179127943865895761234369872451754619328281354697
    516427983978136542432598761643285179127943856859761234395672418764819325281354697
    516427983978136542432598761643285179127943856895761234359672418764819325281354697
    516427983978136542432598761643285179127943856895761234369872415754619328281354697
    516427983978136542432598761647285139125943876893761254359672418764819325281354697
    516427983978136542432598761647285139125943876893761254369872415754619328281354697
    516428973328179546479536812647285139152943768893761254735692481964817325281354697
    516428973328179546479536812647285139152943768893761254765392481984617325231854697
    516428973328179546479536821647285139152943768893761254935617482764892315281354697
    516428973328179546479536821647285139152943768893761254965317482784692315231854697
    516428973328179546497536128643285719172943865859761234735692481964817352281354697
    516428973328179546497536128643285719172943865859761234765392481984617352231854697
    516428973328179546497536128643285719172943865859761234935617482764892351281354697
    516428973328179546497536128643285719172943865859761234965317482784692351231854697
    516428973328179546497536182643285719172943865859761234935617428764892351281354697
    516428973328179546497536182643285719172943865859761234965317428784692351231854697
    516428973328197546479536812647285139152943768893761254935672481764819325281354697
    516428973328197546479536812647285139152943768893761254965372481784619325231854697
    516428973328197546479536821647285139152943768893761254735619482964872315281354697
    516428973328197546479536821647285139152943768893761254765319482984672315231854697
    516428973328197546497536128643285719172943865859761234735619482964872351281354697
    516428973328197546497536128643285719172943865859761234765319482984672351231854697
    516428973328197546497536128643285719172943865859761234935672481764819352281354697
    516428973328197546497536128643285719172943865859761234965372481784619352231854697
    516428973328197546497536182643285719172943865859761234735619428964872351281354697
    516428973328197546497536182643285719172943865859761234765319428984672351231854697
    516428973378196542429537816647285139152943768893761254935672481764819325281354697
    516428973378196542429537816647285139152943768893761254965372481784619325231854697
    516428973378196542429537861647285139152943786893761254735619428964872315281354697
    516428973378196542429537861647285139152943786893761254765319428984672315231854697
    516428973378196542429537861647285139152943786893761254935672418764819325281354697
    516428973378196542429537861647285139152943786893761254965372418784619325231854697
    516428973378196542492537168643285719127943856859761234935672481764819325281354697
    516428973378196542492537168643285719127943856859761234965372481784619325231854697
    516428973378196542492537186643285719127943865859761234735619428964872351281354697
    516428973378196542492537186643285719127943865859761234765319428984672351231854697
    516428973378196542492537816647285139125943768839761254763819425954672381281354697
    516428973378196542492537816647285139125943768839761254953672481764819325281354697
    516428973378196542492537861647285139125943786839761254753619428964872315281354697
    516428973378196542492537861647285139125943786839761254763819425954672318281354697
    516428973378196542492537861647285139125943786839761254953672418764819325281354697
    516428973378196542492537861647285139125943786839761254963872415754619328281354697
    516428973378619542429537816647285139152943768893761254735896421964172385281354697
    516428973378619542429537816647285139152943768893761254765392481984176325231854697
    516428973378619542429537816647285139152943768893761254785396421964172385231854697
    516428973378619542429537816647285139152943768893761254935876421764192385281354697
    516428973378619542429537816647285139152943768893761254965372481784196325231854697
    516428973378619542429537816647285139152943768893761254985376421764192385231854697
    516428973378619542429537861647285139152943786893761254735196428964872315281354697
    516428973378619542429537861647285139152943786893761254765392418984176325231854697
    516428973378619542429537861647285139152943786893761254935176428764892315281354697
    516428973378619542429537861647285139152943786893761254965372418784196325231854697
    516428973378619542492537168643285719127943856859761234735896421964172385281354697
    516428973378619542492537168643285719127943856859761234765392481984176325231854697
    516428973378619542492537168643285719127943856859761234785396421964172385231854697
    516428973378619542492537168643285719127943856859761234935876421764192385281354697
    516428973378619542492537168643285719127943856859761234965372481784196325231854697
    516428973378619542492537168643285719127943856859761234985376421764192385231854697
    516428973378619542492537186643285719127943865859761234735196428964872351281354697
    516428973378619542492537186643285719127943865859761234735896421964172358281354697
    516428973378619542492537186643285719127943865859761234785396421964172358231854697
    516428973378619542492537186643285719127943865859761234935176428764892351281354697
    516428973378619542492537186643285719127943865859761234935876421764192358281354697
    516428973378619542492537186643285719127943865859761234985376421764192358231854697
    516428973378619542492537816647285139125943768839761254753896421964172385281354697
    516428973378619542492537816647285139125943768839761254763192485954876321281354697
    516428973378619542492537816647285139125943768839761254953876421764192385281354697
    516428973378619542492537816647285139125943768839761254963172485754896321281354697
    516428973378619542492537861647285139125943786839761254753196428964872315281354697
    516428973378619542492537861647285139125943786839761254763892415954176328281354697
    516428973378619542492537861647285139125943786839761254953176428764892315281354697
    516428973378619542492537861647285139125943786839761254963872415754196328281354697
    516428973398176542427539168643285719172943856859761234735692481964817325281354697
    516428973398176542427539168643285719172943856859761234765392481984617325231854697
    516428973398176542427539186643285719172943865859761234935617428764892351281354697
    516428973398176542427539186643285719172943865859761234965317428784692351231854697
    516428973398176542472539168643285719127943856859761234735692481964817325281354697
    516428973398176542472539168643285719127943856859761234765392481984617325231854697
    516428973398176542472539186643285719127943865859761234935617428764892351281354697
    516428973398176542472539186643285719127943865859761234965317428784692351231854697
    516428973398176542472539816647285139125943768839761254753692481964817325281354697
    516428973398176542472539816647285139125943768839761254963817425754692381281354697
    516428973398176542472539861647285139125943786839761254753692418964817325281354697
    516428973398176542472539861647285139125943786839761254763892415954617328281354697
    516428973398176542472539861647285139125943786839761254953617428764892315281354697
    516428973398176542472539861647285139125943786839761254963817425754692318281354697
    516428973398617542427539168643285719172943856859761234735896421964172385281354697
    516428973398617542427539168643285719172943856859761234765392481984176325231854697
    516428973398617542427539168643285719172943856859761234785396421964172385231854697
    516428973398617542427539168643285719172943856859761234935876421764192385281354697
    516428973398617542427539168643285719172943856859761234965372481784196325231854697
    516428973398617542427539168643285719172943856859761234985376421764192385231854697
    516428973398617542427539186643285719172943865859761234735196428964872351281354697
    516428973398617542427539186643285719172943865859761234735896421964172358281354697
    516428973398617542427539186643285719172943865859761234785396421964172358231854697
    516428973398617542427539186643285719172943865859761234935176428764892351281354697
    516428973398617542427539186643285719172943865859761234935876421764192358281354697
    516428973398617542427539186643285719172943865859761234985376421764192358231854697
    516428973398617542472539168643285719127943856859761234735896421964172385281354697
    516428973398617542472539168643285719127943856859761234765392481984176325231854697
    516428973398617542472539168643285719127943856859761234785396421964172385231854697
    516428973398617542472539168643285719127943856859761234935876421764192385281354697
    516428973398617542472539168643285719127943856859761234965372481784196325231854697
    516428973398617542472539168643285719127943856859761234985376421764192385231854697
    516428973398617542472539186643285719127943865859761234735196428964872351281354697
    516428973398617542472539186643285719127943865859761234735896421964172358281354697
    516428973398617542472539186643285719127943865859761234785396421964172358231854697
    516428973398617542472539186643285719127943865859761234935176428764892351281354697
    516428973398617542472539186643285719127943865859761234935876421764192358281354697
    516428973398617542472539186643285719127943865859761234985376421764192358231854697
    516428973398617542472539816647285139125943768839761254753896421964172385281354697
    516428973398617542472539816647285139125943768839761254763192485954876321281354697
    516428973398617542472539816647285139125943768839761254953876421764192385281354697
    516428973398617542472539816647285139125943768839761254963172485754896321281354697
    516428973398617542472539861647285139125943786839761254753196428964872315281354697
    516428973398617542472539861647285139125943786839761254763892415954176328281354697
    516428973398617542472539861647285139125943786839761254953176428764892315281354697
    516428973398617542472539861647285139125943786839761254963872415754196328281354697
    516428973428379516379516842647285139152943768893761254985637421764192385231854697
    516428973428379561379516428647285139152943786893761254965137842784692315231854697
    516428973428379561379516842647285139152943786893761254965137428784692315231854697
    516428973428379561397516428643285719172943856859761234985637142764192385231854697
    516428973428397516379516842647285139152943768893761254785639421964172385231854697
    516428973428397561379516428647285139152943786893761254765134892984672315231859647
    516428973428397561379516428647285139152943786893761254765139842984672315231854697
    516428973428397561379516842647285139152943786893761254765139428984672315231854697
    516428973428397561397516428643285719172943856859761234785634192964172385231859647
    516428973428397561397516428643285719172943856859761234785639142964172385231854697
    516428973438179526729536148643285719172943865895761234357692481964817352281354697
    516428973438179526729536148643285719172943865895761234367892451954617382281354697
    516428973438179526729536481643285719172943865895761234357692148964817352281354697
    516428973438179526729536841647285139152943768893761254365897412974612385281354697
    516428973438179526792536148643285719127943865859761234375692481964817352281354697
    516428973438179526792536481643285719127943865859761234365897142974612358281354697
    516428973438179526792536481643285719127943865859761234375692148964817352281354697
    516428973438179526927536148643285719172943865859761234365817492784692351291354687
    516428973438179526927536148643285719172943865859761234385617492764892351291354687
    516428973438179526927536148643285719172943865859761234395617482764892351281354697
    516428973438179526927536148643285719172943865895761234359617482764892351281354697
    516428973438179526927536148643285719172943865895761234369817452754692381281354697
    516428973438179526927536481643285719172943865859761234365897142794612358281354697
    516428973438179526972536148643285719127943865859761234365817492784692351291354687
    516428973438179526972536148643285719127943865859761234385617492764892351291354687
    516428973438179526972536148643285719127943865859761234395617482764892351281354697
    516428973438179526972536148643285719127943865895761234359617482764892351281354697
    516428973438179526972536148643285719127943865895761234369817452754692381281354697
    516428973438179526972536481643285719127943865859761234365897142794612358281354697
    516428973438179526972536481647285139125943768893761254359617842764892315281354697
    516428973438179526972536841647285139125943768893761254359617482764892315281354697
    516428973438179562729536148643285719172943856895761234357692481964817325281354697
    516428973438179562729536418647285139152943786893761254375692841964817325281354697
    516428973438179562729536481643285719172943856895761234357692148964817325281354697
    516428973438179562729536481643285719172943856895761234367892145954617328281354697
    516428973438179562729536841647285139152943786893761254375692418964817325281354697
    516428973438179562792536148643285719127943856859761234365897421974612385281354697
    516428973438179562792536148643285719127943856859761234375692481964817325281354697
    516428973438179562792536481643285719127943856859761234375692148964817325281354697
    516428973438179562927536148643285719172943856859761234365897421784612395291354687
    516428973438179562927536148643285719172943856859761234365897421794612385281354697
    516428973438179562927536148643285719172943856859761234385697421764812395291354687
    516428973438179562927536148643285719172943856895761234369817425754692381281354697
    516428973438179562972536148643285719127943856859761234365897421784612395291354687
    516428973438179562972536148643285719127943856859761234365897421794612385281354697
    516428973438179562972536148643285719127943856859761234385697421764812395291354687
    516428973438179562972536148643285719127943856895761234369817425754692381281354697
    516428973438179562972536841647285139125943786893761254359617428764892315281354697
    516428973438179562972536841647285139125943786893761254369817425754692318281354697
    516428973438197526729536148643285719172943865895761234357619482964872351281354697
    516428973438197526729536148643285719172943865895761234367819452954672381281354697
    516428973438197526729536481647285139152943768893761254375614892964872315281359647
    516428973438197526729536481647285139152943768893761254375619842964872315281354697
    516428973438197526729536841647285139152943768893761254365879412974612385281354697
    516428973438197526729536841647285139152943768893761254375619482964872315281354697
    516428973438197526792536148643285719127943865859761234375619482964872351281354697
    516428973438197526792536481643285719127943865859761234365874192974612358281359647
    516428973438197526792536481643285719127943865859761234365879142974612358281354697
    516428973438197526927536148643285719172943865859761234365872491784619352291354687
    516428973438197526927536148643285719172943865859761234385672491764819352291354687
    516428973438197526927536148643285719172943865859761234395672481764819352281354697
    516428973438197526927536148643285719172943865895761234359672481764819352281354697
    516428973438197526927536148643285719172943865895761234369872451754619382281354697
    516428973438197526927536481643285719172943865859761234365874192794612358281359647
    516428973438197526927536481643285719172943865859761234365879142794612358281354697
    516428973438197526927536481643285719172943865859761234395672148764819352281354697
    516428973438197526927536481643285719172943865895761234359672148764819352281354697
    516428973438197526927536481643285719172943865895761234369874152754612398281359647
    516428973438197526972536148643285719127943865859761234365872491784619352291354687
    516428973438197526972536148643285719127943865859761234385672491764819352291354687
    516428973438197526972536148643285719127943865859761234395672481764819352281354697
    516428973438197526972536148643285719127943865895761234359672481764819352281354697
    516428973438197526972536148643285719127943865895761234369872451754619382281354697
    516428973438197526972536481643285719127943865859761234365874192794612358281359647
    516428973438197526972536481643285719127943865859761234365879142794612358281354697
    516428973438197526972536481643285719127943865859761234395672148764819352281354697
    516428973438197526972536481643285719127943865895761234359672148764819352281354697
    516428973438197526972536481643285719127943865895761234369874152754612398281359647
    516428973438197526972536481647285139125943768893761254359674812764812395281359647
    516428973438197526972536841647285139125943768893761254369872415754619382281354697
    516428973438197562729536148643285719172943856895761234367819425954672381281354697
    516428973438197562729536841647285139152943786893761254375619428964872315281354697
    516428973438197562792536148643285719127943856859761234365879421974612385281354697
    516428973438197562927536148643285719172943856859761234365872491784619325291354687
    516428973438197562927536148643285719172943856859761234365879421784612395291354687
    516428973438197562927536148643285719172943856859761234365879421794612385281354697
    516428973438197562927536148643285719172943856859761234385672491764819325291354687
    516428973438197562927536148643285719172943856859761234385679421764812395291354687
    516428973438197562927536148643285719172943856859761234395672481764819325281354697
    516428973438197562927536148643285719172943856895761234359672481764819325281354697
    516428973438197562927536481643285719172943856859761234395672148764819325281354697
    516428973438197562927536481643285719172943856859761234395674128764812395281359647
    516428973438197562927536481643285719172943856895761234359672148764819325281354697
    516428973438197562927536481643285719172943856895761234359674128764812395281359647
    516428973438197562927536481643285719172943856895761234369872145754619328281354697
    516428973438197562927536481643285719172943856895761234369874125754612398281359647
    516428973438197562972536148643285719127943856859761234365872491784619325291354687
    516428973438197562972536148643285719127943856859761234365879421784612395291354687
    516428973438197562972536148643285719127943856859761234365879421794612385281354697
    516428973438197562972536148643285719127943856859761234385672491764819325291354687
    516428973438197562972536148643285719127943856859761234385679421764812395291354687
    516428973438197562972536148643285719127943856859761234395672481764819325281354697
    516428973438197562972536148643285719127943856895761234359672481764819325281354697
    516428973438197562972536418647285139125943786893761254359672841764819325281354697
    516428973438197562972536418647285139125943786893761254359674821764812395281359647
    516428973438197562972536481643285719127943856859761234395672148764819325281354697
    516428973438197562972536481643285719127943856859761234395674128764812395281359647
    516428973438197562972536481643285719127943856895761234359672148764819325281354697
    516428973438197562972536481643285719127943856895761234359674128764812395281359647
    516428973438197562972536481643285719127943856895761234369872145754619328281354697
    516428973438197562972536481643285719127943856895761234369874125754612398281359647
    516428973438197562972536841647285139125943786893761254359672418764819325281354697
    516428973438197562972536841647285139125943786893761254369872415754619328281354697
    516428973478139526329576481647285139152943768893761254935617842764892315281354697
    516428973478139526329576481647285139152943768893761254965317842784692315231854697
    516428973478139526329576841647285139152943768893761254935617482764892315281354697
    516428973478139526329576841647285139152943768893761254965317482784692315231854697
    516428973478139526392576148643285719127943865859761234735692481964817352281354697
    516428973478139526392576148643285719127943865859761234765392481984617352231854697
    516428973478139526392576148643285719127943865859761234935617482764892351281354697
    516428973478139526392576148643285719127943865859761234965317482784692351231854697
    516428973478139526392576481643285719127943865859761234735692148964817352281354697
    516428973478139526392576481643285719127943865859761234765392148984617352231854697
    516428973478139526392576481647285139125943768839761254953617842764892315281354697
    516428973478139526392576841647285139125943768839761254763892415954617382281354697
    516428973478139526392576841647285139125943768839761254953617482764892315281354697
    516428973478139526923576481647285139152943768839761254395617842764892315281354697
    516428973478139526923576841647285139152943768839761254365817492784692315291354687
    516428973478139526923576841647285139152943768839761254365897412784612395291354687
    516428973478139526923576841647285139152943768839761254365897412794612385281354697
    516428973478139526923576841647285139152943768839761254385617492764892315291354687
    516428973478139526923576841647285139152943768839761254385697412764812395291354687
    516428973478139526923576841647285139152943768839761254395617482764892315281354697
    516428973478139526932576148643285719127943865859761234365817492784692351291354687
    516428973478139526932576148643285719127943865859761234385617492764892351291354687
    516428973478139526932576148643285719127943865859761234395617482764892351281354697
    516428973478139526932576148643285719127943865895761234359617482764892351281354697
    516428973478139526932576148643285719127943865895761234369817452754692381281354697
    516428973478139526932576481643285719127943865859761234365897142794612358281354697
    516428973478139526932576481647285139125943768893761254359617842764892315281354697
    516428973478139526932576841647285139125943768893761254359617482764892315281354697
    516428973478139562329576418647285139152943786893761254735692841964817325281354697
    516428973478139562329576418647285139152943786893761254765392841984617325231854697
    516428973478139562329576841647285139152943786893761254735692418964817325281354697
    516428973478139562329576841647285139152943786893761254765392418984617325231854697
    516428973478139562329576841647285139152943786893761254935617428764892315281354697
    516428973478139562329576841647285139152943786893761254965317428784692315231854697
    516428973478139562392576148643285719127943856859761234735692481964817325281354697
    516428973478139562392576148643285719127943856859761234765392481984617325231854697
    516428973478139562392576418647285139125943786839761254753692841964817325281354697
    516428973478139562392576481643285719127943856859761234735692148964817325281354697
    516428973478139562392576481643285719127943856859761234765392148984617325231854697
    516428973478139562392576841647285139125943786839761254753692418964817325281354697
    516428973478139562392576841647285139125943786839761254763892415954617328281354697
    516428973478139562392576841647285139125943786839761254953617428764892315281354697
    516428973478139562392576841647285139125943786839761254963817425754692318281354697
    516428973478139562923576841647285139152943786839761254395617428764892315281354697
    516428973478139562932576148643285719127943856859761234365897421784612395291354687
    516428973478139562932576148643285719127943856859761234365897421794612385281354697
    516428973478139562932576148643285719127943856859761234385697421764812395291354687
    516428973478139562932576148643285719127943856895761234369817425754692381281354697
    516428973478139562932576841647285139125943786893761254359617428764892315281354697
    516428973478139562932576841647285139125943786893761254369817425754692318281354697
    516428973478319526329576481647285139152943768893761254965137842784692315231854697
    516428973478319526329576841647285139152943768893761254965137482784692315231854697
    516428973478319526329576841647285139152943768893761254985637412764192385231854697
    516428973478319526392576148643285719127943865859761234965137482784692351231854697
    516428973478319526392576481643285719127943865859761234985637142764192358231854697
    516428973478319562329576841647285139152943786893761254965137428784692315231854697
    516428973478319562392576148643285719127943856859761234985637421764192385231854697
    516428973478396512329517846647285139152943768893761254785639421964172385231854697
    516428973478396521329517468647285139152943786893761254765134892984672315231859647
    516428973478396521329517468647285139152943786893761254765139842984672315231854697
    516428973478396521329517486647285139152943768893761254765134892984672315231859647
    516428973478396521329517486647285139152943768893761254765139842984672315231854697
    516428973478396521329517846647285139152943768893761254765139482984672315231854697
    516428973478396521329517846647285139152943768893761254785639412964172385231854697
    516428973478396521392517468643285719127943856859761234785634192964172385231859647
    516428973478396521392517468643285719127943856859761234785639142964172385231854697
    516428973478396521392517486643285719127943865859761234785634192964172358231859647
    516428973478396521392517486643285719127943865859761234785639142964172358231854697
    516428973478639512329517468647285139152943786893761254765392841984176325231854697
    516428973478639512329517468647285139152943786893761254965372841784196325231854697
    516428973478639512329517486647285139152943768893761254765392841984176325231854697
    516428973478639512329517486647285139152943768893761254965372841784196325231854697
    516428973478639512329517846647285139152943768893761254735896421964172385281354697
    516428973478639512329517846647285139152943768893761254765392481984176325231854697
    516428973478639512329517846647285139152943768893761254785396421964172385231854697
    516428973478639512329517846647285139152943768893761254935876421764192385281354697
    516428973478639512329517846647285139152943768893761254965372481784196325231854697
    516428973478639512329517846647285139152943768893761254985376421764192385231854697
    516428973478639512392517468647285139125943786839761254763192845954876321281354697
    516428973478639512392517468647285139125943786839761254963172845754896321281354697
    516428973478639512392517486647285139125943768839761254763192845954876321281354697
    516428973478639512392517486647285139125943768839761254963172845754896321281354697
    516428973478639512392517846647285139125943768839761254753896421964172385281354697
    516428973478639512392517846647285139125943768839761254763192485954876321281354697
    516428973478639512392517846647285139125943768839761254953876421764192385281354697
    516428973478639512392517846647285139125943768839761254963172485754896321281354697
    516428973478639512923517846647285139152943768839761254365872491784196325291354687
    516428973478639512923517846647285139152943768839761254395876421764192385281354697
    516428973478639512932517468647285139125943786893761254369172845754896321281354697
    516428973478639512932517486647285139125943768893761254369172845754896321281354697
    516428973478639512932517846647285139125943768893761254359876421764192385281354697
    516428973478639512932517846647285139125943768893761254369172485754896321281354697
    516428973478639521329517468647285139152943786893761254735196842964872315281354697
    516428973478639521329517468647285139152943786893761254935176842764892315281354697
    516428973478639521329517486647285139152943768893761254735196842964872315281354697
    516428973478639521329517486647285139152943768893761254935176842764892315281354697
    516428973478639521329517846647285139152943768893761254735196482964872315281354697
    516428973478639521329517846647285139152943768893761254735896412964172385281354697
    516428973478639521329517846647285139152943768893761254785396412964172385231854697
    516428973478639521329517846647285139152943768893761254935176482764892315281354697
    516428973478639521329517846647285139152943768893761254935876412764192385281354697
    516428973478639521329517846647285139152943768893761254985376412764192385231854697
    516428973478639521392517468643285719127943856859761234735896142964172385281354697
    516428973478639521392517468643285719127943856859761234785396142964172385231854697
    516428973478639521392517468643285719127943856859761234935876142764192385281354697
    516428973478639521392517468643285719127943856859761234985376142764192385231854697
    516428973478639521392517468647285139125943786839761254753196842964872315281354697
    516428973478639521392517468647285139125943786839761254763192845954876312281354697
    516428973478639521392517468647285139125943786839761254953176842764892315281354697
    516428973478639521392517468647285139125943786839761254963172845754896312281354697
    516428973478639521392517486643285719127943865859761234735896142964172358281354697
    516428973478639521392517486643285719127943865859761234765392148984176352231854697
    516428973478639521392517486643285719127943865859761234785396142964172358231854697
    516428973478639521392517486643285719127943865859761234935876142764192358281354697
    516428973478639521392517486643285719127943865859761234965372148784196352231854697
    516428973478639521392517486643285719127943865859761234985376142764192358231854697
    516428973478639521392517486647285139125943768839761254753196842964872315281354697
    516428973478639521392517486647285139125943768839761254763192845954876312281354697
    516428973478639521392517486647285139125943768839761254953176842764892315281354697
    516428973478639521392517486647285139125943768839761254963172845754896312281354697
    516428973478639521392517846647285139125943768839761254753196482964872315281354697
    516428973478639521392517846647285139125943768839761254753896412964172385281354697
    516428973478639521392517846647285139125943768839761254763192485954876312281354697
    516428973478639521392517846647285139125943768839761254763892415954176382281354697
    516428973478639521392517846647285139125943768839761254953176482764892315281354697
    516428973478639521392517846647285139125943768839761254953876412764192385281354697
    516428973478639521392517846647285139125943768839761254963172485754896312281354697
    516428973478639521392517846647285139125943768839761254963872415754196382281354697
    516428973478639521923517468647285139152943786839761254395176842764892315281354697
    516428973478639521923517486647285139152943768839761254395176842764892315281354697
    516428973478639521923517846647285139152943768839761254385176492764892315291354687
    516428973478639521923517846647285139152943768839761254395176482764892315281354697
    516428973478639521923517846647285139152943768839761254395876412764192385281354697
    516428973478639521932517468643285719127943856859761234395876142764192385281354697
    516428973478639521932517468643285719127943856895761234359876142764192385281354697
    516428973478639521932517468643285719127943856895761234369872145754196382281354697
    516428973478639521932517468647285139125943786893761254359176842764892315281354697
    516428973478639521932517468647285139125943786893761254369172845754896312281354697
    516428973478639521932517486643285719127943865859761234395876142764192358281354697
    516428973478639521932517486643285719127943865895761234359876142764192358281354697
    516428973478639521932517486647285139125943768893761254359176842764892315281354697
    516428973478639521932517486647285139125943768893761254369172845754896312281354697
    516428973478639521932517846647285139125943768893761254359176482764892315281354697
    516428973478639521932517846647285139125943768893761254359876412764192385281354697
    516428973478639521932517846647285139125943768893761254369172485754896312281354697
    516428973478639521932517846647285139125943768893761254369872415754196382281354697
    516428973498137526327596148643285719172943865859761234735619482964872351281354697
    516428973498137526327596148643285719172943865859761234765319482984672351231854697
    516428973498137526327596148643285719172943865859761234935672481764819352281354697
    516428973498137526327596148643285719172943865859761234965372481784619352231854697
    516428973498137526327596481643285719172943865859761234935672148764819352281354697
    516428973498137526327596481643285719172943865859761234965372148784619352231854697
    516428973498137526372596148643285719127943865859761234735619482964872351281354697
    516428973498137526372596148643285719127943865859761234765319482984672351231854697
    516428973498137526372596148643285719127943865859761234935672481764819352281354697
    516428973498137526372596148643285719127943865859761234965372481784619352231854697
    516428973498137526372596481643285719127943865859761234935672148764819352281354697
    516428973498137526372596481643285719127943865859761234965372148784619352231854697
    516428973498137526372596481647285139125943768839761254753614892964872315281359647
    516428973498137526372596481647285139125943768839761254753619842964872315281354697
    516428973498137526372596481647285139125943768839761254953674812764812395281359647
    516428973498137526372596841647285139125943768839761254753619482964872315281354697
    516428973498137526372596841647285139125943768839761254963872415754619382281354697
    516428973498137526723596481647285139152943768839761254375614892964872315281359647
    516428973498137526723596481647285139152943768839761254375619842964872315281354697
    516428973498137526723596841647285139152943768839761254365879412974612385281354697
    516428973498137526723596841647285139152943768839761254375619482964872315281354697
    516428973498137526732596148643285719127943865859761234375619482964872351281354697
    516428973498137526732596481643285719127943865859761234365874192974612358281359647
    516428973498137526732596481643285719127943865859761234365879142974612358281354697
    516428973498137562327596148643285719172943856859761234935672481764819325281354697
    516428973498137562327596148643285719172943856859761234965372481784619325231854697
    516428973498137562327596481643285719172943856859761234935672148764819325281354697
    516428973498137562327596481643285719172943856859761234935674128764812395281359647
    516428973498137562327596481643285719172943856859761234965372148784619325231854697
    516428973498137562327596481643285719172943856859761234965374128784612395231859647
    516428973498137562372596148643285719127943856859761234935672481764819325281354697
    516428973498137562372596148643285719127943856859761234965372481784619325231854697
    516428973498137562372596418647285139125943786839761254953672841764819325281354697
    516428973498137562372596418647285139125943786839761254953674821764812395281359647
    516428973498137562372596481643285719127943856859761234935672148764819325281354697
    516428973498137562372596481643285719127943856859761234935674128764812395281359647
    516428973498137562372596481643285719127943856859761234965372148784619325231854697
    516428973498137562372596481643285719127943856859761234965374128784612395231859647
    516428973498137562372596841647285139125943786839761254753619428964872315281354697
    516428973498137562372596841647285139125943786839761254763819425954672318281354697
    516428973498137562372596841647285139125943786839761254953672418764819325281354697
    516428973498137562372596841647285139125943786839761254963872415754619328281354697
    516428973498137562723596841647285139152943786839761254375619428964872315281354697
    516428973498137562732596148643285719127943856859761234365879421974612385281354697
    516428973498317526327596148643285719172943865859761234765139482984672351231854697
    516428973498317526327596481643285719172943865859761234785634192964172358231859647
    516428973498317526327596481643285719172943865859761234785639142964172358231854697
    516428973498317526372596148643285719127943865859761234765139482984672351231854697
    516428973498317526372596481643285719127943865859761234785634192964172358231859647
    516428973498317526372596481643285719127943865859761234785639142964172358231854697
    516428973498317562327596148643285719172943856859761234785639421964172385231854697
    516428973498317562372596148643285719127943856859761234785639421964172385231854697
    516428973498376521327519468643285719172943856859761234985637142764192385231854697
    516428973498376521327519486643285719172943865859761234985637142764192358231854697
    516428973498376521372519468643285719127943856859761234985637142764192385231854697
    516428973498376521372519486643285719127943865859761234985637142764192358231854697
    516428973498637512372519468647285139125943786839761254763192845954876321281354697
    516428973498637512372519468647285139125943786839761254963172845754896321281354697
    516428973498637512372519486647285139125943768839761254763192845954876321281354697
    516428973498637512372519486647285139125943768839761254963172845754896321281354697
    516428973498637512372519846647285139125943768839761254753896421964172385281354697
    516428973498637512372519846647285139125943768839761254763192485954876321281354697
    516428973498637512372519846647285139125943768839761254953876421764192385281354697
    516428973498637512372519846647285139125943768839761254963172485754896321281354697
    516428973498637512723519846647285139152943768839761254375896421964172385281354697
    516428973498637521327519468643285719172943856859761234735896142964172385281354697
    516428973498637521327519468643285719172943856859761234785396142964172385231854697
    516428973498637521327519468643285719172943856859761234935876142764192385281354697
    516428973498637521327519468643285719172943856859761234985376142764192385231854697
    516428973498637521327519486643285719172943865859761234735896142964172358281354697
    516428973498637521327519486643285719172943865859761234765392148984176352231854697
    516428973498637521327519486643285719172943865859761234785396142964172358231854697
    516428973498637521327519486643285719172943865859761234935876142764192358281354697
    516428973498637521327519486643285719172943865859761234965372148784196352231854697
    516428973498637521327519486643285719172943865859761234985376142764192358231854697
    516428973498637521372519468643285719127943856859761234735896142964172385281354697
    516428973498637521372519468643285719127943856859761234785396142964172385231854697
    516428973498637521372519468643285719127943856859761234935876142764192385281354697
    516428973498637521372519468643285719127943856859761234985376142764192385231854697
    516428973498637521372519468647285139125943786839761254753196842964872315281354697
    516428973498637521372519468647285139125943786839761254763192845954876312281354697
    516428973498637521372519468647285139125943786839761254953176842764892315281354697
    516428973498637521372519468647285139125943786839761254963172845754896312281354697
    516428973498637521372519486643285719127943865859761234735896142964172358281354697
    516428973498637521372519486643285719127943865859761234765392148984176352231854697
    516428973498637521372519486643285719127943865859761234785396142964172358231854697
    516428973498637521372519486643285719127943865859761234935876142764192358281354697
    516428973498637521372519486643285719127943865859761234965372148784196352231854697
    516428973498637521372519486643285719127943865859761234985376142764192358231854697
    516428973498637521372519486647285139125943768839761254753196842964872315281354697
    516428973498637521372519486647285139125943768839761254763192845954876312281354697
    516428973498637521372519486647285139125943768839761254953176842764892315281354697
    516428973498637521372519486647285139125943768839761254963172845754896312281354697
    516428973498637521372519846647285139125943768839761254753196482964872315281354697
    516428973498637521372519846647285139125943768839761254753896412964172385281354697
    516428973498637521372519846647285139125943768839761254763192485954876312281354697
    516428973498637521372519846647285139125943768839761254763892415954176382281354697
    516428973498637521372519846647285139125943768839761254953176482764892315281354697
    516428973498637521372519846647285139125943768839761254953876412764192385281354697
    516428973498637521372519846647285139125943768839761254963172485754896312281354697
    516428973498637521372519846647285139125943768839761254963872415754196382281354697
    516428973498637521723519468647285139152943786839761254375196842964872315281354697
    516428973498637521723519486647285139152943768839761254375196842964872315281354697
    516428973498637521723519846647285139152943768839761254375196482964872315281354697
    516428973498637521723519846647285139152943768839761254375896412964172385281354697
    516428973498637521732519468643285719127943856859761234375896142964172385281354697
    516428973498637521732519486643285719127943865859761234375896142964172358281354697
    516428973728139546439576128643285719172943865895761234357692481964817352281354697
    516428973728139546439576128643285719172943865895761234367892451954617382281354697
    516428973728139546439576182643285719172943865895761234367892451954617328281354697
    516428973728139546439576812647285139152943768893761254365897421974612385281354697
    516428973728139546439576812647285139152943768893761254375692481964817325281354697
    516428973728139546439576821647285139152943768893761254365897412974612385281354697
    516428973728139546493576812647285139152943768839761254365897421974612385281354697
    516428973728139546493576812647285139152943768839761254375692481964817325281354697
    516428973728139546493576821647285139152943768839761254365897412974612385281354697
    516428973728639541439517826647285139152943768893761254375196482964872315281354697
    516428973728639541439517826647285139152943768893761254375896412964172385281354697
    516428973728639541439517862647285139152943786893761254375196428964872315281354697
    516428973728639541493517826647285139152943768839761254375196482964872315281354697
    516428973728639541493517826647285139152943768839761254375896412964172385281354697
    516428973728639541493517862647285139152943786839761254375196428964872315281354697
    516428973738196542429537168643285719172943856895761234367819425954672381281354697
    516428973738196542429537186643285719172943865895761234357619428964872351281354697
    516428973738196542429537816647285139152943768893761254365879421974612385281354697
    516428973738196542429537861647285139152943786893761254375619428964872315281354697
    516428973738196542492537168643285719127943856859761234365879421974612385281354697
    516428973738196542492537186643285719127943865859761234365879421974612358281354697
    516428973738196542492537186643285719127943865859761234375619428964872351281354697
    516428973738619542429537168643285719172943856895761234357896421964172385281354697
    516428973738619542429537168643285719172943856895761234367192485954876321281354697
    516428973738619542429537186643285719172943865895761234357196428964872351281354697
    516428973738619542429537186643285719172943865895761234357896421964172358281354697
    516428973738619542429537186643285719172943865895761234367192458954876321281354697
    516428973738619542429537186643285719172943865895761234367892451954176328281354697
    516428973738619542429537816647285139152943768893761254375896421964172385281354697
    516428973738619542429537861647285139152943786893761254375196428964872315281354697
    516428973738619542492537168643285719127943856859761234375896421964172385281354697
    516428973738619542492537186643285719127943865859761234375196428964872351281354697
    516428973738619542492537186643285719127943865859761234375896421964172358281354697
    516428973798136542423579816647285139152943768839761254365897421974612385281354697
    516428973798136542423579816647285139152943768839761254375692481964817325281354697
    516428973798136542423579861647285139152943786839761254375692418964817325281354697
    516428973798136542423597816647285139152943768839761254365879421974612385281354697
    516428973798136542423597861647285139152943786839761254375619428964872315281354697
    516428973798136542432579168643285719127943856859761234365897421974612385281354697
    516428973798136542432579168643285719127943856859761234375692481964817325281354697
    516428973798136542432579186643285719127943865859761234365897421974612358281354697
    516428973798136542432597168643285719127943856859761234365879421974612385281354697
    516428973798136542432597186643285719127943865859761234365879421974612358281354697
    516428973798136542432597186643285719127943865859761234375619428964872351281354697
    516428973928137546437596128643285719172943865859761234365872491784619352291354687
    516428973928137546437596128643285719172943865859761234385672491764819352291354687
    516428973928137546437596128643285719172943865859761234395672481764819352281354697
    516428973928137546437596128643285719172943865895761234359672481764819352281354697
    516428973928137546437596128643285719172943865895761234369872451754619382281354697
    516428973928137546437596182643285719172943865859761234365879421794612358281354697
    516428973928137546437596182643285719172943865895761234369872451754619328281354697
    516428973928137546473596812647285139152943768839761254365872491784619325291354687
    516428973928137546473596812647285139152943768839761254365879421784612395291354687
    516428973928137546473596812647285139152943768839761254365879421794612385281354697
    516428973928137546473596812647285139152943768839761254385672491764819325291354687
    516428973928137546473596812647285139152943768839761254385679421764812395291354687
    516428973928137546473596812647285139152943768839761254395672481764819325281354697
    516428973928137546473596821647285139152943768839761254365879412784612395291354687
    516428973928137546473596821647285139152943768839761254365879412794612385281354697
    516428973928137546473596821647285139152943768839761254385679412764812395291354687
    516428973928637541473519826647285139152943768839761254385176492764892315291354687
    516428973928637541473519826647285139152943768839761254395176482764892315281354697
    516428973928637541473519826647285139152943768839761254395876412764192385281354697
    516428973928637541473519862647285139152943786839761254395176428764892315281354697
    516428973938176542427539168643285719172943856859761234365897421784612395291354687
    516428973938176542427539168643285719172943856859761234365897421794612385281354697
    516428973938176542427539168643285719172943856859761234385697421764812395291354687
    516428973938176542427539168643285719172943856895761234369817425754692381281354697
    516428973938176542427539186643285719172943865859761234365897421794612358281354697
    516428973938176542427539186643285719172943865859761234395617428764892351281354697
    516428973938176542427539186643285719172943865895761234359617428764892351281354697
    516428973938176542472539168643285719127943856859761234365897421784612395291354687
    516428973938176542472539168643285719127943856859761234365897421794612385281354697
    516428973938176542472539168643285719127943856859761234385697421764812395291354687
    516428973938176542472539168643285719127943856895761234369817425754692381281354697
    516428973938176542472539186643285719127943865859761234365897421794612358281354697
    516428973938176542472539186643285719127943865859761234395617428764892351281354697
    516428973938176542472539186643285719127943865895761234359617428764892351281354697
    516428973938176542472539816647285139125943768893761254369817425754692381281354697
    516428973938176542472539861647285139125943786893761254359617428764892315281354697
    516428973938176542472539861647285139125943786893761254369817425754692318281354697
    516428973938617542427539168643285719172943856859761234365872491784196325291354687
    516428973938617542427539168643285719172943856859761234395876421764192385281354697
    516428973938617542427539168643285719172943856895761234359876421764192385281354697
    516428973938617542427539168643285719172943856895761234369172485754896321281354697
    516428973938617542427539186643285719172943865859761234395176428764892351281354697
    516428973938617542427539186643285719172943865859761234395876421764192358281354697
    516428973938617542427539186643285719172943865895761234359176428764892351281354697
    516428973938617542427539186643285719172943865895761234359876421764192358281354697
    516428973938617542427539186643285719172943865895761234369172458754896321281354697
    516428973938617542427539186643285719172943865895761234369872451754196328281354697
    516428973938617542472539168643285719127943856859761234365872491784196325291354687
    516428973938617542472539168643285719127943856859761234395876421764192385281354697
    516428973938617542472539168643285719127943856895761234359876421764192385281354697
    516428973938617542472539168643285719127943856895761234369172485754896321281354697
    516428973938617542472539186643285719127943865859761234395176428764892351281354697
    516428973938617542472539186643285719127943865859761234395876421764192358281354697
    516428973938617542472539186643285719127943865895761234359176428764892351281354697
    516428973938617542472539186643285719127943865895761234359876421764192358281354697
    516428973938617542472539186643285719127943865895761234369172458754896321281354697
    516428973938617542472539186643285719127943865895761234369872451754196328281354697
    516428973938617542472539816647285139125943768893761254359876421764192385281354697
    516428973938617542472539816647285139125943768893761254369172485754896321281354697
    516428973938617542472539861647285139125943786893761254359176428764892315281354697
    516428973938617542472539861647285139125943786893761254369872415754196328281354697
    516428973978136542423579816647285139152943768839761254365897421784612395291354687
    516428973978136542423579816647285139152943768839761254365897421794612385281354697
    516428973978136542423579816647285139152943768839761254385697421764812395291354687
    516428973978136542423579861647285139152943786839761254395617428764892315281354697
    516428973978136542423597816647285139152943768839761254365872491784619325291354687
    516428973978136542423597816647285139152943768839761254365879421784612395291354687
    516428973978136542423597816647285139152943768839761254365879421794612385281354697
    516428973978136542423597816647285139152943768839761254385672491764819325291354687
    516428973978136542423597816647285139152943768839761254385679421764812395291354687
    516428973978136542423597816647285139152943768839761254395672481764819325281354697
    516428973978136542423597861647285139152943786839761254395672418764819325281354697
    516428973978136542432579168643285719127943856859761234365897421784612395291354687
    516428973978136542432579168643285719127943856859761234365897421794612385281354697
    516428973978136542432579168643285719127943856859761234385697421764812395291354687
    516428973978136542432579168643285719127943856895761234369817425754692381281354697
    516428973978136542432579186643285719127943865859761234365897421794612358281354697
    516428973978136542432579186643285719127943865859761234395617428764892351281354697
    516428973978136542432579186643285719127943865895761234359617428764892351281354697
    516428973978136542432579816647285139125943768893761254369817425754692381281354697
    516428973978136542432579861647285139125943786893761254359617428764892315281354697
    516428973978136542432579861647285139125943786893761254369817425754692318281354697
    516428973978136542432597168643285719127943856859761234365872491784619325291354687
    516428973978136542432597168643285719127943856859761234365879421784612395291354687
    516428973978136542432597168643285719127943856859761234365879421794612385281354697
    516428973978136542432597168643285719127943856859761234385672491764819325291354687
    516428973978136542432597168643285719127943856859761234385679421764812395291354687
    516428973978136542432597168643285719127943856859761234395672481764819325281354697
    516428973978136542432597168643285719127943856895761234359672481764819325281354697
    516428973978136542432597186643285719127943865859761234365879421794612358281354697
    516428973978136542432597186643285719127943865895761234369872451754619328281354697
    516428973978136542432597816647285139125943768893761254359672481764819325281354697
    516428973978136542432597861647285139125943786893761254359672418764819325281354697
    516428973978136542432597861647285139125943786893761254369872415754619328281354697
    516824973328179546479536812647285139152943768893761254765392481984617325231458697
    516824973328179546479536821647285139152943768893761254965317482784692315231458697
    516824973328179546497536128643285719172943865859761234765392481984617352231458697
    516824973328179546497536128643285719172943865859761234965317482784692351231458697
    516824973328179546497536182643285719172943865859761234965317428784692351231458697
    516824973328197546479536812647285139152943768893761254965372481784619325231458697
    516824973328197546479536812647285139152943768893761254965378421784612395231459687
    516824973328197546479536821647285139152943768893761254765318492984672315231459687
    516824973328197546479536821647285139152943768893761254765319482984672315231458697
    516824973328197546479536821647285139152943768893761254965378412784612395231459687
    516824973328197546497536128643285719172943865859761234765318492984672351231459687
    516824973328197546497536128643285719172943865859761234765319482984672351231458697
    516824973328197546497536128643285719172943865859761234965372481784619352231458697
    516824973328197546497536182643285719172943865859761234765319428984672351231458697
    516824973378196542429537816647285139152943768893761254965372481784619325231458697
    516824973378196542429537816647285139152943768893761254965378421784612395231459687
    516824973378196542429537861647285139152943786893761254765319428984672315231458697
    516824973378196542429537861647285139152943786893761254965372418784619325231458697
    516824973378196542492537168643285719127943856859761234965372481784619325231458697
    516824973378196542492537168643285719127943856859761234965378421784612395231459687
    516824973378196542492537186643285719127943865859761234765319428984672351231458697
    516824973378619542429537816647285139152943768893761254765392481984176325231458697
    516824973378619542429537816647285139152943768893761254785396421964172385231458697
    516824973378619542429537816647285139152943768893761254965372481784196325231458697
    516824973378619542429537816647285139152943768893761254985376421764192385231458697
    516824973378619542429537861647285139152943786893761254765392418984176325231458697
    516824973378619542429537861647285139152943786893761254965372418784196325231458697
    516824973378619542492537168643285719127943856859761234765392481984176325231458697
    516824973378619542492537168643285719127943856859761234785396421964172385231458697
    516824973378619542492537168643285719127943856859761234965372481784196325231458697
    516824973378619542492537168643285719127943856859761234985376421764192385231458697
    516824973378619542492537186643285719127943865859761234785396421964172358231458697
    516824973378619542492537186643285719127943865859761234985376421764192358231458697
    516824973398176542427539168643285719172943856859761234765392481984617325231458697
    516824973398176542427539186643285719172943865859761234965317428784692351231458697
    516824973398176542472539168643285719127943856859761234765392481984617325231458697
    516824973398176542472539186643285719127943865859761234965317428784692351231458697
    516824973398617542427539168643285719172943856859761234765392481984176325231458697
    516824973398617542427539168643285719172943856859761234785396421964172385231458697
    516824973398617542427539168643285719172943856859761234965372481784196325231458697
    516824973398617542427539168643285719172943856859761234985376421764192385231458697
    516824973398617542427539186643285719172943865859761234785396421964172358231458697
    516824973398617542427539186643285719172943865859761234985376421764192358231458697
    516824973398617542472539168643285719127943856859761234765392481984176325231458697
    516824973398617542472539168643285719127943856859761234785396421964172385231458697
    516824973398617542472539168643285719127943856859761234965372481784196325231458697
    516824973398617542472539168643285719127943856859761234985376421764192385231458697
    516824973398617542472539186643285719127943865859761234785396421964172358231458697
    516824973398617542472539186643285719127943865859761234985376421764192358231458697
    516824973428379516379516842647285139152943768893761254985637421764192385231458697
    516824973428379561379516428647285139152943786893761254965137842784692315231458697
    516824973428379561379516842647285139152943786893761254965137428784692315231458697
    516824973428379561397516428643285719172943856859761234985637142764192385231458697
    516824973428397516379516842647285139152943768893761254785632491964178325231459687
    516824973428397516379516842647285139152943768893761254785639421964172385231458697
    516824973428397561379516428647285139152943786893761254765139842984672315231458697
    516824973428397561379516842647285139152943786893761254765139428984672315231458697
    516824973428397561397516428643285719172943856859761234785639142964172385231458697
    516824973438179562927536481643285719172943856859761234365497128784612395291358647
    516824973438179562972536481643285719127943856859761234365497128784612395291358647
    516824973438197526792536481643285719127943865859761234365472198974618352281359647
    516824973438197526792536481643285719127943865859761234365478192974612358281359647
    516824973438197526927536481643285719172943865859761234365472198784619352291358647
    516824973438197526927536481643285719172943865859761234365472198794618352281359647
    516824973438197526927536481643285719172943865859761234365478192794612358281359647
    516824973438197526927536481643285719172943865895761234369472158754618392281359647
    516824973438197526927536481643285719172943865895761234369478152754612398281359647
    516824973438197526972536481643285719127943865859761234365472198784619352291358647
    516824973438197526972536481643285719127943865859761234365472198794618352281359647
    516824973438197526972536481643285719127943865859761234365478192794612358281359647
    516824973438197526972536481643285719127943865895761234369472158754618392281359647
    516824973438197526972536481643285719127943865895761234369478152754612398281359647
    516824973438197526972536481647285139125943768893761254369472815754618392281359647
    516824973438197562729536418647285139152943786893761254365472891974618325281359647
    516824973438197562792536481643285719127943856859761234365472198974618325281359647
    516824973438197562927536481643285719172943856859761234365472198784619325291358647
    516824973438197562927536481643285719172943856859761234365472198794618325281359647
    516824973438197562927536481643285719172943856859761234365479128784612395291358647
    516824973438197562927536481643285719172943856895761234369478125754612398281359647
    516824973438197562972536481643285719127943856859761234365472198784619325291358647
    516824973438197562972536481643285719127943856859761234365472198794618325281359647
    516824973438197562972536481643285719127943856859761234365479128784612395291358647
    516824973438197562972536481643285719127943856895761234369478125754612398281359647
    516824973478139526329576481647285139152943768893761254965317842784692315231458697
    516824973478139526329576841647285139152943768893761254965317482784692315231458697
    516824973478139526392576148643285719127943865859761234765392481984617352231458697
    516824973478139526392576148643285719127943865859761234965317482784692351231458697
    516824973478139526392576481643285719127943865859761234765392148984617352231458697
    516824973478139526923576481647285139152943768839761254365417892784692315291358647
    516824973478139526923576481647285139152943768839761254365497812784612395291358647
    516824973478139562329576418647285139152943786893761254765392841984617325231458697
    516824973478139562329576841647285139152943786893761254765392418984617325231458697
    516824973478139562329576841647285139152943786893761254965317428784692315231458697
    516824973478139562392576148643285719127943856859761234765392481984617325231458697
    516824973478139562392576481643285719127943856859761234765392148984617325231458697
    516824973478139562923576418647285139152943786839761254365497821784612395291358647
    516824973478139562932576481643285719127943856859761234365497128784612395291358647
    516824973478319526329576481647285139152943768893761254965137842784692315231458697
    516824973478319526329576841647285139152943768893761254965137482784692315231458697
    516824973478319526329576841647285139152943768893761254985637412764192385231458697
    516824973478319526392576148643285719127943865859761234965137482784692351231458697
    516824973478319526392576481643285719127943865859761234985637142764192358231458697
    516824973478319562329576841647285139152943786893761254965137428784692315231458697
    516824973478319562392576148643285719127943856859761234985637421764192385231458697
    516824973478396512329517846647285139152943768893761254785632491964178325231459687
    516824973478396512329517846647285139152943768893761254785639421964172385231458697
    516824973478396521329517468647285139152943786893761254765139842984672315231458697
    516824973478396521329517486647285139152943768893761254765139842984672315231458697
    516824973478396521329517846647285139152943768893761254765138492984672315231459687
    516824973478396521329517846647285139152943768893761254765139482984672315231458697
    516824973478396521329517846647285139152943768893761254785639412964172385231458697
    516824973478396521392517468643285719127943856859761234785639142964172385231458697
    516824973478396521392517486643285719127943865859761234785639142964172358231458697
    516824973478639512329517468647285139152943786893761254765392841984176325231458697
    516824973478639512329517468647285139152943786893761254965372841784196325231458697
    516824973478639512329517486647285139152943768893761254765392841984176325231458697
    516824973478639512329517486647285139152943768893761254965372841784196325231458697
    516824973478639512329517846647285139152943768893761254765392481984176325231458697
    516824973478639512329517846647285139152943768893761254785396421964172385231458697
    516824973478639512329517846647285139152943768893761254965372481784196325231458697
    516824973478639512329517846647285139152943768893761254985376421764192385231458697
    516824973478639512923517468647285139152943786839761254365472891784196325291358647
    516824973478639512923517486647285139152943768839761254365472891784196325291358647
    516824973478639521329517846647285139152943768893761254785396412964172385231458697
    516824973478639521329517846647285139152943768893761254985376412764192385231458697
    516824973478639521392517468643285719127943856859761234785396142964172385231458697
    516824973478639521392517468643285719127943856859761234985376142764192385231458697
    516824973478639521392517486643285719127943865859761234765392148984176352231458697
    516824973478639521392517486643285719127943865859761234785396142964172358231458697
    516824973478639521392517486643285719127943865859761234965372148784196352231458697
    516824973478639521392517486643285719127943865859761234985376142764192358231458697
    516824973478639521932517468643285719127943856859761234385476192764192385291358647
    516824973478639521932517486643285719127943865859761234365472198784196352291358647
    516824973478639521932517486643285719127943865859761234385476192764192358291358647
    516824973498137526327596148643285719172943865859761234765318492984672351231459687
    516824973498137526327596148643285719172943865859761234765319482984672351231458697
    516824973498137526327596148643285719172943865859761234965372481784619352231458697
    516824973498137526327596481643285719172943865859761234965372148784619352231458697
    516824973498137526372596148643285719127943865859761234765318492984672351231459687
    516824973498137526372596148643285719127943865859761234765319482984672351231458697
    516824973498137526372596148643285719127943865859761234965372481784619352231458697
    516824973498137526372596481643285719127943865859761234965372148784619352231458697
    516824973498137526372596481647285139125943768839761254763412895954678312281359647
    516824973498137526372596481647285139125943768839761254963472815754618392281359647
    516824973498137526732596481643285719127943865859761234365472198974618352281359647
    516824973498137526732596481643285719127943865859761234365478192974612358281359647
    516824973498137562327596148643285719172943856859761234965372481784619325231458697
    516824973498137562327596148643285719172943856859761234965378421784612395231459687
    516824973498137562327596481643285719172943856859761234965372148784619325231458697
    516824973498137562372596148643285719127943856859761234965372481784619325231458697
    516824973498137562372596148643285719127943856859761234965378421784612395231459687
    516824973498137562372596418647285139125943786839761254763412895954678321281359647
    516824973498137562372596481643285719127943856859761234965372148784619325231458697
    516824973498137562723596418647285139152943786839761254365472891974618325281359647
    516824973498137562732596481643285719127943856859761234365472198974618325281359647
    516824973498317526327596148643285719172943865859761234765138492984672351231459687
    516824973498317526327596148643285719172943865859761234765139482984672351231458697
    516824973498317526327596148643285719172943865859761234785632491964178352231459687
    516824973498317526327596481643285719172943865859761234785639142964172358231458697
    516824973498317526372596148643285719127943865859761234765138492984672351231459687
    516824973498317526372596148643285719127943865859761234765139482984672351231458697
    516824973498317526372596148643285719127943865859761234785632491964178352231459687
    516824973498317526372596481643285719127943865859761234785639142964172358231458697
    516824973498317562327596148643285719172943856859761234785632491964178325231459687
    516824973498317562327596148643285719172943856859761234785639421964172385231458697
    516824973498317562372596148643285719127943856859761234785632491964178325231459687
    516824973498317562372596148643285719127943856859761234785639421964172385231458697
    516824973498376521327519468643285719172943856859761234985637142764192385231458697
    516824973498376521327519486643285719172943865859761234985637142764192358231458697
    516824973498376521372519468643285719127943856859761234985637142764192385231458697
    516824973498376521372519486643285719127943865859761234985637142764192358231458697
    516824973498637521327519468643285719172943856859761234785396142964172385231458697
    516824973498637521327519468643285719172943856859761234985376142764192385231458697
    516824973498637521327519486643285719172943865859761234765392148984176352231458697
    516824973498637521327519486643285719172943865859761234785396142964172358231458697
    516824973498637521327519486643285719172943865859761234965372148784196352231458697
    516824973498637521327519486643285719172943865859761234985376142764192358231458697
    516824973498637521372519468643285719127943856859761234785396142964172385231458697
    516824973498637521372519468643285719127943856859761234985376142764192385231458697
    516824973498637521372519486643285719127943865859761234765392148984176352231458697
    516824973498637521372519486643285719127943865859761234785396142964172358231458697
    516824973498637521372519486643285719127943865859761234965372148784196352231458697
    516824973498637521372519486643285719127943865859761234985376142764192358231458697
    516827943328194576479536812647285139152943768893761254965372481784619325231458697
    516827943328194576479536812647285139152943768893761254965378421784612395231459687
    516827943328194576479536821647285139152943768893761254765318492984672315231459687
    516827943328194576479536821647285139152943768893761254765319482984672315231458697
    516827943328194576479536821647285139152943768893761254965378412784612395231459687
    516827943328194576497536128643285719172943865859761234765318492984672351231459687
    516827943328194576497536128643285719172943865859761234765319482984672351231458697
    516827943328194576497536128643285719172943865859761234965372481784619352231458697
    516827943328194576497536182643285719172943865859761234765319428984672351231458697
    516827943328419576479536812647285139152943768893761254735692481964178325281354697
    516827943328419576479536812647285139152943768893761254735698421964172385281354697
    516827943328419576479536812647285139152943768893761254935672481764198325281354697
    516827943328419576479536812647285139152943768893761254935678421764192385281354697
    516827943328419576479536821647285139152943768893761254735698412964172385281354697
    516827943328419576479536821647285139152943768893761254935678412764192385281354697
    516827943328419576497536128643285719172943865859761234735692481964178352281354697
    516827943328419576497536128643285719172943865859761234935672481764198352281354697
    516827943328419576497536182643285719172943865859761234735698421964172358281354697
    516827943328419576497536182643285719172943865859761234935678421764192358281354697
    516827943378194526429536871647285139152943768893761254765318492984672315231459687
    516827943378194526429536871647285139152943768893761254765319482984672315231458697
    516827943378194526429536871647285139152943768893761254965378412784612395231459687
    516827943378194526492536178643285719127943865859761234765318492984672351231459687
    516827943378194526492536178643285719127943865859761234765319482984672351231458697
    516827943378194526492536178643285719127943865859761234965372481784619352231458697
    516827943378194526492536718643285179127943865859761234765318492984672351231459687
    516827943378194526492536718643285179127943865859761234765319482984672351231458697
    516827943378194526492536718643285179127943865859761234965372481784619352231458697
    516827943378194526492536781643285179127943865859761234965372418784619352231458697
    516827943378194562429536718647285139152943876893761254965372481784619325231458697
    516827943378194562429536718647285139152943876893761254965378421784612395231459687
    516827943378194562429536781647285139152943876893761254765319428984672315231458697
    516827943378194562429536781647285139152943876893761254965372418784619325231458697
    516827943378194562429536871647285139152943786893761254765319428984672315231458697
    516827943378194562429536871647285139152943786893761254965372418784619325231458697
    516827943378194562492536178643285719127943856859761234965372481784619325231458697
    516827943378194562492536178643285719127943856859761234965378421784612395231459687
    516827943378194562492536718643285179127943856859761234965372481784619325231458697
    516827943378194562492536718643285179127943856859761234965378421784612395231459687
    516827943378194562492536781643285179127943856859761234765319428984672315231458697
    516827943378194562492536781643285179127943856859761234965372418784619325231458697
    516827943378419526429536871647285139152943768893761254735698412964172385281354697
    516827943378419526429536871647285139152943768893761254935678412764192385281354697
    516827943378419526492536178643285719127943865859761234735692481964178352281354697
    516827943378419526492536178643285719127943865859761234935672481764198352281354697
    516827943378419526492536718643285179127943865859761234735692481964178352281354697
    516827943378419526492536718643285179127943865859761234935672481764198352281354697
    516827943378419526492536781643285179127943865859761234735692418964178352281354697
    516827943378419526492536781643285179127943865859761234735698412964172358281354697
    516827943378419526492536781643285179127943865859761234935672418764198352281354697
    516827943378419526492536781643285179127943865859761234935678412764192358281354697
    516827943378419526492536871647285139125943768839761254753698412964172385281354697
    516827943378419526492536871647285139125943768839761254763192485954678312281354697
    516827943378419526492536871647285139125943768839761254953678412764192385281354697
    516827943378419526492536871647285139125943768839761254963172485754698312281354697
    516827943378419562429536718647285139152943876893761254735692481964178325281354697
    516827943378419562429536718647285139152943876893761254735698421964172385281354697
    516827943378419562429536718647285139152943876893761254935672481764198325281354697
    516827943378419562429536718647285139152943876893761254935678421764192385281354697
    516827943378419562429536781647285139152943876893761254735692418964178325281354697
    516827943378419562429536781647285139152943876893761254935672418764198325281354697
    516827943378419562429536871647285139152943786893761254735692418964178325281354697
    516827943378419562429536871647285139152943786893761254935672418764198325281354697
    516827943378419562492536178643285719127943856859761234735692481964178325281354697
    516827943378419562492536178643285719127943856859761234735698421964172385281354697
    516827943378419562492536178643285719127943856859761234935672481764198325281354697
    516827943378419562492536178643285719127943856859761234935678421764192385281354697
    516827943378419562492536718643285179127943856859761234735692481964178325281354697
    516827943378419562492536718643285179127943856859761234735698421964172385281354697
    516827943378419562492536718643285179127943856859761234935672481764198325281354697
    516827943378419562492536718643285179127943856859761234935678421764192385281354697
    516827943378419562492536718647285139125943876839761254753692481964178325281354697
    516827943378419562492536718647285139125943876839761254753698421964172385281354697
    516827943378419562492536718647285139125943876839761254763192485954678321281354697
    516827943378419562492536718647285139125943876839761254763198425954672381281354697
    516827943378419562492536718647285139125943876839761254953672481764198325281354697
    516827943378419562492536718647285139125943876839761254953678421764192385281354697
    516827943378419562492536718647285139125943876839761254963172485754698321281354697
    516827943378419562492536718647285139125943876839761254963178425754692381281354697
    516827943378419562492536781643285179127943856859761234735692418964178325281354697
    516827943378419562492536781643285179127943856859761234935672418764198325281354697
    516827943378419562492536781647285139125943876839761254753692418964178325281354697
    516827943378419562492536781647285139125943876839761254763198425954672318281354697
    516827943378419562492536781647285139125943876839761254953672418764198325281354697
    516827943378419562492536781647285139125943876839761254963178425754692318281354697
    516827943378419562492536871647285139125943786839761254753692418964178325281354697
    516827943378419562492536871647285139125943786839761254763198425954672318281354697
    516827943378419562492536871647285139125943786839761254953672418764198325281354697
    516827943378419562492536871647285139125943786839761254963178425754692318281354697
    516827943398416572427539168643285719172943856859761234735692481964178325281354697
    516827943398416572427539168643285719172943856859761234735698421964172385281354697
    516827943398416572427539168643285719172943856859761234935672481764198325281354697
    516827943398416572427539168643285719172943856859761234935678421764192385281354697
    516827943398416572427539186643285719172943865859761234735698421964172358281354697
    516827943398416572427539186643285719172943865859761234935678421764192358281354697
    516827943398416572472539168643285719127943856859761234735692481964178325281354697
    516827943398416572472539168643285719127943856859761234735698421964172385281354697
    516827943398416572472539168643285719127943856859761234935672481764198325281354697
    516827943398416572472539168643285719127943856859761234935678421764192385281354697
    516827943398416572472539186643285719127943865859761234735698421964172358281354697
    516827943398416572472539186643285719127943865859761234935678421764192358281354697
    516827943398416572472539816647285139125943768839761254753692481964178325281354697
    516827943398416572472539816647285139125943768839761254753698421964172385281354697
    516827943398416572472539816647285139125943768839761254763192485954678321281354697
    516827943398416572472539816647285139125943768839761254763198425954672381281354697
    516827943398416572472539816647285139125943768839761254953672481764198325281354697
    516827943398416572472539816647285139125943768839761254953678421764192385281354697
    516827943398416572472539816647285139125943768839761254963172485754698321281354697
    516827943398416572472539816647285139125943768839761254963178425754692381281354697
    516827943398416572472539861647285139125943786839761254753692418964178325281354697
    516827943398416572472539861647285139125943786839761254763198425954672318281354697
    516827943398416572472539861647285139125943786839761254953672418764198325281354697
    516827943398416572472539861647285139125943786839761254963178425754692318281354697
    516827943398614572427539168643285719172943856859761234765392481984176325231458697
    516827943398614572427539168643285719172943856859761234785396421964172385231458697
    516827943398614572427539168643285719172943856859761234965372481784196325231458697
    516827943398614572427539168643285719172943856859761234985376421764192385231458697
    516827943398614572427539186643285719172943865859761234785396421964172358231458697
    516827943398614572427539186643285719172943865859761234985376421764192358231458697
    516827943398614572472539168643285719127943856859761234765392481984176325231458697
    516827943398614572472539168643285719127943856859761234785396421964172385231458697
    516827943398614572472539168643285719127943856859761234965372481784196325231458697
    516827943398614572472539168643285719127943856859761234985376421764192385231458697
    516827943398614572472539186643285719127943865859761234785396421964172358231458697
    516827943398614572472539186643285719127943865859761234985376421764192358231458697
    516827943428396571379514826647285139152943768893761254765138492984672315231459687
    516827943428396571379514826647285139152943768893761254765139482984672315231458697
    516827943428396571379514826647285139152943768893761254785639412964172385231458697
    516827943428396571379514862647285139152943786893761254765139428984672315231458697
    516827943428639571379514826647285139152943768893761254785396412964172385231458697
    516827943428639571379514826647285139152943768893761254985376412764192385231458697
    516827943428639571379514862647285139152943786893761254765392418984176325231458697
    516827943428639571379514862647285139152943786893761254965372418784196325231458697
    516827943478396512329514768647285139152943876893761254785632491964178325231459687
    516827943478396512329514768647285139152943876893761254785639421964172385231458697
    516827943478396512329514876647285139152943768893761254785632491964178325231459687
    516827943478396512329514876647285139152943768893761254785639421964172385231458697
    516827943478396512392514768643285179127943856859761234785632491964178325231459687
    516827943478396512392514768643285179127943856859761234785639421964172385231458697
    516827943478396512392514786643285179127943865859761234765139428984672351231458697
    516827943478396512392514786643285179127943865859761234785639421964172358231458697
    516827943478396521329514768647285139152943876893761254765138492984672315231459687
    516827943478396521329514768647285139152943876893761254765139482984672315231458697
    516827943478396521329514768647285139152943876893761254785639412964172385231458697
    516827943478396521329514876647285139152943768893761254765138492984672315231459687
    516827943478396521329514876647285139152943768893761254765139482984672315231458697
    516827943478396521329514876647285139152943768893761254785639412964172385231458697
    516827943478396521392514768643285179127943856859761234765138492984672315231459687
    516827943478396521392514768643285179127943856859761234765139482984672315231458697
    516827943478396521392514768643285179127943856859761234785639412964172385231458697
    516827943478396521392514786643285179127943865859761234785639412964172358231458697
    516827943478639512329514768647285139152943876893761254765392481984176325231458697
    516827943478639512329514768647285139152943876893761254785396421964172385231458697
    516827943478639512329514768647285139152943876893761254965372481784196325231458697
    516827943478639512329514768647285139152943876893761254985376421764192385231458697
    516827943478639512329514876647285139152943768893761254765392481984176325231458697
    516827943478639512329514876647285139152943768893761254785396421964172385231458697
    516827943478639512329514876647285139152943768893761254965372481784196325231458697
    516827943478639512329514876647285139152943768893761254985376421764192385231458697
    516827943478639512392514768643285179127943856859761234765392481984176325231458697
    516827943478639512392514768643285179127943856859761234785396421964172385231458697
    516827943478639512392514768643285179127943856859761234965372481784196325231458697
    516827943478639512392514768643285179127943856859761234985376421764192385231458697
    516827943478639512392514786643285179127943865859761234785396421964172358231458697
    516827943478639512392514786643285179127943865859761234985376421764192358231458697
    516827943478639521329514768647285139152943876893761254785396412964172385231458697
    516827943478639521329514768647285139152943876893761254985376412764192385231458697
    516827943478639521329514876647285139152943768893761254785396412964172385231458697
    516827943478639521329514876647285139152943768893761254985376412764192385231458697
    516827943478639521392514768643285179127943856859761234785396412964172385231458697
    516827943478639521392514768643285179127943856859761234985376412764192385231458697
    516827943478639521392514786643285179127943865859761234765392418984176352231458697
    516827943478639521392514786643285179127943865859761234785396412964172358231458697
    516827943478639521392514786643285179127943865859761234965372418784196352231458697
    516827943478639521392514786643285179127943865859761234985376412764192358231458697
    516827943498136572327594168643285719172943856859761234965372481784619325231458697
    516827943498136572327594168643285719172943856859761234965378421784612395231459687
    516827943498136572327594186643285719172943865859761234765319428984672351231458697
    516827943498136572372594168643285719127943856859761234965372481784619325231458697
    516827943498136572372594168643285719127943856859761234965378421784612395231459687
    516827943498136572372594186643285719127943865859761234765319428984672351231458697
    516827943498316572327594168643285719172943856859761234785632491964178325231459687
    516827943498316572327594168643285719172943856859761234785639421964172385231458697
    516827943498316572327594186643285719172943865859761234765139428984672351231458697
    516827943498316572327594186643285719172943865859761234785639421964172358231458697
    516827943498316572372594168643285719127943856859761234785632491964178325231459687
    516827943498316572372594168643285719127943856859761234785639421964172385231458697
    516827943498316572372594186643285719127943865859761234765139428984672351231458697
    516827943498316572372594186643285719127943865859761234785639421964172358231458697
    516827943728439516439516728643285179172943865895761234357692481964178352281354697
    516827943728439516439516728643285179172943865895761234367198452954672381281354697
    516827943728439516439516782643285179172943865895761234357698421964172358281354697
    516827943728439516439516782643285179172943865895761234367192458954678321281354697
    516827943728439516439516872647285139152943768893761254375692481964178325281354697
    516827943728439516439516872647285139152943768893761254375698421964172385281354697
    516827943728439516493516872647285139152943768839761254375692481964178325281354697
    516827943728439516493516872647285139152943768839761254375698421964172385281354697
    516827943728439561439516728643285179172943856895761234357698412964172385281354697
    516827943728439561439516728643285179172943856895761234367192485954678312281354697
    516827943728439561439516728647285139152943876893761254375698412964172385281354697
    516827943728439561439516782643285179172943856895761234357692418964178325281354697
    516827943728439561439516782643285179172943856895761234367198425954672318281354697
    516827943728439561439516782647285139152943876893761254375692418964178325281354697
    516827943728439561439516872647285139152943786893761254375692418964178325281354697
    516827943728439561493516728647285139152943876839761254375698412964172385281354697
    516827943728439561493516782647285139152943876839761254375692418964178325281354697
    516827943728439561493516872647285139152943786839761254375692418964178325281354697
    516827943738419526429536178643285719172943865895761234357692481964178352281354697
    516827943738419526429536178643285719172943865895761234367198452954672381281354697
    516827943738419526429536718643285179172943865895761234357692481964178352281354697
    516827943738419526429536718643285179172943865895761234367198452954672381281354697
    516827943738419526429536781643285179172943865895761234357692418964178352281354697
    516827943738419526429536781643285179172943865895761234357698412964172358281354697
    516827943738419526429536781643285179172943865895761234367192458954678312281354697
    516827943738419526429536781643285179172943865895761234367198452954672318281354697
    516827943738419526429536871647285139152943768893761254375698412964172385281354697
    516827943738419526492536178643285719127943865859761234375692481964178352281354697
    516827943738419526492536718643285179127943865859761234375692481964178352281354697
    516827943738419526492536781643285179127943865859761234375692418964178352281354697
    516827943738419526492536781643285179127943865859761234375698412964172358281354697
    516827943738419562429536178643285719172943856895761234357692481964178325281354697
    516827943738419562429536178643285719172943856895761234357698421964172385281354697
    516827943738419562429536178643285719172943856895761234367192485954678321281354697
    516827943738419562429536178643285719172943856895761234367198425954672381281354697
    516827943738419562429536718643285179172943856895761234357692481964178325281354697
    516827943738419562429536718643285179172943856895761234357698421964172385281354697
    516827943738419562429536718643285179172943856895761234367192485954678321281354697
    516827943738419562429536718643285179172943856895761234367198425954672381281354697
    516827943738419562429536718647285139152943876893761254375692481964178325281354697
    516827943738419562429536718647285139152943876893761254375698421964172385281354697
    516827943738419562429536781643285179172943856895761234357692418964178325281354697
    516827943738419562429536781643285179172943856895761234367198425954672318281354697
    516827943738419562429536781647285139152943876893761254375692418964178325281354697
    516827943738419562429536871647285139152943786893761254375692418964178325281354697
    516827943738419562492536178643285719127943856859761234375692481964178325281354697
    516827943738419562492536178643285719127943856859761234375698421964172385281354697
    516827943738419562492536718643285179127943856859761234375692481964178325281354697
    516827943738419562492536718643285179127943856859761234375698421964172385281354697
    516827943738419562492536781643285179127943856859761234375692418964178325281354697
    516827943798436512423519768647285139152943876839761254375692481964178325281354697
    516827943798436512423519768647285139152943876839761254375698421964172385281354697
    516827943798436512423519876647285139152943768839761254375692481964178325281354697
    516827943798436512423519876647285139152943768839761254375698421964172385281354697
    516827943798436512432519768643285179127943856859761234375692481964178325281354697
    516827943798436512432519768643285179127943856859761234375698421964172385281354697
    516827943798436512432519786643285179127943865859761234375698421964172358281354697
    516827943798436521423519768647285139152943876839761254375698412964172385281354697
    516827943798436521423519876647285139152943768839761254375698412964172385281354697
    516827943798436521432519768643285179127943856859761234375698412964172385281354697
    516827943798436521432519786643285179127943865859761234375692418964178352281354697
    516827943798436521432519786643285179127943865859761234375698412964172358281354697
    516827943928436571473519826647285139152943768839761254365178492784692315291354687
    516827943928436571473519826647285139152943768839761254395678412764192385281354697
    516827943928436571473519862647285139152943786839761254395672418764198325281354697
    516827943938416572427539168643285719172943856859761234385672491764198325291354687
    516827943938416572427539168643285719172943856859761234395672481764198325281354697
    516827943938416572427539168643285719172943856859761234395678421764192385281354697
    516827943938416572427539168643285719172943856895761234359672481764198325281354697
    516827943938416572427539168643285719172943856895761234359678421764192385281354697
    516827943938416572427539168643285719172943856895761234369172485754698321281354697
    516827943938416572427539168643285719172943856895761234369178425754692381281354697
    516827943938416572427539186643285719172943865859761234395678421764192358281354697
    516827943938416572427539186643285719172943865895761234359678421764192358281354697
    516827943938416572427539186643285719172943865895761234369172458754698321281354697
    516827943938416572472539168643285719127943856859761234385672491764198325291354687
    516827943938416572472539168643285719127943856859761234395672481764198325281354697
    516827943938416572472539168643285719127943856859761234395678421764192385281354697
    516827943938416572472539168643285719127943856895761234359672481764198325281354697
    516827943938416572472539168643285719127943856895761234359678421764192385281354697
    516827943938416572472539168643285719127943856895761234369172485754698321281354697
    516827943938416572472539168643285719127943856895761234369178425754692381281354697
    516827943938416572472539186643285719127943865859761234395678421764192358281354697
    516827943938416572472539186643285719127943865895761234359678421764192358281354697
    516827943938416572472539186643285719127943865895761234369172458754698321281354697
    516827943938416572472539816647285139125943768893761254359672481764198325281354697
    516827943938416572472539816647285139125943768893761254359678421764192385281354697
    516827943938416572472539816647285139125943768893761254369172485754698321281354697
    516827943938416572472539816647285139125943768893761254369178425754692381281354697
    516827943938416572472539861647285139125943786893761254359672418764198325281354697
    516827943938416572472539861647285139125943786893761254369178425754692318281354697
    516827943978436512423519768647285139152943876839761254385672491764198325291354687
    516827943978436512423519768647285139152943876839761254395672481764198325281354697
    516827943978436512423519768647285139152943876839761254395678421764192385281354697
    516827943978436512423519876647285139152943768839761254385672491764198325291354687
    516827943978436512423519876647285139152943768839761254395672481764198325281354697
    516827943978436512423519876647285139152943768839761254395678421764192385281354697
    516827943978436512432519768643285179127943856859761234385672491764198325291354687
    516827943978436512432519768643285179127943856859761234395672481764198325281354697
    516827943978436512432519768643285179127943856859761234395678421764192385281354697
    516827943978436512432519768643285179127943856895761234359672481764198325281354697
    516827943978436512432519768643285179127943856895761234359678421764192385281354697
    516827943978436512432519768643285179127943856895761234369172485754698321281354697
    516827943978436512432519768643285179127943856895761234369178425754692381281354697
    516827943978436512432519768647285139125943876893761254359672481764198325281354697
    516827943978436512432519768647285139125943876893761254359678421764192385281354697
    516827943978436512432519768647285139125943876893761254369172485754698321281354697
    516827943978436512432519768647285139125943876893761254369178425754692381281354697
    516827943978436512432519786643285179127943865859761234395678421764192358281354697
    516827943978436512432519786643285179127943865895761234359678421764192358281354697
    516827943978436512432519786643285179127943865895761234369172458754698321281354697
    516827943978436512432519876647285139125943768893761254359672481764198325281354697
    516827943978436512432519876647285139125943768893761254359678421764192385281354697
    516827943978436512432519876647285139125943768893761254369172485754698321281354697
    516827943978436512432519876647285139125943768893761254369178425754692381281354697
    516827943978436521423519768647285139152943876839761254365178492784692315291354687
    516827943978436521423519768647285139152943876839761254395678412764192385281354697
    516827943978436521423519876647285139152943768839761254365178492784692315291354687
    516827943978436521423519876647285139152943768839761254395678412764192385281354697
    516827943978436521432519768643285179127943856859761234365178492784692315291354687
    516827943978436521432519768643285179127943856859761234395678412764192385281354697
    516827943978436521432519768643285179127943856895761234359678412764192385281354697
    516827943978436521432519768643285179127943856895761234369172485754698312281354697
    516827943978436521432519768647285139125943876893761254359678412764192385281354697
    516827943978436521432519768647285139125943876893761254369172485754698312281354697
    516827943978436521432519786643285179127943865859761234395672418764198352281354697
    516827943978436521432519786643285179127943865859761234395678412764192358281354697
    516827943978436521432519786643285179127943865895761234359672418764198352281354697
    516827943978436521432519786643285179127943865895761234359678412764192358281354697
    516827943978436521432519786643285179127943865895761234369172458754698312281354697
    516827943978436521432519786643285179127943865895761234369178452754692318281354697
    516827943978436521432519876647285139125943768893761254359678412764192385281354697
    516827943978436521432519876647285139125943768893761254369172485754698312281354697
    576124983418396572329578416647285139152943768893761254765432891984617325231859647
    576124983418396572329578416647285139152943768893761254965437821784612395231859647
    576124983418396572392578461643285719127943856859761234765432198984617325231859647
    576124983418396572392578461643285719127943856859761234965437128784612395231859647
    576124983428396571319578426647285139152943768893761254965437812784612395231859647
    576124983438697512912538476647285139125943768893761254359476821764812395281359647
    576124983438697521912538476643285719127943865859761234365472198794816352281359647
    576124983438697521912538476643285719127943865895761234369472158754816392281359647
    576124983438697521912538476647285139125943768893761254359476812764812395281359647
    576124983438697521912538476647285139125943768893761254369472815754816392281359647
    576124983498376521312598476643285719127943865859761234765432198984617352231859647
    576124983498637512312598476647285139125943768839761254763412895954876321281359647
    576124983498637512312598476647285139125943768839761254953476821764812395281359647
    576124983498637521312598476647285139125943768839761254753416892964872315281359647
    576124983498637521312598476647285139125943768839761254763412895954876312281359647
    576124983498637521312598476647285139125943768839761254953476812764812395281359647
    576124983498637521312598476647285139125943768839761254963472815754816392281359647
    576128943128439576439576128643285719712943865895761234357692481964817352281354697
    576128943128439576439576128643285719712943865895761234367892451954617382281354697
    576128943128439576439576182643285719712943865895761234367892451954617328281354697
    576128943138479526429536178643285719712943865895761234357692481964817352281354697
    576128943138479526429536178643285719712943865895761234367892451954617382281354697
    576128943138479526429536718643285179712943865895761234357692481964817352281354697
    576128943138479526429536718643285179712943865895761234367892451954617382281354697
    576128943138479526429536781643285179712943865895761234357692418964817352281354697
    576128943138479562429536178643285719712943856895761234357692481964817325281354697
    576128943138479562429536718643285179712943856895761234357692481964817325281354697
    576128943138479562429536781643285179712943856895761234357692418964817325281354697
    576128943138479562429536781643285179712943856895761234367892415954617328281354697
    576128943138496572429537168643285719712943856895761234367819425954672381281354697
    576128943138496572429537186643285719712943865895761234357619428964872351281354697
    576128943138497526429536178643285719712943865895761234357619482964872351281354697
    576128943138497526429536178643285719712943865895761234367819452954672381281354697
    576128943138497526429536718643285179712943865895761234357619482964872351281354697
    576128943138497526429536718643285179712943865895761234367819452954672381281354697
    576128943138497526429536781643285179712943865895761234367819452954672318281354697
    576128943138497562429536178643285719712943856895761234367819425954672381281354697
    576128943138497562429536718643285179712943856895761234367819425954672381281354697
    576128943138497562429536781643285179712943856895761234357619428964872315281354697
    576128943138497562429536781643285179712943856895761234367819425954672318281354697
    576128943318479526429536871647285139152943768893761254935617482764892315281354697
    576128943318479526429536871647285139152943768893761254965317482784692315231854697
    576128943318479526492536178643285719127943865859761234735692481964817352281354697
    576128943318479526492536178643285719127943865859761234765392481984617352231854697
    576128943318479526492536178643285719127943865859761234935617482764892351281354697
    576128943318479526492536178643285719127943865859761234965317482784692351231854697
    576128943318479526492536718643285179127943865859761234735692481964817352281354697
    576128943318479526492536718643285179127943865859761234765392481984617352231854697
    576128943318479526492536718643285179127943865859761234935617482764892351281354697
    576128943318479526492536718643285179127943865859761234965317482784692351231854697
    576128943318479526492536781643285179127943865859761234735692418964817352281354697
    576128943318479526492536781643285179127943865859761234765392418984617352231854697
    576128943318479526492536871647285139125943768839761254763892415954617382281354697
    576128943318479526492536871647285139125943768839761254953617482764892315281354697
    576128943318479562429536718647285139152943876893761254735692481964817325281354697
    576128943318479562429536718647285139152943876893761254765392481984617325231854697
    576128943318479562429536781647285139152943876893761254735692418964817325281354697
    576128943318479562429536781647285139152943876893761254765392418984617325231854697
    576128943318479562429536781647285139152943876893761254935617428764892315281354697
    576128943318479562429536781647285139152943876893761254965317428784692315231854697
    576128943318479562429536871647285139152943786893761254735692418964817325281354697
    576128943318479562429536871647285139152943786893761254765392418984617325231854697
    576128943318479562429536871647285139152943786893761254935617428764892315281354697
    576128943318479562429536871647285139152943786893761254965317428784692315231854697
    576128943318479562492536178643285719127943856859761234735692481964817325281354697
    576128943318479562492536178643285719127943856859761234765392481984617325231854697
    576128943318479562492536718643285179127943856859761234735692481964817325281354697
    576128943318479562492536718643285179127943856859761234765392481984617325231854697
    576128943318479562492536718647285139125943876839761254753692481964817325281354697
    576128943318479562492536718647285139125943876839761254963817425754692381281354697
    576128943318479562492536781643285179127943856859761234735692418964817325281354697
    576128943318479562492536781643285179127943856859761234765392418984617325231854697
    576128943318479562492536781643285179127943856859761234935617428764892315281354697
    576128943318479562492536781643285179127943856859761234965317428784692315231854697
    576128943318479562492536781647285139125943876839761254753692418964817325281354697
    576128943318479562492536781647285139125943876839761254763892415954617328281354697
    576128943318479562492536781647285139125943876839761254953617428764892315281354697
    576128943318479562492536781647285139125943876839761254963817425754692318281354697
    576128943318479562492536871647285139125943786839761254753692418964817325281354697
    576128943318479562492536871647285139125943786839761254763892415954617328281354697
    576128943318479562492536871647285139125943786839761254953617428764892315281354697
    576128943318479562492536871647285139125943786839761254963817425754692318281354697
    576128943318496572429537816647285139152943768893761254935672481764819325281354697
    576128943318496572429537816647285139152943768893761254965372481784619325231854697
    576128943318496572429537861647285139152943786893761254735619428964872315281354697
    576128943318496572429537861647285139152943786893761254765319428984672315231854697
    576128943318496572429537861647285139152943786893761254935672418764819325281354697
    576128943318496572429537861647285139152943786893761254965372418784619325231854697
    576128943318496572492537168643285719127943856859761234935672481764819325281354697
    576128943318496572492537168643285719127943856859761234965372481784619325231854697
    576128943318496572492537186643285719127943865859761234735619428964872351281354697
    576128943318496572492537186643285719127943865859761234765319428984672351231854697
    576128943318496572492537816647285139125943768839761254763819425954672381281354697
    576128943318496572492537816647285139125943768839761254953672481764819325281354697
    576128943318496572492537861647285139125943786839761254753619428964872315281354697
    576128943318496572492537861647285139125943786839761254763819425954672318281354697
    576128943318496572492537861647285139125943786839761254953672418764819325281354697
    576128943318496572492537861647285139125943786839761254963872415754619328281354697
    576128943318497526429536871647285139152943768893761254735619482964872315281354697
    576128943318497526429536871647285139152943768893761254765319482984672315231854697
    576128943318497526492536178643285719127943865859761234735619482964872351281354697
    576128943318497526492536178643285719127943865859761234765319482984672351231854697
    576128943318497526492536178643285719127943865859761234935672481764819352281354697
    576128943318497526492536178643285719127943865859761234965372481784619352231854697
    576128943318497526492536718643285179127943865859761234735619482964872351281354697
    576128943318497526492536718643285179127943865859761234765319482984672351231854697
    576128943318497526492536718643285179127943865859761234935672481764819352281354697
    576128943318497526492536718643285179127943865859761234965372481784619352231854697
    576128943318497526492536781643285179127943865859761234935672418764819352281354697
    576128943318497526492536781643285179127943865859761234965372418784619352231854697
    576128943318497526492536871647285139125943768839761254753619482964872315281354697
    576128943318497526492536871647285139125943768839761254963872415754619382281354697
    576128943318497562429536718647285139152943876893761254935672481764819325281354697
    576128943318497562429536718647285139152943876893761254965372481784619325231854697
    576128943318497562429536781647285139152943876893761254735619428964872315281354697
    576128943318497562429536781647285139152943876893761254765319428984672315231854697
    576128943318497562429536781647285139152943876893761254935672418764819325281354697
    576128943318497562429536781647285139152943876893761254965372418784619325231854697
    576128943318497562429536871647285139152943786893761254735619428964872315281354697
    576128943318497562429536871647285139152943786893761254765319428984672315231854697
    576128943318497562429536871647285139152943786893761254935672418764819325281354697
    576128943318497562429536871647285139152943786893761254965372418784619325231854697
    576128943318497562492536178643285719127943856859761234935672481764819325281354697
    576128943318497562492536178643285719127943856859761234965372481784619325231854697
    576128943318497562492536718643285179127943856859761234935672481764819325281354697
    576128943318497562492536718643285179127943856859761234965372481784619325231854697
    576128943318497562492536718647285139125943876839761254763819425954672381281354697
    576128943318497562492536718647285139125943876839761254953672481764819325281354697
    576128943318497562492536781643285179127943856859761234735619428964872315281354697
    576128943318497562492536781643285179127943856859761234765319428984672315231854697
    576128943318497562492536781643285179127943856859761234935672418764819325281354697
    576128943318497562492536781643285179127943856859761234965372418784619325231854697
    576128943318497562492536781647285139125943876839761254753619428964872315281354697
    576128943318497562492536781647285139125943876839761254763819425954672318281354697
    576128943318497562492536781647285139125943876839761254953672418764819325281354697
    576128943318497562492536781647285139125943876839761254963872415754619328281354697
    576128943318497562492536871647285139125943786839761254753619428964872315281354697
    576128943318497562492536871647285139125943786839761254763819425954672318281354697
    576128943318497562492536871647285139125943786839761254953672418764819325281354697
    576128943318497562492536871647285139125943786839761254963872415754619328281354697
    576128943318694572429537816647285139152943768893761254985376421764812395231459687
    576128943318694572492537168643285719127943856859761234985376421764812395231459687
    576128943328479516419536872647285139152943768893761254735692481964817325281354697
    576128943328479516419536872647285139152943768893761254765392481984617325231854697
    576128943328479561419536728647285139152943876893761254935617482764892315281354697
    576128943328479561419536728647285139152943876893761254965317482784692315231854697
    576128943328479561419536782647285139152943876893761254735692418964817325281354697
    576128943328479561419536782647285139152943876893761254765392418984617325231854697
    576128943328479561419536782647285139152943876893761254935617428764892315281354697
    576128943328479561419536782647285139152943876893761254965317428784692315231854697
    576128943328479561419536872647285139152943786893761254735692418964817325281354697
    576128943328479561419536872647285139152943786893761254765392418984617325231854697
    576128943328479561419536872647285139152943786893761254935617428764892315281354697
    576128943328479561419536872647285139152943786893761254965317428784692315231854697
    576128943328496571419537826647285139152943768893761254735619482964872315281354697
    576128943328496571419537826647285139152943768893761254765319482984672315231854697
    576128943328496571419537862647285139152943786893761254735619428964872315281354697
    576128943328496571419537862647285139152943786893761254765319428984672315231854697
    576128943328496571419537862647285139152943786893761254935672418764819325281354697
    576128943328496571419537862647285139152943786893761254965372418784619325231854697
    576128943328497516419536872647285139152943768893761254935672481764819325281354697
    576128943328497516419536872647285139152943768893761254965372481784619325231854697
    576128943328497561419536728647285139152943876893761254735619482964872315281354697
    576128943328497561419536728647285139152943876893761254765319482984672315231854697
    576128943328497561419536782647285139152943876893761254735619428964872315281354697
    576128943328497561419536782647285139152943876893761254765319428984672315231854697
    576128943328497561419536782647285139152943876893761254935672418764819325281354697
    576128943328497561419536782647285139152943876893761254965372418784619325231854697
    576128943328497561419536872647285139152943786893761254735619428964872315281354697
    576128943328497561419536872647285139152943786893761254765319428984672315231854697
    576128943328497561419536872647285139152943786893761254935672418764819325281354697
    576128943328497561419536872647285139152943786893761254965372418784619325231854697
    576128943328694571419537826647285139152943768893761254785316492964872315231459687
    576128943328694571419537826647285139152943768893761254985376412764812395231459687
    576128943398476512412539768643285179127943856859761234735692481964817325281354697
    576128943398476512412539768643285179127943856859761234765392481984617325231854697
    576128943398476512412539768647285139125943876839761254753692481964817325281354697
    576128943398476512412539768647285139125943876839761254963817425754692381281354697
    576128943398476512412539786643285179127943865859761234935617428764892351281354697
    576128943398476512412539786643285179127943865859761234965317428784692351231854697
    576128943398476512412539876647285139125943768839761254753692481964817325281354697
    576128943398476512412539876647285139125943768839761254963817425754692381281354697
    576128943398476521412539768643285179127943856859761234935617482764892315281354697
    576128943398476521412539768643285179127943856859761234965317482784692315231854697
    576128943398476521412539768647285139125943876839761254763892415954617382281354697
    576128943398476521412539768647285139125943876839761254953617482764892315281354697
    576128943398476521412539786643285179127943865859761234735692418964817352281354697
    576128943398476521412539786643285179127943865859761234765392418984617352231854697
    576128943398476521412539876647285139125943768839761254763892415954617382281354697
    576128943398476521412539876647285139125943768839761254953617482764892315281354697
    576128943418396572329574816647285139152943768893761254765832491984617325231459687
    576128943418396572329574816647285139152943768893761254785632491964817325231459687
    576128943418396572329574816647285139152943768893761254965837421784612395231459687
    576128943418396572329574816647285139152943768893761254985637421764812395231459687
    576128943418396572392574168643285719127943856859761234765832491984617325231459687
    576128943418396572392574168643285719127943856859761234785632491964817325231459687
    576128943418396572392574168643285719127943856859761234965837421784612395231459687
    576128943418396572392574168643285719127943856859761234985637421764812395231459687
    576128943428396571319574826647285139152943768893761254965837412784612395231459687
    576128943428396571319574826647285139152943768893761254985637412764812395231459687
    576128943498376512312594768643285179127943856859761234765832491984617325231459687
    576128943498376512312594768643285179127943856859761234785632491964817325231459687
    576128943498376512312594768643285179127943856859761234965837421784612395231459687
    576128943498376512312594768643285179127943856859761234985637421764812395231459687
    576128943498376521312594768643285179127943856859761234965837412784612395231459687
    576128943498376521312594768643285179127943856859761234985637412764812395231459687
    576128943498637512312594768643285179127943856859761234985376421764812395231459687
    576128943498637521312594768643285179127943856859761234785316492964872315231459687
    576128943498637521312594768643285179127943856859761234985376412764812395231459687
    576128943918436572423579816647285139152943768839761254365897421784612395291354687
    576128943918436572423579816647285139152943768839761254365897421794612385281354697
    576128943918436572423579816647285139152943768839761254385697421764812395291354687
    576128943918436572423579861647285139152943786839761254395617428764892315281354697
    576128943918436572423597816647285139152943768839761254365872491784619325291354687
    576128943918436572423597816647285139152943768839761254365879421784612395291354687
    576128943918436572423597816647285139152943768839761254365879421794612385281354697
    576128943918436572423597816647285139152943768839761254385672491764819325291354687
    576128943918436572423597816647285139152943768839761254385679421764812395291354687
    576128943918436572423597816647285139152943768839761254395672481764819325281354697
    576128943918436572423597861647285139152943786839761254395672418764819325281354697
    576128943918436572432579168643285719127943856859761234365897421784612395291354687
    576128943918436572432579168643285719127943856859761234365897421794612385281354697
    576128943918436572432579168643285719127943856859761234385697421764812395291354687
    576128943918436572432579168643285719127943856895761234369817425754692381281354697
    576128943918436572432579186643285719127943865859761234365897421794612358281354697
    576128943918436572432579186643285719127943865859761234395617428764892351281354697
    576128943918436572432579186643285719127943865895761234359617428764892351281354697
    576128943918436572432579816647285139125943768893761254369817425754692381281354697
    576128943918436572432579861647285139125943786893761254359617428764892315281354697
    576128943918436572432579861647285139125943786893761254369817425754692318281354697
    576128943918436572432597168643285719127943856859761234365872491784619325291354687
    576128943918436572432597168643285719127943856859761234365879421784612395291354687
    576128943918436572432597168643285719127943856859761234365879421794612385281354697
    576128943918436572432597168643285719127943856859761234385672491764819325291354687
    576128943918436572432597168643285719127943856859761234385679421764812395291354687
    576128943918436572432597168643285719127943856859761234395672481764819325281354697
    576128943918436572432597168643285719127943856895761234359672481764819325281354697
    576128943918436572432597186643285719127943865859761234365879421794612358281354697
    576128943918436572432597186643285719127943865895761234369872451754619328281354697
    576128943918436572432597816647285139125943768893761254359672481764819325281354697
    576128943918436572432597861647285139125943786893761254359672418764819325281354697
    576128943918436572432597861647285139125943786893761254369872415754619328281354697
    576128943918437526423596871647285139152943768839761254365879412784612395291354687
    576128943918437526423596871647285139152943768839761254365879412794612385281354697
    576128943918437526423596871647285139152943768839761254385679412764812395291354687
    576128943918437526432596178643285719127943865859761234365872491784619352291354687
    576128943918437526432596178643285719127943865859761234385672491764819352291354687
    576128943918437526432596178643285719127943865859761234395672481764819352281354697
    576128943918437526432596178643285719127943865895761234359672481764819352281354697
    576128943918437526432596178643285719127943865895761234369872451754619382281354697
    576128943918437526432596718643285179127943865859761234365872491784619352291354687
    576128943918437526432596718643285179127943865859761234385672491764819352291354687
    576128943918437526432596718643285179127943865859761234395672481764819352281354697
    576128943918437526432596718643285179127943865895761234359672481764819352281354697
    576128943918437526432596718643285179127943865895761234369872451754619382281354697
    576128943918437526432596781643285179127943865859761234365879412794612358281354697
    576128943918437526432596781643285179127943865859761234395672418764819352281354697
    576128943918437526432596781643285179127943865895761234359672418764819352281354697
    576128943918437526432596871647285139125943768893761254369872415754619382281354697
    576128943918437562423596718647285139152943876839761254365872491784619325291354687
    576128943918437562423596718647285139152943876839761254365879421784612395291354687
    576128943918437562423596718647285139152943876839761254365879421794612385281354697
    576128943918437562423596718647285139152943876839761254385672491764819325291354687
    576128943918437562423596718647285139152943876839761254385679421764812395291354687
    576128943918437562423596718647285139152943876839761254395672481764819325281354697
    576128943918437562423596781647285139152943876839761254395672418764819325281354697
    576128943918437562423596871647285139152943786839761254395672418764819325281354697
    576128943918437562432596178643285719127943856859761234365872491784619325291354687
    576128943918437562432596178643285719127943856859761234365879421784612395291354687
    576128943918437562432596178643285719127943856859761234365879421794612385281354697
    576128943918437562432596178643285719127943856859761234385672491764819325291354687
    576128943918437562432596178643285719127943856859761234385679421764812395291354687
    576128943918437562432596178643285719127943856859761234395672481764819325281354697
    576128943918437562432596178643285719127943856895761234359672481764819325281354697
    576128943918437562432596718643285179127943856859761234365872491784619325291354687
    576128943918437562432596718643285179127943856859761234365879421784612395291354687
    576128943918437562432596718643285179127943856859761234365879421794612385281354697
    576128943918437562432596718643285179127943856859761234385672491764819325291354687
    576128943918437562432596718643285179127943856859761234385679421764812395291354687
    576128943918437562432596718643285179127943856859761234395672481764819325281354697
    576128943918437562432596718643285179127943856895761234359672481764819325281354697
    576128943918437562432596718647285139125943876893761254359672481764819325281354697
    576128943918437562432596781643285179127943856859761234395672418764819325281354697
    576128943918437562432596781643285179127943856895761234359672418764819325281354697
    576128943918437562432596781643285179127943856895761234369872415754619328281354697
    576128943918437562432596781647285139125943876893761254359672418764819325281354697
    576128943918437562432596781647285139125943876893761254369872415754619328281354697
    576128943918437562432596871647285139125943786893761254359672418764819325281354697
    576128943918437562432596871647285139125943786893761254369872415754619328281354697
    576128943928436571413579826647285139152943768839761254365817492784692315291354687
    576128943928436571413579826647285139152943768839761254365897412784612395291354687
    576128943928436571413579826647285139152943768839761254365897412794612385281354697
    576128943928436571413579826647285139152943768839761254385617492764892315291354687
    576128943928436571413579826647285139152943768839761254385697412764812395291354687
    576128943928436571413579826647285139152943768839761254395617482764892315281354697
    576128943928436571413579862647285139152943786839761254395617428764892315281354697
    576128943928436571413597826647285139152943768839761254365879412784612395291354687
    576128943928436571413597826647285139152943768839761254365879412794612385281354697
    576128943928436571413597826647285139152943768839761254385679412764812395291354687
    576128943928436571413597862647285139152943786839761254395672418764819325281354697
    576128943928437516413596872647285139152943768839761254365872491784619325291354687
    576128943928437516413596872647285139152943768839761254365879421784612395291354687
    576128943928437516413596872647285139152943768839761254365879421794612385281354697
    576128943928437516413596872647285139152943768839761254385672491764819325291354687
    576128943928437516413596872647285139152943768839761254385679421764812395291354687
    576128943928437516413596872647285139152943768839761254395672481764819325281354697
    576128943928437561413596728647285139152943876839761254365879412784612395291354687
    576128943928437561413596728647285139152943876839761254365879412794612385281354697
    576128943928437561413596728647285139152943876839761254385679412764812395291354687
    576128943928437561413596782647285139152943876839761254395672418764819325281354697
    576128943928437561413596872647285139152943786839761254395672418764819325281354697
    576128943938476512412539768643285179127943856859761234365897421784612395291354687
    576128943938476512412539768643285179127943856859761234365897421794612385281354697
    576128943938476512412539768643285179127943856859761234385697421764812395291354687
    576128943938476512412539768643285179127943856895761234369817425754692381281354697
    576128943938476512412539768647285139125943876893761254369817425754692381281354697
    576128943938476512412539786643285179127943865859761234365897421794612358281354697
    576128943938476512412539786643285179127943865859761234395617428764892351281354697
    576128943938476512412539786643285179127943865895761234359617428764892351281354697
    576128943938476512412539876647285139125943768893761254369817425754692381281354697
    576128943938476521412539768643285179127943856859761234365817492784692315291354687
    576128943938476521412539768643285179127943856859761234365897412784612395291354687
    576128943938476521412539768643285179127943856859761234365897412794612385281354697
    576128943938476521412539768643285179127943856859761234385617492764892315291354687
    576128943938476521412539768643285179127943856859761234385697412764812395291354687
    576128943938476521412539768643285179127943856859761234395617482764892315281354697
    576128943938476521412539768643285179127943856895761234359617482764892315281354697
    576128943938476521412539768647285139125943876893761254359617482764892315281354697
    576128943938476521412539786643285179127943865859761234365897412794612358281354697
    576128943938476521412539786643285179127943865895761234369817452754692318281354697
    576128943938476521412539876647285139125943768893761254359617482764892315281354697
    576428913328179546419536872647285139152943768893761254735692481964817325281354697
    576428913328179546419536872647285139152943768893761254765392481984617325231854697
    576428913328197546419536872647285139152943768893761254935672481764819325281354697
    576428913328197546419536872647285139152943768893761254965372481784619325231854697
    576428913398176542412539768643285179127943856859761234735692481964817325281354697
    576428913398176542412539768643285179127943856859761234765392481984617325231854697
    576428913398176542412539768647285139125943876839761254753692481964817325281354697
    576428913398176542412539768647285139125943876839761254963817425754692381281354697
    576428913398176542412539786643285179127943865859761234935617428764892351281354697
    576428913398176542412539786643285179127943865859761234965317428784692351231854697
    576428913398176542412539876647285139125943768839761254753692481964817325281354697
    576428913398176542412539876647285139125943768839761254963817425754692381281354697
    576428913398617542412539768643285179127943856859761234735896421964172385281354697
    576428913398617542412539768643285179127943856859761234765392481984176325231854697
    576428913398617542412539768643285179127943856859761234785396421964172385231854697
    576428913398617542412539768643285179127943856859761234935876421764192385281354697
    576428913398617542412539768643285179127943856859761234965372481784196325231854697
    576428913398617542412539768643285179127943856859761234985376421764192385231854697
    576428913398617542412539768647285139125943876839761254753896421964172385281354697
    576428913398617542412539768647285139125943876839761254763192485954876321281354697
    576428913398617542412539768647285139125943876839761254953876421764192385281354697
    576428913398617542412539768647285139125943876839761254963172485754896321281354697
    576428913398617542412539786643285179127943865859761234735196428964872351281354697
    576428913398617542412539786643285179127943865859761234735896421964172358281354697
    576428913398617542412539786643285179127943865859761234785396421964172358231854697
    576428913398617542412539786643285179127943865859761234935176428764892351281354697
    576428913398617542412539786643285179127943865859761234935876421764192358281354697
    576428913398617542412539786643285179127943865859761234985376421764192358231854697
    576428913398617542412539876647285139125943768839761254753896421964172385281354697
    576428913398617542412539876647285139125943768839761254763192485954876321281354697
    576428913398617542412539876647285139125943768839761254953876421764192385281354697
    576428913398617542412539876647285139125943768839761254963172485754896321281354697
    576428913418379526392516748643285179127943865859761234965137482784692351231854697
    576428913418379562329516748647285139152943876893761254985637421764192385231854697
    576428913418379562392516748643285179127943856859761234985637421764192385231854697
    576428913418396572329517846647285139152943768893761254785639421964172385231854697
    576428913418397526392516748643285179127943865859761234765139482984672351231854697
    576428913418397562329516748647285139152943876893761254785639421964172385231854697
    576428913418397562392516748643285179127943856859761234785639421964172385231854697
    576428913418639572329517468647285139152943786893761254765392841984176325231854697
    576428913418639572329517468647285139152943786893761254965372841784196325231854697
    576428913418639572329517486647285139152943768893761254765392841984176325231854697
    576428913418639572329517486647285139152943768893761254965372841784196325231854697
    576428913418639572329517846647285139152943768893761254735896421964172385281354697
    576428913418639572329517846647285139152943768893761254765392481984176325231854697
    576428913418639572329517846647285139152943768893761254785396421964172385231854697
    576428913418639572329517846647285139152943768893761254935876421764192385281354697
    576428913418639572329517846647285139152943768893761254965372481784196325231854697
    576428913418639572329517846647285139152943768893761254985376421764192385231854697
    576428913418639572392517468647285139125943786839761254763192845954876321281354697
    576428913418639572392517468647285139125943786839761254963172845754896321281354697
    576428913418639572392517486647285139125943768839761254763192845954876321281354697
    576428913418639572392517486647285139125943768839761254963172845754896321281354697
    576428913418639572392517846647285139125943768839761254753896421964172385281354697
    576428913418639572392517846647285139125943768839761254763192485954876321281354697
    576428913418639572392517846647285139125943768839761254953876421764192385281354697
    576428913418639572392517846647285139125943768839761254963172485754896321281354697
    576428913418639572923517846647285139152943768839761254365872491784196325291354687
    576428913418639572923517846647285139152943768839761254395876421764192385281354697
    576428913418639572932517468647285139125943786893761254369172845754896321281354697
    576428913418639572932517486647285139125943768893761254369172845754896321281354697
    576428913418639572932517846647285139125943768893761254359876421764192385281354697
    576428913418639572932517846647285139125943768893761254369172485754896321281354697
    576428913428139576319576482647285139152943768893761254735692841964817325281354697
    576428913428139576319576482647285139152943768893761254765392841984617325231854697
    576428913428139576319576842647285139152943768893761254735692481964817325281354697
    576428913428139576319576842647285139152943768893761254765392481984617325231854697
    576428913428139576913576842647285139152943768839761254365897421784612395291354687
    576428913428139576913576842647285139152943768839761254365897421794612385281354697
    576428913428139576913576842647285139152943768839761254385697421764812395291354687
    576428913428319576319576842647285139152943768893761254985637421764192385231854697
    576428913438179526129536748643285179712943865895761234357692481964817352281354697
    576428913438179526129536748643285179712943865895761234367892451954617382281354697
    576428913438179526912536748643285179127943865859761234365817492784692351291354687
    576428913438179526912536748643285179127943865859761234385617492764892351291354687
    576428913438179526912536748643285179127943865859761234395617482764892351281354697
    576428913438179526912536748643285179127943865895761234359617482764892351281354697
    576428913438179526912536748643285179127943865895761234369817452754692381281354697
    576428913438179562129536748643285179712943856895761234357692481964817325281354697
    576428913438179562912536748643285179127943856859761234365897421784612395291354687
    576428913438179562912536748643285179127943856859761234365897421794612385281354697
    576428913438179562912536748643285179127943856859761234385697421764812395291354687
    576428913438179562912536748643285179127943856895761234369817425754692381281354697
    576428913438179562912536748647285139125943876893761254369817425754692381281354697
    576428913438196572912537468647285139125943786893761254359672841764819325281354697
    576428913438196572912537468647285139125943786893761254359674821764812395281359647
    576428913438196572912537486647285139125943768893761254359672841764819325281354697
    576428913438196572912537486647285139125943768893761254359674821764812395281359647
    576428913438196572912537846647285139125943768893761254359672481764819325281354697
    576428913438197526129536748643285179712943865895761234357619482964872351281354697
    576428913438197526129536748643285179712943865895761234367819452954672381281354697
    576428913438197526912536748643285179127943865859761234365872491784619352291354687
    576428913438197526912536748643285179127943865859761234385672491764819352291354687
    576428913438197526912536748643285179127943865859761234395672481764819352281354697
    576428913438197526912536748643285179127943865895761234359672481764819352281354697
    576428913438197526912536748643285179127943865895761234369872451754619382281354697
    576428913438197562129536748643285179712943856895761234367819425954672381281354697
    576428913438197562912536478647285139125943786893761254359672841764819325281354697
    576428913438197562912536478647285139125943786893761254359674821764812395281359647
    576428913438197562912536748643285179127943856859761234365872491784619325291354687
    576428913438197562912536748643285179127943856859761234365879421784612395291354687
    576428913438197562912536748643285179127943856859761234365879421794612385281354697
    576428913438197562912536748643285179127943856859761234385672491764819325291354687
    576428913438197562912536748643285179127943856859761234385679421764812395291354687
    576428913438197562912536748643285179127943856859761234395672481764819325281354697
    576428913438197562912536748643285179127943856895761234359672481764819325281354697
    576428913438197562912536748647285139125943876893761254359672481764819325281354697
    576428913438619572912537468647285139125943786893761254369172845754896321281354697
    576428913438619572912537486647285139125943768893761254369172845754896321281354697
    576428913438619572912537846647285139125943768893761254359876421764192385281354697
    576428913438619572912537846647285139125943768893761254369172485754896321281354697
    576428913498136572312579468647285139125943786839761254753692841964817325281354697
    576428913498136572312579486647285139125943768839761254753692841964817325281354697
    576428913498136572312579846647285139125943768839761254753692481964817325281354697
    576428913498136572312579846647285139125943768839761254963817425754692381281354697
    576428913498136572312597468647285139125943786839761254953672841764819325281354697
    576428913498136572312597468647285139125943786839761254953674821764812395281359647
    576428913498136572312597486647285139125943768839761254953672841764819325281354697
    576428913498136572312597486647285139125943768839761254953674821764812395281359647
    576428913498136572312597846647285139125943768839761254763819425954672381281354697
    576428913498136572312597846647285139125943768839761254953672481764819325281354697
    576428913498137526312596748643285179127943865859761234735619482964872351281354697
    576428913498137526312596748643285179127943865859761234765319482984672351231854697
    576428913498137526312596748643285179127943865859761234935672481764819352281354697
    576428913498137526312596748643285179127943865859761234965372481784619352231854697
    576428913498137562312596478647285139125943786839761254953672841764819325281354697
    576428913498137562312596478647285139125943786839761254953674821764812395281359647
    576428913498137562312596748643285179127943856859761234935672481764819325281354697
    576428913498137562312596748643285179127943856859761234965372481784619325231854697
    576428913498137562312596748647285139125943876839761254763819425954672381281354697
    576428913498137562312596748647285139125943876839761254953672481764819325281354697
    576428913498317526312596748643285179127943865859761234765139482984672351231854697
    576428913498317562312596748643285179127943856859761234785639421964172385231854697
    576428913918637542423519768647285139152943876839761254365872491784196325291354687
    576428913918637542423519768647285139152943876839761254395876421764192385281354697
    576428913918637542423519876647285139152943768839761254365872491784196325291354687
    576428913918637542423519876647285139152943768839761254395876421764192385281354697
    576428913918637542432519768643285179127943856859761234365872491784196325291354687
    576428913918637542432519768643285179127943856859761234395876421764192385281354697
    576428913918637542432519768643285179127943856895761234359876421764192385281354697
    576428913918637542432519768643285179127943856895761234369172485754896321281354697
    576428913918637542432519768647285139125943876893761254359876421764192385281354697
    576428913918637542432519768647285139125943876893761254369172485754896321281354697
    576428913918637542432519786643285179127943865859761234395176428764892351281354697
    576428913918637542432519786643285179127943865859761234395876421764192358281354697
    576428913918637542432519786643285179127943865895761234359176428764892351281354697
    576428913918637542432519786643285179127943865895761234359876421764192358281354697
    576428913918637542432519786643285179127943865895761234369172458754896321281354697
    576428913918637542432519786643285179127943865895761234369872451754196328281354697
    576428913918637542432519876647285139125943768893761254359876421764192385281354697
    576428913918637542432519876647285139125943768893761254369172485754896321281354697
    576428913928137546413596872647285139152943768839761254365872491784619325291354687
    576428913928137546413596872647285139152943768839761254365879421784612395291354687
    576428913928137546413596872647285139152943768839761254365879421794612385281354697
    576428913928137546413596872647285139152943768839761254385672491764819325291354687
    576428913928137546413596872647285139152943768839761254385679421764812395291354687
    576428913928137546413596872647285139152943768839761254395672481764819325281354697
    576428913938176542412539768643285179127943856859761234365897421784612395291354687
    576428913938176542412539768643285179127943856859761234365897421794612385281354697
    576428913938176542412539768643285179127943856859761234385697421764812395291354687
    576428913938176542412539768643285179127943856895761234369817425754692381281354697
    576428913938176542412539768647285139125943876893761254369817425754692381281354697
    576428913938176542412539786643285179127943865859761234365897421794612358281354697
    576428913938176542412539786643285179127943865859761234395617428764892351281354697
    576428913938176542412539786643285179127943865895761234359617428764892351281354697
    576428913938176542412539876647285139125943768893761254369817425754692381281354697
    576428913938617542412539768643285179127943856859761234365872491784196325291354687
    576428913938617542412539768643285179127943856859761234395876421764192385281354697
    576428913938617542412539768643285179127943856895761234359876421764192385281354697
    576428913938617542412539768643285179127943856895761234369172485754896321281354697
    576428913938617542412539768647285139125943876893761254359876421764192385281354697
    576428913938617542412539768647285139125943876893761254369172485754896321281354697
    576428913938617542412539786643285179127943865859761234395176428764892351281354697
    576428913938617542412539786643285179127943865859761234395876421764192358281354697
    576428913938617542412539786643285179127943865895761234359176428764892351281354697
    576428913938617542412539786643285179127943865895761234359876421764192358281354697
    576428913938617542412539786643285179127943865895761234369172458754896321281354697
    576428913938617542412539786643285179127943865895761234369872451754196328281354697
    576428913938617542412539876647285139125943768893761254359876421764192385281354697
    576428913938617542412539876647285139125943768893761254369172485754896321281354697
    576824913328179546419536872647285139152943768893761254765392481984617325231458697
    576824913328197546419536872647285139152943768893761254965372481784619325231458697
    576824913328197546419536872647285139152943768893761254965378421784612395231459687
    576824913398176542412539768643285179127943856859761234765392481984617325231458697
    576824913398176542412539786643285179127943865859761234965317428784692351231458697
    576824913398617542412539768643285179127943856859761234765392481984176325231458697
    576824913398617542412539768643285179127943856859761234785396421964172385231458697
    576824913398617542412539768643285179127943856859761234965372481784196325231458697
    576824913398617542412539768643285179127943856859761234985376421764192385231458697
    576824913398617542412539786643285179127943865859761234785396421964172358231458697
    576824913398617542412539786643285179127943865859761234985376421764192358231458697
    576824913418379526392516748643285179127943865859761234965137482784692351231458697
    576824913418379562329516748647285139152943876893761254985637421764192385231458697
    576824913418379562392516748643285179127943856859761234985637421764192385231458697
    576824913418396572329517846647285139152943768893761254785632491964178325231459687
    576824913418396572329517846647285139152943768893761254785639421964172385231458697
    576824913418397526392516748643285179127943865859761234765138492984672351231459687
    576824913418397526392516748643285179127943865859761234765139482984672351231458697
    576824913418397526392516748643285179127943865859761234785632491964178352231459687
    576824913418397562329516748647285139152943876893761254785632491964178325231459687
    576824913418397562329516748647285139152943876893761254785639421964172385231458697
    576824913418397562392516748643285179127943856859761234785632491964178325231459687
    576824913418397562392516748643285179127943856859761234785639421964172385231458697
    576824913418639572329517468647285139152943786893761254765392841984176325231458697
    576824913418639572329517468647285139152943786893761254965372841784196325231458697
    576824913418639572329517486647285139152943768893761254765392841984176325231458697
    576824913418639572329517486647285139152943768893761254965372841784196325231458697
    576824913418639572329517846647285139152943768893761254765392481984176325231458697
    576824913418639572329517846647285139152943768893761254785396421964172385231458697
    576824913418639572329517846647285139152943768893761254965372481784196325231458697
    576824913418639572329517846647285139152943768893761254985376421764192385231458697
    576824913418639572923517468647285139152943786839761254365472891784196325291358647
    576824913418639572923517486647285139152943768839761254365472891784196325291358647
    576824913428139576319576482647285139152943768893761254765392841984617325231458697
    576824913428139576319576842647285139152943768893761254765392481984617325231458697
    576824913428139576913576482647285139152943768839761254365497821784612395291358647
    576824913428319576319576842647285139152943768893761254985637421764192385231458697
    576824913498136572312597468647285139125943786839761254763412895954678321281359647
    576824913498136572312597486647285139125943768839761254763412895954678321281359647
    576824913498137526312596748643285179127943865859761234765318492984672351231459687
    576824913498137526312596748643285179127943865859761234765319482984672351231458697
    576824913498137526312596748643285179127943865859761234965372481784619352231458697
    576824913498137562312596478647285139125943786839761254763412895954678321281359647
    576824913498137562312596748643285179127943856859761234965372481784619325231458697
    576824913498137562312596748643285179127943856859761234965378421784612395231459687
    576824913498317526312596748643285179127943865859761234765138492984672351231459687
    576824913498317526312596748643285179127943865859761234765139482984672351231458697
    576824913498317526312596748643285179127943865859761234785632491964178352231459687
    576824913498317562312596748643285179127943856859761234785632491964178325231459687
    576824913498317562312596748643285179127943856859761234785639421964172385231458697

  • Hallo Bernd,

    durch die Verwendung des 3-dimensionalen Arrays ist Dein Solver wohl, wenn auch mit kleinem Abstand, der schnellste Solver für "einfache" Sudokus :thumbup:
    Aber auch beim reinen Backtracken erkennt man die Leistungsfähigkeit. Bei "bösen" Sudokus, bei denen sich der BT-Algorithmus totläuft, dauerts aber auch mal länger....

    Ich habe mal testweise Bernds in C++ geschriebene Sudoku.dll auf die 35.000 Sudokus losgelassen, nach 979 Sekunden waren diese gelöst, knapp 36 Sudokus/Sekunde.
    Mein Autoit-Solver brauchte dafür 10825 Sekunden. Zehnmal solange, und das trotz Einsatz von Strategien. Mit reinem Backtracken wäre Autoit wohl noch am Sanktnimmerleinstag am rechnen^^

    Ein "richtig schneller" Solver löst die 35000 Sudokus übrigens in ca 30 Sekunden, d.h. 1100 Sudokus/Sekunde :rock:

    ciao
    Andy

    • Offizieller Beitrag

    Hallo,

    kannst Du mir mal bitte die Testroutine zeigen mit der Du meine DLL getestet hast. Wenn ich die DLL auf die 48072 17er Sudoku's loslasse kommt dieses Ergebnis raus.

    48072 Sudoku's in 198179.552350606 ms = 242.567910916229 Sudoku's/Sek

    Hier ist meine Testroutine:

    Spoiler anzeigen
    [autoit]

    $szSodukos = FileRead("sudoku17.txt") ; http://people.csse.uwa.edu.au/gordon/sudoku17

    [/autoit] [autoit][/autoit] [autoit]

    $hDLL = DllOpen("Sudoku.dll")

    [/autoit] [autoit][/autoit] [autoit]

    Local $aszSodukos = StringSplit($szSodukos, @CRLF, 3)

    [/autoit] [autoit][/autoit] [autoit]

    $iSudokus = 0
    $tComplete = 0
    For $i = 0 To UBound($aszSodukos) - 1
    If $aszSodukos[$i] = "" Then ContinueLoop
    $iSudokus += 1

    [/autoit] [autoit][/autoit] [autoit]

    $tRunning = TimerInit()
    $arDLL = DllCall($hDLL, "str", "SudokuSolve", "str", $aszSodukos[$i])
    $tTimeDiff = TimerDiff($tRunning)
    If IsArray($arDLL) Then $szSolve = $arDLL[0]
    $tComplete += $tTimeDiff
    ConsoleWrite("Sudoku " & $iSudokus & " :" & @TAB & $szSolve & @TAB & $tTimeDiff & " ms" & @CRLF)
    Next
    ConsoleWrite($iSudokus & " Sudoku's in " & $tComplete & " ms = " & $iSudokus / ($tComplete / 1000) & " Sudoku's/Sek" & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    DllClose($hDLL)

    [/autoit]
  • Hallo Bernd,
    habe meinen Fehler gefunden...

    Spoiler anzeigen
    [autoit]


    FileInstall(".\Sudoku.dll", @ScriptDir & "\Sudoku.dll", 0)

    [/autoit] [autoit][/autoit] [autoit]

    Global $szfield, $m, $t, $k = 0,$solve,$gesamt=0
    $dll=DllOpen("Sudoku.dll")
    ConsoleWrite("Lösen von 35000 Sudokus......Vorgang läuft...." & @CRLF)
    $t = TimerInit()

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To 35000
    $m = TimerInit()
    $szfield = FileReadLine("vielesudokus.txt", $i) ;36000 sudokus
    $m = TimerInit()
    $arDLL = DllCall($dll, "str", "SudokuSolve", "str", $szfield)
    If IsArray($arDLL) Then $solve = $arDLL[0]
    If $k > 5000 Then ;alle 5 sekunden info in die konsole
    $gesamt+=$k
    $k = 0
    ConsoleWrite("Nach " & Int(($gesamt) / 1000) & " Sekunden wurden " & $i & " Sudokus gelöst" & @CRLF)
    Else
    $k = $k + TimerDiff($m)
    EndIf
    Next
    ConsoleWrite("Gesamtzeit: " & Int($k) & " MilliSekunden Durchschnitt: "&int($i/$k*1000)&@crlf)
    Exit

    [/autoit]


    Habe das Script eben nochmal durchlaufen lassen, dein Ergebnis wurde in etwa bestätigt. Weiss der Henker, hab wahrscheinlich nur die 2 von der 236 Sudokus/Sekunde vergessen 8|

    Also ist deine Backtrack- DLL über den dicken Daumen achzig- bis hundert mal schneller wie ein mit Strategien arbeitendes AutoIt-Script.

    • Offizieller Beitrag

    Deine vielen TimerInit im Script lassen eher vermuten das Du vorher die komplette Schleife gemessen hast, was ein Test mit deiner Routine auch bestätigt, ich komme dann auch nur auf 22 Sudoku/s. FileReadLine und die ganzen Ausgaben schlagen natürlich bei einer Routine die im ms-Bereich arbeitet ganz schon zu Buche. ;)

    Man sollte immer nur die zu Testende Funktion messen, selbst eine Rechnung und eine Ausgabe kann das Ergebnis unter umständen schon erheblich verfälschen.

    Spoiler anzeigen
    [autoit]

    FileInstall(".\Sudoku.dll", @ScriptDir & "\Sudoku.dll", 0)

    [/autoit] [autoit][/autoit] [autoit]

    Global $szfield, $m, $t, $k = 0,$solve,$gesamt=0
    $dll=DllOpen("Sudoku.dll")
    ConsoleWrite("Lösen von 35000 Sudokus......Vorgang läuft...." & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    $k = 0
    $gesamt = 0
    For $i = 1 To 35000
    $szfield = FileReadLine("vielesudokus.txt", $i) ;36000 sudokus
    $m = TimerInit()
    $arDLL = DllCall($dll, "str", "SudokuSolve", "str", $szfield)
    $k += TimerDiff($m)
    If IsArray($arDLL) Then $solve = $arDLL[0]
    If $k >= 5000 Then ;alle 5 sekunden info in die konsole
    $gesamt+=$k
    $k = 0
    ConsoleWrite("Nach " & Int(($gesamt) / 1000) & " Sekunden wurden " & $i & " Sudokus gelöst" & @CRLF)
    EndIf
    Next
    $gesamt+=$k

    [/autoit] [autoit][/autoit] [autoit]

    ConsoleWrite("Gesamtzeit: " & Int($gesamt) & " MilliSekunden Durchschnitt: "&int($i/($gesamt/1000)) & " Sudokus/s" &@crlf)

    [/autoit] [autoit][/autoit] [autoit]

    DllClose($dll)
    Exit

    [/autoit]
  • Zitat

    Man sollte immer nur die zu Testende Funktion messen, selbst eine Rechnung und eine Ausgabe kann das Ergebnis unter umständen schon erheblich verfälschen.

    Prinzipiell richtig, in diesem Fall aber zu vernachlässigen, da der "Fehler" im kleiner 5% Bereich liegt (Meßungenauigkeit) 8o

    Übrigens hatte ich nur die Zeilen

    [autoit]

    $arDLL = DllCall("Sudoku.dll", "str", "SudokuSolve", "str", $szfield)
    If IsArray($arDLL) Then $solve = $arDLL[0]

    [/autoit]

    aus deinem Script kopiert. Da du innerhalb der DllCall()-Funktion die DLL nicht über ein Handle, sondern direkt mit dem Namen angesprochen hast, hatte ich die DLL ursprünglich auch nicht per

    [autoit]

    DllOpen()

    [/autoit]

    geöffnet. Das führte zu einer Verlängerung der Laufzeit um ca. Faktor 3 aufgrund der ständigen Dateiöffnungen. Solche Fehler hauen dann schon heftiger rein, ich hatte aber "zufällig" den FileMonitor (Sysinternals) mitlaufen, da fiel mir das auf.
    Auch das Filereadline() ist natürlich mit Angabe der Zeilennummer extrem "langsam", da aber nicht mitgemessen, irrelevant. So ist es aber wesentlich einfacher möglich, mittels Parameter der For/To Schleife nur bestimmte Bereiche der *.txt Datei (oder sogar nur einzelne Sudokus aus der Datei ) zu testen.