/usr/share/doc/glpk-utils/examples/crypto.mod is in glpk-utils 4.57-1build3.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | /* CRYPTO, a crypto-arithmetic puzzle */
/* Written in GNU MathProg by Andrew Makhorin <mao@gnu.org> */
/* This problem comes from the newsgroup rec.puzzle.
The numbers from 1 to 26 are assigned to the letters of the alphabet.
The numbers beside each word are the total of the values assigned to
the letters in the word (e.g. for LYRE: L, Y, R, E might be to equal
5, 9, 20 and 13, or any other combination that add up to 47).
Find the value of each letter under the equations:
BALLET 45 GLEE 66 POLKA 59 SONG 61
CELLO 43 JAZZ 58 QUARTET 50 SOPRANO 82
CONCERT 74 LYRE 47 SAXOPHONE 134 THEME 72
FLUTE 30 OBOE 53 SCALE 51 VIOLIN 100
FUGUE 50 OPERA 65 SOLO 37 WALTZ 34
Solution:
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
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
Reference:
Koalog Constraint Solver <http://www.koalog.com/php/jcs.php>,
Simple problems, the crypto-arithmetic puzzle ALPHACIPHER. */
set LETTERS :=
{ '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'
};
/* set of letters */
set VALUES := 1..card(LETTERS);
/* set of values assigned to the letters */
set WORDS;
/* set of words */
param total{word in WORDS};
/* total[word] is the total of the values assigned to the letters in
the word */
var x{i in LETTERS, j in VALUES}, binary;
/* x[i,j] = 1 means that letter i is assigned value j */
s.t. phi{i in LETTERS}: sum{j in VALUES} x[i,j] = 1;
s.t. psi{j in VALUES}: sum{i in LETTERS} x[i,j] = 1;
s.t. eqn{word in WORDS}: sum{k in 1..length(word), j in VALUES}
j * x[substr(word,k,1), j] = total[word];
solve;
printf{i in LETTERS} " %s", i;
printf "\n";
printf{i in LETTERS} " %2d", sum{j in VALUES} j * x[i,j];
printf "\n";
data;
param : WORDS : total :=
BALLET 45
CELLO 43
CONCERT 74
FLUTE 30
FUGUE 50
GLEE 66
JAZZ 58
LYRE 47
OBOE 53
OPERA 65
POLKA 59
QUARTET 50
SAXOPHONE 134
SCALE 51
SOLO 37
SONG 61
SOPRANO 82
THEME 72
VIOLIN 100
WALTZ 34 ;
end;
|