1 /* CRYPTO, a crypto-arithmetic puzzle */
3 /* Written in GNU MathProg by Andrew Makhorin <mao@gnu.org> */
5 /* This problem comes from the newsgroup rec.puzzle.
6 The numbers from 1 to 26 are assigned to the letters of the alphabet.
7 The numbers beside each word are the total of the values assigned to
8 the letters in the word (e.g. for LYRE: L, Y, R, E might be to equal
9 5, 9, 20 and 13, or any other combination that add up to 47).
10 Find the value of each letter under the equations:
12 BALLET 45 GLEE 66 POLKA 59 SONG 61
13 CELLO 43 JAZZ 58 QUARTET 50 SOPRANO 82
14 CONCERT 74 LYRE 47 SAXOPHONE 134 THEME 72
15 FLUTE 30 OBOE 53 SCALE 51 VIOLIN 100
16 FUGUE 50 OPERA 65 SOLO 37 WALTZ 34
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
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
23 Koalog Constraint Solver <http://www.koalog.com/php/jcs.php>,
24 Simple problems, the crypto-arithmetic puzzle ALPHACIPHER. */
27 { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
28 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'
32 set VALUES := 1..card(LETTERS);
33 /* set of values assigned to the letters */
38 param total{word in WORDS};
39 /* total[word] is the total of the values assigned to the letters in
42 var x{i in LETTERS, j in VALUES}, binary;
43 /* x[i,j] = 1 means that letter i is assigned value j */
45 s.t. phi{i in LETTERS}: sum{j in VALUES} x[i,j] = 1;
47 s.t. psi{j in VALUES}: sum{i in LETTERS} x[i,j] = 1;
49 s.t. eqn{word in WORDS}: sum{k in 1..length(word), j in VALUES}
50 j * x[substr(word,k,1), j] = total[word];
54 printf{i in LETTERS} " %s", i;
57 printf{i in LETTERS} " %2d", sum{j in VALUES} j * x[i,j];
62 param : WORDS : total :=