[9] | 1 | /* CRYPTO, a crypto-arithmetic puzzle */ |
---|
| 2 | |
---|
| 3 | /* Written in GNU MathProg by Andrew Makhorin <mao@gnu.org> */ |
---|
| 4 | |
---|
| 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: |
---|
| 11 | |
---|
| 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 |
---|
| 17 | |
---|
| 18 | Solution: |
---|
| 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 |
---|
| 21 | |
---|
| 22 | Reference: |
---|
| 23 | Koalog Constraint Solver <http://www.koalog.com/php/jcs.php>, |
---|
| 24 | Simple problems, the crypto-arithmetic puzzle ALPHACIPHER. */ |
---|
| 25 | |
---|
| 26 | set LETTERS := |
---|
| 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' |
---|
| 29 | }; |
---|
| 30 | /* set of letters */ |
---|
| 31 | |
---|
| 32 | set VALUES := 1..card(LETTERS); |
---|
| 33 | /* set of values assigned to the letters */ |
---|
| 34 | |
---|
| 35 | set WORDS; |
---|
| 36 | /* set of words */ |
---|
| 37 | |
---|
| 38 | param total{word in WORDS}; |
---|
| 39 | /* total[word] is the total of the values assigned to the letters in |
---|
| 40 | the word */ |
---|
| 41 | |
---|
| 42 | var x{i in LETTERS, j in VALUES}, binary; |
---|
| 43 | /* x[i,j] = 1 means that letter i is assigned value j */ |
---|
| 44 | |
---|
| 45 | s.t. phi{i in LETTERS}: sum{j in VALUES} x[i,j] = 1; |
---|
| 46 | |
---|
| 47 | s.t. psi{j in VALUES}: sum{i in LETTERS} x[i,j] = 1; |
---|
| 48 | |
---|
| 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]; |
---|
| 51 | |
---|
| 52 | solve; |
---|
| 53 | |
---|
| 54 | printf{i in LETTERS} " %s", i; |
---|
| 55 | printf "\n"; |
---|
| 56 | |
---|
| 57 | printf{i in LETTERS} " %2d", sum{j in VALUES} j * x[i,j]; |
---|
| 58 | printf "\n"; |
---|
| 59 | |
---|
| 60 | data; |
---|
| 61 | |
---|
| 62 | param : WORDS : total := |
---|
| 63 | BALLET 45 |
---|
| 64 | CELLO 43 |
---|
| 65 | CONCERT 74 |
---|
| 66 | FLUTE 30 |
---|
| 67 | FUGUE 50 |
---|
| 68 | GLEE 66 |
---|
| 69 | JAZZ 58 |
---|
| 70 | LYRE 47 |
---|
| 71 | OBOE 53 |
---|
| 72 | OPERA 65 |
---|
| 73 | POLKA 59 |
---|
| 74 | QUARTET 50 |
---|
| 75 | SAXOPHONE 134 |
---|
| 76 | SCALE 51 |
---|
| 77 | SOLO 37 |
---|
| 78 | SONG 61 |
---|
| 79 | SOPRANO 82 |
---|
| 80 | THEME 72 |
---|
| 81 | VIOLIN 100 |
---|
| 82 | WALTZ 34 ; |
---|
| 83 | |
---|
| 84 | end; |
---|