I recently found a small game in the Google Play app store called Cryptogram . There are dozens of apps like this one. The idea is to match the number with the colors, so that all the equations sound believable.
I was able to quickly overcome problems 1-8 and problem 10, but problem 9 turned out to be more difficult for me.
Problem 9
, . Prolog/Datalog , Project Euler. 15 line Sudoku solver, Prolog Constraint Logic Programming over Finite Domains (clpfd), . SWI-Prolog.
:- use_module(library(clpfd)).
problem(Colors) :-
Colors = [Pink, Cyan, Yellow, Green, Purple, Red, Brown, White, Lime],
Colors ins 0..9,
all_distinct(Colors),
% The leading digit of a number can't be 0
Pink
Red
White
Green
Lime
Cyan
% I originally tried to write a predicate generalizing numbers and a list of digits
% but got in way over my head with CLPFD.
Number1_1
Number1_2
Number1_3
Number2_1
Number2_2
Number2_3
Number3_1
Number3_2
Number3_3
% I'm not 100% sure whether to use floored or truncated division here.
% I thought the difference would be a float vs integer output,
% but that doesn't make sense with finite domains.
Number1_1 // Number1_2
Number1_1 rem Number1_2
Number2_3
Number3_3
Number3_1
Number3_2
Number3_3
, SWI-Prolog, , CLPFD:
?- problem([Pink, Cyan, Yellow, Green, Purple, Red, Brown, White, Lime]).
Pink in 3..9,
_7756
_7810
all_distinct([Pink, Cyan, Yellow, Green, Purple, Red, Brown, White|...]),
Cyan in 1..7,
_7946
_7994
_8048
_8096
Yellow in 0..9,
_8162
Green in 1..7,
_8216
Purple in 0..9,
Red in 1..7,
_8294
Brown in 0..9,
White in 2..8,
Lime in 1..9,
_7756 in 1103..7568,
_8096+_7756
_8294+_8162
_8096 in 110..779,
_7810//_8216
_7810 in 3334..9799,
_8048+_8294
_7810 rem _8216
_8048 in 2313..8778,
_7946+_7994
_7946 in 1213..7678,
_7994 in 1100..7565,
_8216*_8162
_8216 in 12..79,
_8162 in 14..99,
_8294 in 1021..7486.
, 0..9, , . ?
, , . Cyan, 1.
?- problem([Pink, 1, Yellow, Green, Purple, Red, Brown, White, Lime]).
false.
. "" "Cyan in 1..7", , , , . , Cyan:
?- problem([Pink, 2, Yellow, Green, Purple, Red, Brown, White, Lime]).
Pink = 7,
Yellow = 6,
Green = 3,
Purple = 4,
Red = 1,
Brown = 8,
White = 5,
Lime = 9.
, . , , Prolog CLPFD .
2
. , . .
:- use_module(library(clpfd)).
digit_number(0, [], 1).
digit_number(Number, [Digit|Tail], DigitPlace) :-
digit_number(NextNumber, Tail, NextDigitPlace),
DigitPlace
PlaceNumber
Number
digit_number(Number, ColorList) :-
digit_number(Number, ColorList, _).
problem(Colors) :-
Colors = [Pink, Cyan, Yellow, Green, Purple, Red, Brown, White, Lime],
Colors ins 0..9,
all_distinct(Colors),
digit_number(Number1_1, [Pink, Cyan, Pink, Yellow]),
digit_number(Number1_2, [Green, Purple]),
digit_number(Number1_3, [Cyan, Red, Purple]),
digit_number(Number2_1, [Red, Brown, White, Red]),
digit_number(Number2_2, [Lime, Yellow]),
digit_number(Number2_3, [Red, Lime, Purple, Pink]),
digit_number(Number3_1, [White, Purple, Cyan, White]),
digit_number(Number3_2, [Green, Cyan, Yellow, Purple]),
digit_number(Number3_3, [Cyan, Red, Yellow, Red]),
Number1_1 // Number1_2
Number1_1 rem Number1_2
Number2_1 + Number2_2
Number3_1 - Number3_2
Number1_1 - Number2_1
Number1_2 * Number2_2
Number1_3 + Number2_3
label(Colors).