att vara minesweeper

hints:

eller   inte    ?       eller   eller   ?       eller   vara   
?       ?       det     ?       ?       det     ?       eller  
?       ?       ?       ?       ?       ?       det     ?      
?       är      ?       frågan  ?       ?       ?       eller  
eller   ?       ?       ?       är      är      ?       eller  
vara    inte    det     ?       ?       ?       det     ?      
att     vara    ?       det     ?       ?       ?       inte   
att     vara    eller   ?       eller   inte    ?       eller  

mines:

att     att     vara    att     att     vara    att     att    
vara    vara    att     att     vara    att     vara    att    
att     att     vara    vara    att     vara    att     vara   
vara    att     vara    att     vara    vara    att     att    
att     vara    vara    vara    att     att     vara    att    
att     att     att     att     vara    vara    att     vara   
att     att     vara    att     vara    att     vara    att    
att     att     att     vara    att     att     vara    att    

hints:

eller   inte    ?       eller   eller   ?       eller   vara   
?       ?       det     ?       ?       det     ?       eller  
?       ?       ?       ?       ?       ?       det     ?      
?       är      ?       frågan  ?       ?       ?       eller  
eller   ?       ?       ?       är      är      ?       eller  
vara    inte    det     ?       ?       ?       det     ?      
att     vara    ?       det     ?       ?       ?       inte   
att     vara    eller   ?       eller   inte    ?       eller  

mines:

att     att     vara    att     att     vara    att     att    
vara    vara    att     att     vara    att     vara    att    
att     att     vara    vara    vara    att     att     vara   
vara    att     vara    att     vara    vara    vara    att    
att     vara    vara    att     att     att     att     att    
att     att     att     vara    vara    vara    att     vara   
att     att     vara    att     att     vara    vara    att    
att     att     att     vara    att     att     vara    att    


hints:

eller   inte    ?       eller   eller   ?       eller   vara   
?       ?       det     ?       ?       det     ?       eller  
?       ?       ?       ?       ?       ?       det     ?      
?       är      ?       frågan  ?       ?       ?       eller  
eller   ?       ?       ?       är      är      ?       eller  
vara    inte    det     ?       ?       ?       det     ?      
att     vara    ?       det     ?       ?       ?       inte   
att     vara    eller   ?       eller   inte    ?       eller  

mines:

att     att     vara    att     att     vara    att     att    
vara    vara    att     vara    att     att     vara    att    
att     att     vara    att     vara    vara    att     vara   
vara    att     vara    att     vara    vara    att     att    
att     vara    vara    vara    att     att     vara    att    
att     att     att     att     vara    vara    att     vara   
att     att     vara    att     vara    att     vara    att    
att     att     att     vara    att     att     vara    att    

hints:

eller   inte    ?       eller   eller   ?       eller   vara   
?       ?       det     ?       ?       det     ?       eller  
?       ?       ?       ?       ?       ?       det     ?      
?       är      ?       frågan  ?       ?       ?       eller  
eller   ?       ?       ?       är      är      ?       eller  
vara    inte    det     ?       ?       ?       det     ?      
att     vara    ?       det     ?       ?       ?       inte   
att     vara    eller   ?       eller   inte    ?       eller  

mines:

att     att     vara    att     att     vara    att     att    
vara    vara    att     vara    att     att     vara    att    
vara    att     att     vara    vara    vara    att     vara   
vara    att     vara    att     vara    vara    att     att    
att     vara    vara    vara    att     att     vara    att    
att     att     att     att     vara    vara    att     vara   
att     att     vara    att     vara    att     vara    att    
att     att     att     vara    att     att     vara    att

MiniZinc model

int: r;
int: c;
int: X = -1;
array[0..6] of string: s = array1d(0..6,
                           ["att    ",
                            "vara   ",
                            "eller  ",
                            "inte   ",
                            "det    ",
                            "är     ",
                            "frågan "]);
array[1..r, 1..c] of -1..8: hints;
array[1..r, 1..c] of var 0..1: mines;
constraint
    forall(i in 1..r, j in 1..c) (
       if hints[i,j] >= 0 then 
            hints[i,j]  = sum(a,b in {-1,0,1} where 
               i+a > 0  /\ j+b >  0 /\
               i+a <= r /\ j+b <= c
            ) (mines[i+a,j+b])
       else
          true
       endif
      /\ (hints[i,j] > X -> mines[i,j] = 0) 
      % /\ (hints[i,j] = X <- mines[i,j] = 1) % redundant
    );
solve satisfy;
% From "Some Minesweeper Configurations", page 3
% 4 solutions
r=8;
c=8;
hints = array2d(1..r,1..c,[
   2,3,X,2,2,X,2,1,
   X,X,4,X,X,4,X,2,
   X,X,X,X,X,X,4,X,
   X,5,X,6,X,X,X,2,
   2,X,X,X,5,5,X,2,
   1,3,4,X,X,X,4,X,
   0,1,X,4,X,X,X,3,
   0,1,2,X,2,3,X,2 
]);
output ["\n\nhints:\n"] ++
[ if j = 1 then "\n" else " " endif ++
    if hints[i,j] = -1 then "?      " else show(s[hints[i,j]]) endif
  | i in 1..r ,j in 1..c ] ++ 
[ "\n\nmines:\n" ] ++ [
  if j = 1 then "\n" else " " endif ++
    show(s[fix(mines[i,j])])
  | i in 1..r,j in 1..c ];

Back to Constrained-based constraint poetry
Created by Hakan Kjellerstrand hakank@gmail.com