How to resolve the algorithm Twelve statements step by step in the Nim programming language

Published on 12 May 2024 09:40 PM

How to resolve the algorithm Twelve statements step by step in the Nim programming language

Table of Contents

Problem Statement

This puzzle is borrowed from   math-frolic.blogspot.

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

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.

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

Let's start with the solution:

Step by Step solution about How to resolve the algorithm Twelve statements step by step in the Nim programming language

Source code in the nim programming language

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


  

You may also check:How to resolve the algorithm Nth root step by step in the CoffeeScript programming language
You may also check:How to resolve the algorithm Munchausen numbers step by step in the Swift programming language
You may also check:How to resolve the algorithm Simple database step by step in the Common Lisp programming language
You may also check:How to resolve the algorithm 4-rings or 4-squares puzzle step by step in the AWK programming language
You may also check:How to resolve the algorithm Horizontal sundial calculations step by step in the C programming language