examples/crypto.mod
author Alpar Juttner <alpar@cs.elte.hu>
Sun, 05 Dec 2010 17:35:23 +0100
changeset 2 4c8956a7bdf4
permissions -rw-r--r--
Set up CMAKE build environment
alpar@1
     1
/* CRYPTO, a crypto-arithmetic puzzle */
alpar@1
     2
alpar@1
     3
/* Written in GNU MathProg by Andrew Makhorin <mao@gnu.org> */
alpar@1
     4
alpar@1
     5
/* This problem comes from the newsgroup rec.puzzle.
alpar@1
     6
   The numbers from 1 to 26 are assigned to the letters of the alphabet.
alpar@1
     7
   The numbers beside each word are the total of the values assigned to
alpar@1
     8
   the letters in the word (e.g. for LYRE: L, Y, R, E might be to equal
alpar@1
     9
   5, 9, 20 and 13, or any other combination that add up to 47).
alpar@1
    10
   Find the value of each letter under the equations:
alpar@1
    11
alpar@1
    12
   BALLET  45     GLEE  66     POLKA      59     SONG     61
alpar@1
    13
   CELLO   43     JAZZ  58     QUARTET    50     SOPRANO  82
alpar@1
    14
   CONCERT 74     LYRE  47     SAXOPHONE 134     THEME    72
alpar@1
    15
   FLUTE   30     OBOE  53     SCALE      51     VIOLIN  100
alpar@1
    16
   FUGUE   50     OPERA 65     SOLO       37     WALTZ    34
alpar@1
    17
alpar@1
    18
   Solution:
alpar@1
    19
   A, B,C, D, E,F, G, H, I, J, K,L,M, N, O, P,Q, R, S,T,U, V,W, X, Y, Z
alpar@1
    20
   5,13,9,16,20,4,24,21,25,17,23,2,8,12,10,19,7,11,15,3,1,26,6,22,14,18
alpar@1
    21
alpar@1
    22
   Reference:
alpar@1
    23
   Koalog Constraint Solver <http://www.koalog.com/php/jcs.php>,
alpar@1
    24
   Simple problems, the crypto-arithmetic puzzle ALPHACIPHER. */
alpar@1
    25
alpar@1
    26
set LETTERS :=
alpar@1
    27
{     'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
alpar@1
    28
      'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'
alpar@1
    29
};
alpar@1
    30
/* set of letters */
alpar@1
    31
alpar@1
    32
set VALUES := 1..card(LETTERS);
alpar@1
    33
/* set of values assigned to the letters */
alpar@1
    34
alpar@1
    35
set WORDS;
alpar@1
    36
/* set of words */
alpar@1
    37
alpar@1
    38
param total{word in WORDS};
alpar@1
    39
/* total[word] is the total of the values assigned to the letters in
alpar@1
    40
   the word */
alpar@1
    41
alpar@1
    42
var x{i in LETTERS, j in VALUES}, binary;
alpar@1
    43
/* x[i,j] = 1 means that letter i is assigned value j */
alpar@1
    44
alpar@1
    45
s.t. phi{i in LETTERS}: sum{j in VALUES} x[i,j] = 1;
alpar@1
    46
alpar@1
    47
s.t. psi{j in VALUES}: sum{i in LETTERS} x[i,j] = 1;
alpar@1
    48
alpar@1
    49
s.t. eqn{word in WORDS}: sum{k in 1..length(word), j in VALUES}
alpar@1
    50
      j * x[substr(word,k,1), j] = total[word];
alpar@1
    51
alpar@1
    52
solve;
alpar@1
    53
alpar@1
    54
printf{i in LETTERS} "  %s", i;
alpar@1
    55
printf "\n";
alpar@1
    56
alpar@1
    57
printf{i in LETTERS} " %2d", sum{j in VALUES} j * x[i,j];
alpar@1
    58
printf "\n";
alpar@1
    59
alpar@1
    60
data;
alpar@1
    61
alpar@1
    62
param :  WORDS :   total :=
alpar@1
    63
         BALLET       45
alpar@1
    64
         CELLO        43
alpar@1
    65
         CONCERT      74
alpar@1
    66
         FLUTE        30
alpar@1
    67
         FUGUE        50
alpar@1
    68
         GLEE         66
alpar@1
    69
         JAZZ         58
alpar@1
    70
         LYRE         47
alpar@1
    71
         OBOE         53
alpar@1
    72
         OPERA        65
alpar@1
    73
         POLKA        59
alpar@1
    74
         QUARTET      50
alpar@1
    75
         SAXOPHONE   134
alpar@1
    76
         SCALE        51
alpar@1
    77
         SOLO         37
alpar@1
    78
         SONG         61
alpar@1
    79
         SOPRANO      82
alpar@1
    80
         THEME        72
alpar@1
    81
         VIOLIN      100
alpar@1
    82
         WALTZ        34 ;
alpar@1
    83
alpar@1
    84
end;