Skip to content

Instantly share code, notes, and snippets.

@silicontrip
Created December 9, 2022 06:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save silicontrip/15e5175460c8f4299499757b3f197cd5 to your computer and use it in GitHub Desktop.
Save silicontrip/15e5175460c8f4299499757b3f197cd5 to your computer and use it in GitHub Desktop.
sudoko solver, iterate only, no guessing.
#import <Foundation/Foundation.h>
void psetboard(NSSet * board)
{
for (int y =0; y< 9 ; y++)
{
for (int x = 0; x<9; x++)
{
if ([board containsObject:@(y*9+x)])
printf ("#");
else
printf(".");
}
printf("\n");
}
}
void pboard(int * board)
{
for (int y =0; y< 9 ; y++)
{
for (int x = 0; x<9; x++)
{
if (board[y*9+x]>0)
printf ("%d",board[y*9+x]);
else
printf(".");
}
printf("\n");
}
printf("\n");
}
NSSet * uniq_row(int sq)
{
int rw = sq / 9;
NSMutableSet * mset = [[[NSMutableSet alloc] init] autorelease];
for (int x=0; x< 9; x++)
{
int ss = rw*9 + x;
[mset addObject:@(ss)];
}
// NSLog(@"square: %d row %@",sq,mset);
return [NSSet setWithSet:mset];
}
NSSet * uniq_col(int sq)
{
int cl = sq % 9;
NSMutableSet * mset = [[[NSMutableSet alloc] init] autorelease];
for (int x=0; x< 9; x++)
{
int ss = x * 9 + cl;
[mset addObject:@(ss)];
}
// NSLog(@"square: %d col %@",sq,mset);
return [NSSet setWithSet:mset];
}
NSSet * uniq_cell(int sq)
{
NSMutableSet* mset = [[[NSMutableSet alloc] init] autorelease];
int clx = (sq % 9) / 3;
int cly = sq / 27;
for (int y = 0; y<3; y++)
for (int x=0; x< 3; x++)
{
int ss = clx * 3 + cly * 27 + y * 9 + x;
[mset addObject:@(ss)];
}
// NSLog(@"square: %d cell %@",sq,mset);
return [NSSet setWithSet:mset];
}
NSSet* uniq_squares(int sq)
{
NSMutableSet* mset = [[[NSMutableSet alloc] init] autorelease];
[mset unionSet:uniq_row(sq)];
[mset unionSet:uniq_col(sq)];
[mset unionSet:uniq_cell(sq)];
//psetboard(mset);
return [NSSet setWithSet:mset];
}
NSSet* uniq_numbers (int sq, int * board)
{
NSSet* sqset = uniq_squares(sq);
NSMutableSet* numbers = [[[NSMutableSet alloc] init] autorelease];
NSMutableSet* inumbers = [[[NSMutableSet alloc] init] autorelease];
for (NSNumber* nn in sqset)
{
if (nn > 0)
[numbers addObject:@(board[[nn intValue]])];
}
//NSLog(@" sq: %d unum: %@",sq,numbers);
for (int i=1;i<10;i++)
{
if (![numbers containsObject:@(i)])
[inumbers addObject:@(i)];
}
return [NSSet setWithSet:inumbers];
}
//int * iterate (int * board)
void iterate (int * board)
{
for (int sq =0; sq < 81; sq++)
{
if (board[sq] == 0 )
{
// get uniq squares
NSSet* unum = uniq_numbers(sq,board);
// NSLog(@"%d: %lu : %@\n",sq,[unum count],unum);
if ([unum count] == 1)
board[sq] = [[unum anyObject] intValue];
}
}
}
int main (int argc, const char* argv[])
{
int board[81];
printf("argc: %d\n",argc);
if (argc==2)
{
NSError* err;
NSString* fn = [NSString stringWithUTF8String:argv[1]];
NSString* sboard = [NSString stringWithContentsOfFile:fn encoding:NSUTF8StringEncoding error:&err];
NSArray* aboard = [sboard componentsSeparatedByString:@"\n"];
// NSLog(@"%@",aboard);
int y = 0;
for (NSString* line in aboard)
{
for(int x=0; x < [line length]; ++x)
{
NSString* cc = [line substringWithRange:NSMakeRange(x, 1)];
int sq = [cc intValue];
board[y*9 + x] = sq;
if (sq>0)
printf("%d",sq);
else
printf (" ");
}
printf("\n");
++y;
}
iterate(board);
pboard(board);
iterate(board);
pboard(board);
iterate(board);
pboard(board);
iterate(board);
pboard(board);
}
}
@silicontrip
Copy link
Author

silicontrip commented Dec 9, 2022

2....657.
49..27..1
......2.3
54..73.9.
7.6...3.4
.8.26..15
6.9......
8..94..36
.146....7

23...657.
49..27..1
1.....2.3
54..73.9.
726...384
.8326.715
6.9......
8..94.136
3146....7

238..6579
495.27.61
1.7...243
541873692
726...384
983264715
6.9.....8
8.2945136
314682957

238.16579
495327861
167598243
541873692
726159384
983264715
6.9731428
872945136
314682957

238416579
495327861
167598243
541873692
726159384
983264715
659731428
872945136
314682957

@silicontrip
Copy link
Author

2....657.
49..27..1
......2.3
54..73.9.
7.6...3.4
.8.26..15
6.9......
8..94..36
.146....7

2022-12-09 20:07:14.400 a.out[45301:5291948] 1 Iteration
23...657.
49..27..1
1.....2.3
54..73.9.
726...3.4
.8326.715
6.9......
8..94.136
3146....7

2022-12-09 20:07:14.401 a.out[45301:5291948] 2 Iteration
238..657.
49..27..1
1.....2.3
541.73.9.
726...384
98326.715
6.9......
8..94.136
3146....7

2022-12-09 20:07:14.402 a.out[45301:5291948] 3 Iteration
238..6579
495.27.61
1.....2.3
541873692
726...384
983264715
6.9......
8..94.136
3146....7

2022-12-09 20:07:14.402 a.out[45301:5291948] 4 Iteration
238.16579
495327861
1.7...243
541873692
726...384
983264715
6.9.....8
8..94.136
3146....7

2022-12-09 20:07:14.403 a.out[45301:5291948] 5 Iteration
238416579
495327861
1675..243
541873692
726...384
983264715
6.9...4.8
8.294.136
3146..9.7

2022-12-09 20:07:14.404 a.out[45301:5291948] 6 Iteration
238416579
495327861
1675..243
541873692
7261..384
983264715
6.9...4.8
8.2945136
3146..9.7

2022-12-09 20:07:14.404 a.out[45301:5291948] 7 Iteration
238416579
495327861
1675..243
541873692
7261.9384
983264715
6.973.4.8
872945136
31468.9.7

2022-12-09 20:07:14.404 a.out[45301:5291948] 8 Iteration
238416579
495327861
167598243
541873692
726159384
983264715
65973.4.8
872945136
3146829.7

2022-12-09 20:07:14.404 a.out[45301:5291948] 9 Iteration
238416579
495327861
167598243
541873692
726159384
983264715
659731428
872945136
314682957

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment