matrix11:= [ [ , ,6,1, ,2,8, , ], [ ,2, ,7, ,6, ,9, ], [ , , , ,4, , , , ], [ , ,2,4, ,1,9, , ], [ , , , , , , , , ], [ ,5,7, , , ,1,2, ], [1, , , , , , , ,8], [ , ,3, ,2, ,6, , ], [ , , , , , , , , ] ]; matrix12:= [ [6, , ,2, , , , ,9], [ , , , , ,7,6, ,4], [ , ,4,1,8, , , , ], [3,5,2,8,6, ,4, ,1], [ , ,1, ,2, ,8, , ], [4, ,8, ,7,1,9,5,2], [ , , , ,5,3,2, , ], [5, ,3,4, , , , , ], [1, , , , ,8, , ,5] ]; matrix13:= [ [8,4, , , , , ,9,7], [ , , ,8, ,9, , , ], [ , , ,6, ,5, , , ], [ , , , ,1, , , , ], [3,5, ,9, ,8, ,2,1], [ ,2,6, , , ,9,7, ], [ , , , , , , , , ], [ , ,4, , , ,1, , ], [ , ,9, , , ,7, , ] ]; matrix21:= [ [6, , ,2, ,9, ,7,3], [ , , ,6,7, , , , ], [9,7, , , , ,1, , ], [8,9, , , , ,1, , ], [ ,3, ,8,9,4, ,5, ], [4,2, ,3, , , ,9,7], [ , ,3, , , , ,8,4], [ , , , ,6,8, , , ], [5,6, ,4, ,7, , ,2] ]; matrix22:= [ [ , , , , , , , , ], [ , , , , , , , , ], [ ,5, ,3,2,7, ,6, ], [ , ,3,9,8,4,7, , ], [ , , ,7, ,1, , , ], [ , ,7,2, ,5,1, , ], [ ,2, , , , , ,3, ], [5,7, , , , , ,8,6], [ , , , , , , , , ] ]; matrix := [ [ 1, 2, 3, 4 ], [ 3, 4, 1, 2 ], [ 2, 1, [ 1 .. 4 ], [ 1 .. 4 ] ], [ 4, 3, [ 1 .. 4 ], [ 1 .. 4 ] ] ]; matrix := [ [ 1, 2, 3, 4 ], [ 3, 4, 1, 2 ], [ 2, 1, , ], [ 4, 3, , ] ]; sudoku := function (matrix) local parameter, parameter2,i, ii, matrix_bak, clean, positions, iii, iiii, temp, res ; #parameter2:= DimensionsMat(matrix)[1]; #if parameter2 <> DimensionsMat(matrix)[2] then Error ("different dimensions");fi; parameter2:=Length(matrix); parameter := Sqrt(parameter2); for i in [1..parameter2] do for ii in [1..parameter2] do if not IsBound(matrix[i][ii]) then matrix[i][ii] := [1..parameter2]; fi; od; od; clean := function ( subset ) local i, ii; for i in [ 1 .. parameter2 ] do if IsInt( subset[i] ) then for ii in [ 1 .. parameter2 ] do if IsList( subset[ii] ) and subset[i] in subset[ii] then Unbind( subset[ii][Position( subset[ii], subset[i] )] ); subset[ii] := SortedList( subset[ii] ); if Length( subset[ii] ) = 1 then subset[ii] := subset[ii][1]; fi; fi; od; elif IsList( subset[i] ) then for ii in [ 1 .. Length( subset[i] ) ] do if ForAll( Union( [ 1 .. i - 1 ], [ i + 1 .. parameter2 ] ), x-> (IsList(subset[x]) and not subset[i][ii] in subset[x]) or IsInt(subset[x]) and subset[i][ii] <> subset[x]) then subset[i] := subset[i][ii]; break; fi; od; fi; od; return StructuralCopy( subset ); end; matrix_bak:=fail; repeat Print("#\c"); matrix_bak := StructuralCopy(matrix); #Print(matrix, "\n"); # orizontali for i in [ 1 .. parameter2 ] do clean(matrix[i]); od; #Print(matrix, "\n"); # verticali for i in [ 1 .. parameter2 ] do temp := StructuralCopy(List ( [ 1 .. parameter2 ], x -> matrix[x][i] )); temp := clean(temp); #if res<>temp then for ii in [ 1 .. parameter2 ] do matrix[ii][i] := temp[ii]; od; #fi; od; #Print(matrix, "\n"); # quadratini for iii in [ 0 .. parameter-1 ] do for iiii in [ 0 .. parameter-1 ] do temp:=[]; for i in [ 1 .. parameter ] do Append (temp, StructuralCopy(matrix[iii*parameter+i]{[iiii*parameter+1..(iiii+1)*parameter]})); od; temp := clean(temp); #if res<>temp then for i in [ 1 .. parameter ] do matrix[iii*parameter+i]{[iiii*parameter+1..(iiii+1)*parameter]} := temp{[(i-1)*parameter+1..i*parameter]}; od; #fi; od; od; #Print(matrix, "\n"); until matrix_bak = matrix; Print("\n"); return matrix; end;