知恵袋の「ウソつき問題」をPythonで解いてみた。(4)

 知恵袋の「ウソつき問題」をPythonで解いてみました。(^_^;

 正直ものは常に正しいことを言い、うそつきは常にうそを言っているとすると、A~Dのち正直者はだれか。
A「Bはうそつきだ」
B「僕はうそつきじゃない。Cはうそつきだ」
C「僕はうそつきじゃない。Dはうそつきだ」
D「君たちは3人ともうそつきじゃないよ」
選択肢
1 AとB、2 AとC、3 AとD、4 BとC、5 BとD

 「僕はうそつきじゃない」は正直者もうそつきも言うから参考にはならないだけじゃなく、ちょっと問題があるようです。
 たとえば、「Eqv(a,a!=False and ~)」で、「a==False ならば、and以降に無関係に真になってしますので、「a!=False」は省略するか、「Eqv(a,a!=False)」と「Eqv(a,~)」のように分けないといけないようです。(^_^;
 それから、「aはウソつきである」等は、次のように書き換えてもいいようです。
 「aはウソつきである」 ≡「a==False」≡「not a」
 「aはウソつきではない」≡「a!=False」≡「not(not a)」≡「a」
 「aは正直者である」 ≡「a==True」 ≡「a」
 ちなみに、「if not Eqv(b,b)」と「「if not Eqv(c,c)」」は必ずFalseになるのが明らかなので、コメントアウトしました。(^_^;

● Liar4.py

# coding: UTF-8
# Liar4.py

import itertools
from time import time

# 論理等価Eqv
def Eqv(p,q):
    return not(p^q)

# 真理値表の1行を文字列で得る
def getRowOfTruthTable(lst):
    result = ""
    for b in lst:
        result += " T" if b else " F"
    return result

# 正直者をすべて得る
def getHonestMen(name,li):
    result = []
    for i in range(len(li)):
        if li[i]:
            result.append(name[i])
    return ','.join(result)

def main():
    tm = time()  # Timer Start
    TF = (True,False)
    cnt = 0
    for p in itertools.product(TF,repeat=4):
        a,b,c,d = p
        if not Eqv(a,not b): continue           # b==False
##        if not Eqv(b,    b): continue           # b!=False
        if not Eqv(b,not c): continue           # c==False
##        if not Eqv(c,    c): continue           # c!=False
        if not Eqv(c,not d): continue           # d==False
        if not Eqv(d,a and b and c): continue   # a==b==c!=False
        # チェックを潜り抜けたものだけを表示
        cnt+=1
        if cnt==1: print('[A B C D]')
        print('%s'%getRowOfTruthTable([a,b,c,d]))
        print(u'∴正直者: %s'%getHonestMen('ABCD',p))

    print("Runtime : %.3f [sec]"%(time()-tm))   # Timer Stop & Disp

if __name__ == '__main__':
    main()

●実行結果

[A B C D]
 T F T F
∴正直者: A,C
Runtime : 0.000 [sec]

※参考URL
知恵袋の「ウソつき問題」をPythonで解いてみた。(3) - rscのブログ
知恵袋の「ウソつき問題」をPythonで解いてみた。(2) - rscのブログ
知恵袋の「ウソつき問題」をPythonで解いてみた。 - rscのブログ
知恵袋の「うそつき問題」をJavaで解いてみた。
ネットで見つけた「うそつき問題」をJavaで解いてみた。
ネットで見つけた「うそつき問題」を自分で解いてみた。
2つの発言の「うそつき問題」をJavaで解いてみた。









知恵袋の「ウソつき問題」をPythonで解いてみた。(3)

 知恵袋の「ウソつき問題」をPythonで解いてみました。(^_^;

 A~Eの5人が次のように発言している
A「Bはウソつきだ」
B「Cはウソつきではない」
C「D.Eはどちらもウソつきだ」
D「Eはウソつきだ」
E「私はウソつきではない」
5人のうち、何人かがウソをついている。このとき確実にいえることはどれか。
選択肢
1、Aはウソつきである
2、Bはウソつきである
3、Cはウソつきではない
4、Dはウソつきである
5、Eはウソつきではない

 自分で解くとすれば、GW法を用いるようです。
 ちなみに、「僕はうそつきじゃない」は正直者もうそつきも言うから参考にはならない、そうです。コメントアウトしても同じ結果を得ます。(^_^;

● Liar3.py

# coding: UTF-8
# Liar3.py

import itertools
from time import time

# 論理等価Eqv
def Eqv(p,q):
    return not(p^q)

# 真理値表の1行を文字列で得る
def getRowOfTruthTable(lst):
    result = ""
    for b in lst:
        result += " T" if b else " F"
    return result

def main():
    tm = time()  # Timer Start
    choices = [True]*5
    TF = (True,False)
    cnt = 0
    for p in itertools.product(TF,repeat=5):
        a,b,c,d,e = p
        if not Eqv(a,b==False): continue
        if not Eqv(b,c!=False): continue
        if not Eqv(c,d==False and e==False): continue
        if not Eqv(d,e==False): continue
        if not Eqv(e,e!=False): continue
        # チェックを潜り抜けたものだけを表示
        cnt+=1
        if cnt==1: print('[A B C D E]')
        print('%s'%getRowOfTruthTable([a,b,c,d,e]))
         # 選択肢のチェック
        choices[0] &= (a==False)
        choices[1] &= (b==False)
        choices[2] &= (c!=False)
        choices[3] &= (d==False)
        choices[4] &= (e!=False)

    s = ""
    if cnt==0: choices = [False]*5
    for c in choices:
        if c : s+=" %s"%(choices.index(c)+1)
    print(u"∴%s"%s)
    print("Runtime : %.3f [sec]"%(time()-tm))   # Timer Stop & Disp

if __name__ == '__main__':
    main()

●実行結果

[A B C D E]
 T F F T F
 T F F F T
∴ 2
Runtime : 0.000 [sec]

※参考URL
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1121910336
ウソつき問題とGW法 - PSM
知恵袋の「ウソつき問題」をPythonで解いてみた。(2) - rscのブログ
知恵袋の「ウソつき問題」をPythonで解いてみた。 - rscのブログ
知恵袋の「うそつき問題」をJavaで解いてみた。
ネットで見つけた「うそつき問題」をJavaで解いてみた。
ネットで見つけた「うそつき問題」を自分で解いてみた。
2つの発言の「うそつき問題」をJavaで解いてみた。









知恵袋の「ウソつき問題」をPythonで解いてみた。(2)

 知恵袋の「ウソつき問題」をPythonで解いてみました。(^_^;
 以前、Javaで作ったプログラムをPythonへの翻訳ではなく、論理等価Eqvを使って真理値表を調べる方法で作り直してみました。

 ある事件について事情を知っているA~Iが、容疑者について以下のように発言している。この内本当のことを言っているのは3人で、残りの6人は嘘を言っている。本当のことを言っている3人の組み合わせとして正しいものはどれか。ただし実行犯が1人であることはわかっている。
A 犯人はEである。
B 犯人はEではない。
C 自分が犯人である。
D 犯人はCかHである。
E 自分が犯人である。
F 犯人はCである。
G 犯人はCではない。
H 犯人はCでも自分でもない。
I 犯人はEではないし、Hは嘘をついていない。

 プログラムでは、犯人をx(=A~I)とし、また、正直者をTrue、うそつきをFalseとして、発言者(a~i)と発言内容の論理等価Eqvをとって回してみました。(^_^;

● Liar2.py

# coding: UTF-8
# Liar2.py

import itertools
from time import time

# 論理等価Eqv
def Eqv(p,q):
    return not(p^q)

# 正直者をすべて得る
def getHonestMen(name,li):
    result = []
    for i in range(len(li)):
        if li[i]:
            result.append(name[i])
    return ','.join(result)

def main():
    tm = time()  # Timer Start
    C = 'ABCDEFGHI'
    TF = (True,False)
    for x in C:
        for p in itertools.product(TF,repeat=9):
            if not p.count(True)==3: continue
            a,b,c,d,e,f,g,h,i = p
            if not Eqv(a,x=='E'): continue
            if not Eqv(b,x!='E'): continue
            if not Eqv(c,x=='C'): continue
            if not Eqv(d,x=='C' or  x=='H'):   continue
            if not Eqv(e,x=='E'): continue
            if not Eqv(f,x=='C'): continue
            if not Eqv(g,x!='C'): continue
            if not Eqv(h,x!='C' and x!='H'):   continue
            if not Eqv(i,x!='E' and h!=False): continue
            # チェックを潜り抜けたものだけを表示
            print(u'犯  人: %s'%x)
            print(u'正直者: %s'%getHonestMen(C,p))

    print("Runtime : %.3f [sec]"%(time()-tm))   # Timer Stop & Disp

if __name__ == '__main__':
    main()

●実行結果

犯  人: H
正直者: B,D,G
Runtime : 0.000 [sec]

※参考URL
知恵袋の「ウソつき問題」をPythonで解いてみた。 - rscのブログ
知恵袋の「うそつき問題」をJavaで解いてみた。
ネットで見つけた「うそつき問題」をJavaで解いてみた。
ネットで見つけた「うそつき問題」を自分で解いてみた。
2つの発言の「うそつき問題」をJavaで解いてみた。









知恵袋の「ウソつき問題」をPythonで解いてみた。

 知恵袋の「ウソつき問題」をPythonで解いてみました。(^_^;

 A,B,C,D,E,さんのうち、何人かがうそつきで残りは正直者、5人に「あなたたちのうち、うそつきは何人いますか」と聞くと、下のように答えました。5人のうちうそつきは何人いますか。
A・1人 B・2人 C・3人 D・4人 E・5人

 プログラムでは、正直者をTrue、うそつきをFalseとして、発言者と発言内容の論理等価Eqvをとってみました。(^_^;
 ちなみに、「P Eqv Q」は、「not(P Xor Q)」と同じことです。

● Liar1.py

# coding: UTF-8
# Liar1.py

import itertools
from time import time

# 論理等価Eqv
def Eqv(p,q):
    return not(p^q)

# 真理値表の1行を文字列で得る
def getRowOfTruthTable(lst):
    result = ""
    for b in lst:
        result += " T" if b else " F"
    return result

def main():
    tm = time()  # Timer Start
    TF = (True,False)
    for p in itertools.product(TF,repeat=5):
        a,b,c,d,e = p
        if not Eqv(a,p.count(False)==1): continue
        if not Eqv(b,p.count(False)==2): continue
        if not Eqv(c,p.count(False)==3): continue
        if not Eqv(d,p.count(False)==4): continue
        if not Eqv(e,p.count(False)==5): continue
        # チェックを潜り抜けたものだけを表示
        print('[A B C D E]')
        print(getRowOfTruthTable(p))
        print(u'∴ %d人'%p.count(False))

    print("Runtime : %.3f [sec]"%(time()-tm))   # Timer Stop & Disp

if __name__ == '__main__':
    main()

●実行結果

[A B C D E]
 F F F T F
∴ 4人
Runtime : 0.001 [sec]

※参考URL
否定排他的論理和 ‐ 通信用語の基礎知識
知恵袋の「うそつき問題」をJavaで解いてみた。
ネットで見つけた「うそつき問題」をJavaで解いてみた。
ネットで見つけた「うそつき問題」を自分で解いてみた。
2つの発言の「うそつき問題」をJavaで解いてみた。









【論理包含演算子Imp】の質問

 皆さん、質問の回答・コメント有難うございました。
 Rubyでは、メソッド表現で簡単にできるようですが、Pythonでは難しいようです。
 そこで、拙ブログの論理問題のプログラムPythonからRubyに翻訳して、「Imp(p,q)」を「p.Imp(q)」に書き直してみました。(^_^;

● Logic1.rb

# encoding: Shift_JIS
# Logic1.rb

#  論理包含「P⇒Q」の真理値を得る関数Imp
def Imp(p,q)
    return (!p)||q
end

# Impのメソッド版
def true.Imp q
    q
end

def false.Imp q
    true
end

# 真理値表の1行を文字列で得る
def getRowOfTruthTable(lst)
    result = ''
    for b in lst
        result += (b ? " T" : " F")
    end
    return result
end

def main()
    tm = Time.now  # Timer Start
    tf = [true, false]
    puts '[b,g,s] 1 2 3 4 5'  # b:野球; g:ゴルフ; s:サッカー
    choices = [true]*5
    cnt = 0
    tf.product(tf,tf).each do |b,g,s|
        next if !((  !b).Imp(g))  # 条件A
        next if !((s&&b).Imp(g))  # 条件B
        # チェックを潜り抜けたものだけを表示
        cnt+=1
        t = getRowOfTruthTable([b,g,s])
        # 選択肢のチェック
        choices[0] &= (c1 = (!b).Imp(!s))
        choices[1] &= (c2 = ( s).Imp( g))
        choices[2] &= (c3 = (!s).Imp( b))
        choices[3] &= (c4 = ( g).Imp(!b))
        choices[4] &= (c5 = (!g).Imp( s))
        puts '%s %s'%[t,getRowOfTruthTable([c1,c2,c3,c4,c5])]
    end
    s = ''
    choices = [false]*5 if cnt==0
    for c in choices
        s+=' %s'%[choices.index(c)+1] if c
    end
    puts '∴%s'%s
    print "Runtime : %.3f [sec]\n"%(Time.now-tm)      # Timer Stop & Disp
end

if $0 == __FILE__
    main()
end

●実行結果

[b,g,s] 1 2 3 4 5
 T T T  T T T F T
 T T F  T T T F T
 T F F  T T T T F
 F T T  F T T T T
 F T F  T T F T T
∴ 2
Runtime : 0.000 [sec]

※参考URL
知恵袋の判断推理の論理問題をPythonで解いてみた。 - rscのブログ
知恵袋の判断推理の論理問題をPythonで解いてみた。(2) - rscのブログ
知恵袋の判断推理の論理問題をJavaで解いてみた。 - rscのブログ

Thunderclouds

 Galaxy Note9のCMの曲ですが、何かいい感じなので、はってみました。(^_^;
LSD - Thunderclouds (Official Video) ft. Sia, Diplo, Labrinth

Thunderclouds

Thunderclouds

【読書の秋】の質問

 皆さん、質問の回答・コメント有難うございました。
 ご紹介いただいた本はどれも素晴らしいものばかりでしたが、ベストアンサーは、個人的に面白そうで読んでみたくなったので決めました。(^_^;

論理パラドクス 論証力を磨く99問 (二見文庫)

論理パラドクス 論証力を磨く99問 (二見文庫)