Packages
fixpoint
0.8.33
0.22.1
0.21.5
0.21.4
0.21.3
0.21.2
0.21.1
0.21.0
0.20.6
0.20.5
0.20.4
0.20.3
0.20.2
0.20.1
0.19.5
0.19.4
0.19.3
0.19.2
0.19.1
0.18.2
0.18.1
0.17.6
0.17.5
0.17.4
0.17.3
0.17.2
0.17.1
0.16.5
0.16.4
0.16.3
0.16.2
0.16.1
0.16.0
0.15.6
0.15.5
0.15.4
0.15.3
0.15.2
0.15.1
0.15.0
0.14.9
0.14.8
0.14.7
0.14.6
0.14.5
0.14.4
0.14.3
0.14.2
0.14.1
0.13.5
0.13.4
0.13.2
0.13.1
0.12.9
0.12.8
0.12.7
0.12.6
0.12.5
0.12.4
0.12.2
0.12.1
0.11.8
0.11.7
0.11.6
0.11.5
0.11.4
0.11.3
0.11.2
0.11.1
0.10.7
0.10.6
0.10.5
0.10.4
0.10.3
0.10.2
0.10.1
0.9.12
0.9.11
0.9.10
0.9.9
0.9.8
0.9.7
0.9.6
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.52
0.8.51
0.8.50
0.8.49
0.8.48
0.8.46
0.8.44
0.8.43
0.8.42
0.8.41
0.8.40
0.8.39
0.8.38
0.8.37
0.8.36
0.8.35
0.8.34
0.8.33
0.8.32
0.8.31
0.8.30
0.8.29
0.8.28
0.8.27
0.8.26
0.8.25
0.8.24
0.8.23
0.8.22
0.8.21
0.8.20
0.8.19
0.8.18
0.8.17
0.8.16
0.8.15
0.8.14
0.8.13
0.8.12
0.8.11
0.8.10
0.8.9
0.8.8
0.8.7
0.8.6
0.8.5
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.10
0.7.9
0.7.8
0.7.7
0.7.6
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.5
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.12
0.5.11
0.5.10
0.5.9
0.5.8
0.5.7
0.5.6
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.3
0.4.2
0.4.1
0.4.0
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.3
0.2.2
0.2.1
0.1.3
0.1.2
0.1.1
0.1.0
Constraint Programming Solver
Current section
Files
Jump to
Current section
Files
lib/examples/euler43.ex
defmodule CPSolver.Examples.Euler43 do
@moduledoc """
https://projecteuler.net/problem=43
"""
@doc """
int: n = 10;
array[1..n] of var 0..9: x;
array[int] of int: primes = [2,3,5,7,11,13,17];
solve satisfy;
constraint
all_different(x) /\
forall(i in 2..8) (
(100*x[i] + 10*x[i+1] + x[i+2]) mod primes[i-1] = 0
)
;
output [ show(x),"\n"];
"""
alias CPSolver.IntVariable, as: Variable
alias CPSolver.Constraint.AllDifferent.FWC, as: AllDifferent
alias CPSolver.Constraint.Modulo
alias CPSolver.Model
import CPSolver.Constraint.Factory
import CPSolver.Variable.View.Factory
require Logger
@minizinc_solutions Enum.sort([
[4, 1, 6, 0, 3, 5, 7, 2, 8, 9],
[1, 4, 6, 0, 3, 5, 7, 2, 8, 9],
[4, 1, 0, 6, 3, 5, 7, 2, 8, 9],
[1, 4, 0, 6, 3, 5, 7, 2, 8, 9],
[4, 1, 3, 0, 9, 5, 2, 8, 6, 7],
[1, 4, 3, 0, 9, 5, 2, 8, 6, 7]
])
def model() do
primes = [2, 3, 5, 7, 11, 13, 17]
domain = 0..9
x = Enum.map(1..10, fn i -> Variable.new(domain, name: "x#{i}") end)
all_different_constraint = AllDifferent.new(x)
constraints =
Enum.reduce(2..8, [all_different_constraint], fn i, constraints_acc ->
x_i = Enum.at(x, i - 1)
x_i_1 = Enum.at(x, i)
x_i_2 = Enum.at(x, i + 1)
prime = Enum.at(primes, i - 2)
{sum_var, sum_constraint} = sum([mul(x_i, 100), mul(x_i_1, 10), x_i_2])
mod_constraint = Modulo.new(0, sum_var, prime)
[sum_constraint, mod_constraint | constraints_acc]
end)
Model.new(x, constraints)
end
def check_solution(solution) do
solution
|> Enum.take(10)
|> Kernel.in(@minizinc_solutions)
end
def run(opts \\ [search: {:input_order, :indomain_random}, space_threads: 8]) do
{:ok, res} = CPSolver.solve_sync(model(), opts)
Enum.sort(Enum.map(res.solutions, fn s -> Enum.take(s, 10) end))
|> tap(fn sorted_solutions ->
(sorted_solutions == @minizinc_solutions &&
Logger.notice("Solutions correspond to the ones given by MinZinc")) ||
Logger.error("Solutions do not match MiniZinc")
end)
|> Enum.reduce(0, fn s, sum_acc -> Integer.undigits(s) + sum_acc end)
end
end