This puzzle is borrowed from   math-frolic.blogspot.



Given the following twelve statements, which of them are true?

 1.  This is a numbered list of twelve statements.
 2.  Exactly 3 of the last 6 statements are true.
 3.  Exactly 2 of the even-numbered statements are true.
 4.  If statement 5 is true, then statements 6 and 7 are both true.
 5.  The 3 preceding statements are all false.
 6.  Exactly 4 of the odd-numbered statements are true.
 7.  Either statement 2 or 3 is true, but not both.
 8.  If statement 7 is true, then 5 and 6 are both true.
 9.  Exactly 3 of the first 6 statements are true.
10.  The next two statements are both true.
11.  Exactly 1 of statements 7, 8 and 9 are true.
12.  Exactly 4 of the preceding statements are true.



Task

When you get tired of trying to figure it out in your head,
write a program to solve it, and print the correct answer or answers.



Extra credit

Print out a table of near misses, that is, solutions that are contradicted by only a single statement.




import bitops, sequtils, strformat, strutils, sugar
 
type Bools = array[1..12, bool]
 
const Predicates = [1:  (b: Bools) => b.len == 12,
                    2:  (b: Bools) => b[7..12].count(true) == 3,
                    3:  (b: Bools) => toSeq(countup(2, 12, 2)).mapIt(b[it]).count(true) == 2,
                    4:  (b: Bools) => not b[5] or b[6] and b[7],
                    5:  (b: Bools) => not b[2] and not b[3] and not b[4],
                    6:  (b: Bools) => toSeq(countup(1, 12, 2)).mapIt(b[it]).count(true) == 4,
                    7:  (b: Bools) => b[2] xor b[3],
                    8:  (b: Bools) => not b[7] or b[5] and b[6],
                    9:  (b: Bools) => b[1..6].count(true) == 3,
                    10: (b: Bools) => b[11] and b[12],
                    11: (b: Bools) => b[7..9].count(true) == 1,
                    12: (b: Bools) => b[1..11].count(true) == 4]
 
 
proc `$`(b: Bools): string =
  toSeq(1..12).filterIt(b[it]).join(" ")
 
 
echo "Exacts hits:"
var bools: Bools
for n in 0..4095:
  block check:
    for i in 1..12: bools[i] = n.testBit(12 - i)
    for i, predicate in Predicates:
      if predicate(bools) != bools[i]:
        break check
    echo "    ", bools
 
echo "\nNear misses:"
for n in 0..4095:
  for i in 1..12: bools[i] = n.testBit(12 - i)
  var count = 0
  for i, predicate in Predicates:
    if predicate(bools) == bools[i]: inc count
  if count == 11:
    for i, predicate in Predicates:
      if predicate(bools) != bools[i]:
        echo &"    (Fails at statement {i:2})  {bools}"
        break