Решение проблемы с замком и ключом с использованием сплава - PullRequest
0 голосов
/ 10 апреля 2020

Я новичок в сплаве и пытался изложить следующую головоломку, данную мне другом с точки зрения ограничений по сплаву

  1. 682, один ди git прав, и в его правильное место занято
  2. 614 один ди git правильно, но в неправильном месте занято
  3. 206 две цифры верны, но оба находятся в неправильное место
  4. 738 все цифры неверны
  5. 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

Может кто-нибудь предложить мне оптимальный способ или один из оптимальные способы поставить ограничения, как определено в следующей задаче?

Я вижу, что мои ограничения не совсем соответствуют поставленной задаче, например, ограничение одно, где моё ограничение недостаточно строго, так как проблема говоря. Но то, как я излагаю и ограничиваю каждый Ключ, сделает это очень многословным. Я хочу использовать некоторые более общие определения, чтобы установить ограничение.

...