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.




(defmacro defconstraints (name size-name (var) . forms)
  ^(progn (defvar ,size-name ,(length forms))
          (defun ,name (,var)
            (list ,*forms))))
 
(defconstraints con con-count (s)
  (= (length s) con-count) ;; tautology
  (= (countq t [s -6..t]) 3)
  (= (countq t (mapcar (op if (evenp @1) @2) (range 1) s)) 2)
  (if [s 4] (and [s 5] [s 6]) t)
  (none [s 1..3])
  (= (countq t (mapcar (op if (oddp @1) @2) (range 1) s)) 4)
  (and (or [s 1] [s 2]) (not (and [s 1] [s 2])))
  (if [s 6] (and [s 4] [s 5]) t)
  (= (countq t [s 0..6]) 3)
  (and [s 10] [s 11])
  (= (countq t [s 6..9]) 1)
  (= (countq t [s 0..con-count]) 4))
 
(defun true-indices (truths)
  (mappend (do if @1 ^(,@2)) truths (range 1)))
 
(defvar results
  (append-each ((truths (rperm '(nil t) con-count)))
    (let* ((vals (con truths))
           (consist [mapcar eq truths vals])
           (wrong-count (countq nil consist))
           (pos-wrong (+ 1 (or (posq nil consist) -2))))
      (cond
        ((zerop wrong-count)
         ^((:----> ,*(true-indices truths))))
        ((= 1 wrong-count)
         ^((:close ,*(true-indices truths) (:wrong ,pos-wrong))))))))
 
(each ((r results))
  (put-line `@r`))