#include "puzutl.h"

int kai[8] = { 1, 0, 1, 0, 1, 0, 1, 0}; // A〜Hの人がなんと答えたか 1:はい, 0:いいえ

void getsamenum( int samenum[], int man[], int k)
{
  int right = 0, left = 0;
  // まず左右の正直者の数を求める
  for( int i=0; i< 8; i++) {
    if( i< k && man[i]) right++;
    if( i> k && man[i]) left++;
  }
  samenum[k] = (left == right)?1:0; // 左右の正直者の数は同数か?
}

void check( int i)
{
  // インデックスは [0]:A, [1]:B, [2]:C, [3]:D, [4]:E, [5]:F, [6]:G, [7]:H とみなす
  int man[8];                   // 正直者かどうか?
  int samenum[8];               // 左右同数?
  int res[8];                   // どう答える(1:はい,0:いいえ)
  int b = 1;
  for( int k=0; k< 8; k++) {
    man[k] = i & b;             // ビット状態から正直者か判断する
    b <<= 1;
  }
  for( k=0; k< 8; k++) {
    getsamenum( samenum, man, k);   // それぞれの人の位置で正直者,嘘つきが同数か?
  }
  for( k=0; k< 8; k++) {
    if( man[k]) res[k] = samenum[k]?1:0; // 正直者は正直に答え
    else res[k] = samenum[k]?0:1; // 嘘つきは逆に答える
  }
  for( k=0; k< 8; k++) {
    if( res[k] != kai[k]) return; // それが問題と一致するか?
  }
  // Find
  for( k=0; k< 8; k++) {
    ps( "%c:%s ", 'A'+k, man[k]?"正直者":"嘘つき");
  }
}

int main( int argc, cstring argv[])
{
  for( int i=0; i< 256; i++) {
    check( i); // 8ビットの各ビットが1:正直者,0:嘘つきとみなし問題と矛盾が無いか調べる
  }
  return    0;
}