[CmdletBinding()] Param() Process{ # Initial process. Clear all grids with hints. $Hash1 = 1 # Set Datahash 1 and 2 to different values. $Hash2 = 0 While($Hash1 -notmatch $Hash2){ $Hash1 = (1..9 | ForEach-Object{($Data | Where-Object{$_."ID"}).$_}).count Process-Sudoku $Hash2 = (1..9 | ForEach-Object{($Data | Where-Object{$_."ID"}).$_}).count } } Begin{ # $MyPath = Split-Path $MyInvocation.MyCommand.path -Parent $Data = Import-Csv -Path "$MyPath\sudoku.txt" -Delimiter " " For($i = 1;$i -le 9;$i++){ $currentRow = ($Data | Where-Object{$_."ID" -eq $i}) For($n = 1;$n -le 9;$n++){ $cell = [int32]($currentRow.$n) If($cell -eq 0){ $currentRow.$n = (1..9) } Else{ $currentRow.$n = [array]$cell } } } Function Process-Sudoku{ # Process Horizontal For($i = 1;$i -le 9;$i++){ If($Hash1 -le 162){} ## DEEBUUUGG $currentRow = $data[($i-1)] $exists = 1..9 | Foreach-Object{If(($currentRow.$_).count -eq 1){$currentRow.$_}} $NotSolved = 1..9 | Where-Object{($currentRow.$_).count -gt 1} $NotSolved | ForEach-Object{ [Array]$NewArray = $currentRow.$_ | ForEach-Object{if($exists -match $_){}Else{$_}} $currentRow.$_ = $NewArray } } # Process Verical For($i = 1;$i -le 9;$i++){ $CurrentLine = @{} For($n = 1;$n -le 9;$n++){ $currentRow = $Data[($n-1)] $CurrentLine += @{$n = $currentRow.$i} } $Exists = 1..9 | Foreach-Object{If(($CurrentLine.$_).count -eq 1){$currentLine.$_}} $NotSolved = 1..9 | Where-Object{($CurrentLine.$_).count -gt 1} $NotSolved | ForEach-Object{ For($n = 1;$n -le 9;$n++){ $currentRow = $Data[($_-1)] [Array]$NewArray = $currentRow.$i | ForEach-Object{if($exists -match $_){}Else{$_}} $currentRow.$i = $NewArray } } } # Process grid For($i = 1;$i -le 9;$i++){ If($i -le 3){$Mod = 0} ElseIf($i -gt 6){$Mod = 6} Else{$Mod = 3} $CurrentGrid = @{} $c = 1 For($n = 1;$n -le 3;$n++){ $currentRow = $Data[($n+$mod-1)] For($x = 1;$x -le 3;$x++){ $CurrentGrid += @{$c = $currentRow.$x} $c++ } } $exists = 1..9 | Foreach-Object{If(($CurrentGrid.$_).count -eq 1){$CurrentGrid.$_}} $NotSolved = 1..9 | Where-Object{($CurrentGrid.$_).count -gt 1} $NotSolved | ForEach-Object{ If($_ -le 3){$row = 1} ElseIf($_ -ge 7){$row = 3} Else{$row = 2} $currentRow = $Data[($row+$mod-1)] [Array]$NewArray = $currentRow.$_ | ForEach-Object{if($exists -match $_){}Else{$_}} $currentRow.$_ = $NewArray } } } # End process function } End{ $Data | Format-Table -AutoSize }
Input
ID 1 2 3 4 5 6 7 8 9 1 9 0 0 0 0 0 1 2 0 2 0 0 2 3 0 0 0 0 0 3 4 0 0 0 0 5 9 6 0 4 0 8 0 2 0 0 6 0 0 5 0 0 0 0 5 0 0 0 0 6 0 0 1 0 0 9 0 3 0 7 0 7 6 9 0 0 0 0 1 8 0 0 0 0 0 1 7 0 0 9 0 9 8 0 0 0 0 0 4