Я новичок в сплаве и пытался изложить следующую головоломку, данную мне другом с точки зрения ограничений по сплаву
- 682, один ди git прав, и в его правильное место занято
- 614 один ди git правильно, но в неправильном месте занято
- 206 две цифры верны, но оба находятся в неправильное место
- 738 все цифры неверны
- 380 один ди git правильно, но не в том месте
Решение: 042
Мое неполное решение заключается в следующем:
open util/ordering[Key]
enum Numbers{o1,o2,o3,o4,o5,o6,o7,o8,o9,o0}
sig Key{
num: one Numbers
}
fact{
// 682 one digit is right and in its right place
all key: Key-first-last |
(key.prev.num = o6 and key.num != o8 and key.next.num != o2) or
(key.prev.num != o6 and key.num = o8 and key.next.num != o2) or
(key.prev.num != o6 and key.num != o8 and key.next.num = o2)
// 614 one digit is right but in the wrong place
one key: Key-first-last |
((key.prev.num = o1 or key.prev.num = o4) or
(key.num = o6 or key.num = o4) or
(key.next.num = o6 or key.next.num = o1)) and
key.prev.num != o6 and key.num !=o1 and key.next.num != o4
// 206 two digits are right but both are in the wrong place
// Haven't posed this constraint yet
// all 738 digits are wrong
all key: Key |
key.num != o7 and key.num != o3 and key.num != o8
// 380 one digit is right but in the wrong place
one key: Key-first-last |
((key.prev.num = o8 or key.prev.num = o0) or
(key.num = o3 or key.num = o0) or
(key.next.num = o3 or key.next.num = o8)) and
key.prev.num != o3 and key.num !=o8 and key.next.num != o0
}
run {} for exactly 3 Key
Может кто-нибудь предложить мне оптимальный способ или один из оптимальные способы поставить ограничения, как определено в следующей задаче?
Я вижу, что мои ограничения не совсем соответствуют поставленной задаче, например, ограничение одно, где моё ограничение недостаточно строго, так как проблема говоря. Но то, как я излагаю и ограничиваю каждый Ключ, сделает это очень многословным. Я хочу использовать некоторые более общие определения, чтобы установить ограничение.