Advertisement
Guest User

Untitled

a guest
Aug 15th, 2016
720
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.49 KB | None | 0 0
  1. public static class FlatMap
  2. {
  3.     // Polyfill over this not existing in the C# implementation of IEnumerable
  4.     // "this" argument attaches this method to IEnumerable instances.
  5.     public static IEnumerable<U> flatMap<T, U>(this IEnumerable<T> list, Func<T,IEnumerable<U>> func)
  6.     {
  7.         foreach (var item in list)
  8.             foreach (var thing in func(item))
  9.                 yield return thing;
  10.     }
  11. }
  12.  
  13. struct SudokuState
  14. {
  15.     // int? is equivalent of Option<i32>, T[,] is syntax sugar for T[][], i.e. [[T]]
  16.     int?[,] board;
  17.  
  18.     public SudokuState(int?[] input)
  19.     {
  20.         board = new int?[,]{
  21.             { null, null, null, null, null, null, null, null, null},
  22.             { null, null, null, null, null, null, null, null, null},
  23.             { null, null, null, null, null, null, null, null, null},
  24.             { null, null, null, null, null, null, null, null, null},
  25.             { null, null, null, null, null, null, null, null, null},
  26.             { null, null, null, null, null, null, null, null, null},
  27.             { null, null, null, null, null, null, null, null, null},
  28.             { null, null, null, null, null, null, null, null, null},
  29.             { null, null, null, null, null, null, null, null, null},
  30.             };
  31.  
  32.         int i = 0;
  33.         for (int x = 0; x < 9; x++)
  34.             for (int y = 0; y < 9; y++)
  35.             {
  36.                 if (isValidInsertion(x, y, input[i]))
  37.                     board[x, y] = input[i];
  38.                 else
  39.                     throw new ArgumentException();
  40.                 i++;
  41.             }
  42.     }
  43.  
  44.     public bool isValidValue(int v)
  45.     {
  46.         return 0 < v && v <= 9;
  47.     }
  48.  
  49.     public bool isValidInsertion(int x, int y, int? v)
  50.     {
  51.         if (!(0 <= x || x < 9))
  52.         { return false; }
  53.         if (!(0 <= y || y < 9))
  54.         { return false; }
  55.         if (v != null && !isValidValue(v.Value))
  56.         { return false; }
  57.  
  58.         if (v == null) return true;
  59.  
  60.         int offx = x - (x % 3);
  61.         int offy = y - (y % 3);
  62.         for (int n = 0; n < 9; n++)
  63.         {
  64.             if (board[x, n] == v)
  65.             {
  66.                 return false;
  67.             }
  68.             if (board[n, y] == v)
  69.             {
  70.                 return false;
  71.             }
  72.             if (board[offx + n % 3, offy + n / 3] == v)
  73.             {
  74.                 return false;
  75.             }
  76.         };
  77.         return true;
  78.     }
  79.  
  80.     static public SudokuState Insert(SudokuState S, int x, int y, int v)
  81.     {
  82.         var clone = new SudokuState() { board = S.board };
  83.         clone.board[x,y] = v;
  84.         return clone;
  85.     }
  86.  
  87.     public Tuple<int, int> getFirstEmpty()
  88.     {
  89.         for (int x = 0; x < 9; x++)
  90.             for (int y = 0; y < 9; y++)
  91.                 if (board[x,y] == null)
  92.                     return Tuple.Create(x, y);
  93.         return null;
  94.     }
  95.  
  96.     public IEnumerable<SudokuState> GetSolutions()
  97.     {
  98.         var firstEmptySpace = getFirstEmpty();
  99.         if (firstEmptySpace == null)
  100.             return Enumerable.Repeat(this, 1);
  101.         else
  102.         {
  103.             var state = this;
  104.             int x = firstEmptySpace.Item1;
  105.             int y = firstEmptySpace.Item2;
  106.             return Enumerable.Range(1, 9)
  107.                 .Where(v => state.isValidInsertion(x, y, v))
  108.                 .Select(v => Insert(state, x, y, v))
  109.                 .flatMap(S => S.GetSolutions());
  110.         }
  111.     }
  112. }
  113.  
  114. class Program
  115. {
  116.     static void Main(string[] args)
  117.     {
  118.         var data = new int?[]{
  119.             4, 2, 3, 6, 9, 7, 8, 1, 5,
  120.             6, 9, 1, 5, 3, 8, 4, 7, 2,
  121.             5, 8, 7, 4, 2, 1, 6, 3, 9,
  122.             3, 1, 9, 8, 7, 5, 2, 6, 4,
  123.             2, 5, 6, 1, 4, 9, 3, 8, 7,
  124.             7, 4, 8, 3, 6, 2, 5, 9, 1,
  125.             9, 6, 4, 2, 1, 3, 7, 5, 8,
  126.             1, 3, 5, 7, 8, 4, 9, 2, 6,
  127.             8, 7, 2, 9, 5, 6, 1, 4, null,
  128.             };
  129.  
  130.         SudokuState game = new SudokuState(data);
  131.  
  132.         var list = game.GetSolutions().ToArray()[0];
  133.  
  134.         /* list[0].board is
  135.         4, 2, 3, 6, 9, 7, 8, 1, 5
  136.         6, 9, 1, 5, 3, 8, 4, 7, 2
  137.         5, 8, 7, 4, 2, 1, 6, 3, 9
  138.         3, 1, 9, 8, 7, 5, 2, 6, 4
  139.         2, 5, 6, 1, 4, 9, 3, 8, 7
  140.         7, 4, 8, 3, 6, 2, 5, 9, 1
  141.         9, 6, 4, 2, 1, 3, 7, 5, 8
  142.         1, 3, 5, 7, 8, 4, 9, 2, 6
  143.         8, 7, 2, 9, 5, 6, 1, 4, 3
  144.         */
  145.  
  146.     }
  147. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement