知恵袋で見つけた場合の数の道順問題をPythonで解いてみた。

 知恵袋で見つけた場合の数の道順問題Pythonで解いてみました。(^_^;

 図のような道路がある町において、道路を進む際、進むことのできる道路の方向が東方向、北方向および北東方向の3方向に限られているとき、図のA地点からB地点を経由してC地点へ行く道順は何通りあるか。
(1) 65通り (2) 78通り (3) 84通り (4) 91通り (5) 98通り

+-+-+-C        N
|/|/|/|       /|
+-+-+-+      *-+--
|/|/|/|        |
+-+-+-+        |
|/|/|/|
+-+-B-+
|/|/|/|
+-+-+-+
|/|/|/|
A-+-+-+

 最短なら斜め(/)をできるだけ多く通った方がいいから、最短経路とはちょっと違うけど、拙ブログの「最短経路の場合の数の問題をJavaで解いてみた。」を参考にして作りました。(^_^;
 ちなみに、自分で解く場合は、拙プログラムのように、逐次足し算でやる方法と、斜め(/)を通る回数(0,1,2)で場合分けする方法があります。

● NumOfPath1.py

# coding: UTF-8
# NumOfPath1.py

from time import time

sMap = [

    "     +-C",
    "     |/|",
    "     +-+",
    "     |/|",
    "     +-+",
    "     |/|",
    " +-+-B-+",
    " |/|/|  ",
    " +-+-+  ",
    " |/|/|  ",
    " A-+-+  ",
    "        ",
]

def main():
    tm = time() # Timer Start
    m,n = len(sMap),len(sMap[0])
    iMap = [[0 for i in range(n)] for j in range(m)]
##    print(m,n); print(iMap)
    # s/g型のsMapからs\g型のiMapを作成
    for i in range(m):
        for j in range(n):
            if sMap[i][j] in '|-/':
                iMap[m-1-i][j] = 1
##    print(iMap)
    # 逐次足し算
    iMap[1][1] = 1      # 和の初期値。StartのAだけ1、他の点は0
    for i in range(1,m,2):
        for j in range(1,n,2):
            if iMap[i  ][j-1]==1: iMap[i][j]+=iMap[i  ][j-2]
            if iMap[i-1][j  ]==1: iMap[i][j]+=iMap[i-2][j  ]
            if iMap[i-1][j-1]==1: iMap[i][j]+=iMap[i-2][j-2]
    # 結果の表示
    for i in reversed(range(1,m,2)):
        for j in range(1,n,2):
            print("%4d"%iMap[i][j],end='')
        print()
    print()

    print("∴%d"%iMap[m-1][n-1])
    print("Runtime : %.3f [sec]"%(time()-tm))   # Timer Stop & Disp

if __name__ == '__main__':
    main()

●実行結果

   0   0  13  91
   0   0  13  65
   0   0  13  39
   1   5  13  13
   1   3   5   0
   1   1   1   0

∴91
Runtime : 0.001 [sec]

※参考URL
道順が何通りあるか考える問題について質問です。 - 碁盤のマスの... - Yahoo!知恵袋
高校数学【場合の数と確率】〈最短経路の数〉図(一番下の画像)の... - Yahoo!知恵袋
最短経路の場合の数の問題をJavaで解いてみた。 - rscのブログ
立体の最短経路の場合の数の問題をJavaで解いてみた。 - rscのブログ
立体の最短経路の場合の数の問題をJavaで解いてみた。(2) - rscのブログ









【ウクライナ侵攻】のアンケート

 皆さん、アンケートの回答・コメント、ありがとうございました。
 「ネタ・ジョーク」は、誤解を招く表現のようなので、修正しました。ただ、遠慮なく気軽に回答してもらいたかっただけです。
 最近、コロナにウクライナにと、嫌なことが続いています。コロナの方はもうすぐ終わりそうですが、ウクライナの方も早く終わってほしいものです。(^_^;

QUEENDOM / チキチキバンバン

 TVアニメ「パリピ孔明」OPテーマです。(^_^;
TVアニメ「パリピ孔明」OPテーマ「チキチキバンバン」ノンテロップ映像 - YouTube

QUEENDOM / チキチキバンバン(Full ver.) Art Track - YouTube

 原曲は、Jolly の「Bulikiraly」らしいです。(^_^;
♛Jolly-Bulikirály /Ciki Ciki Bam Bam Official Music Video 2013 / - YouTube

※参考URL
チキチキバンバン (JOLLYの曲) - Wikipedia
チキチキバンバンのジョリー(JOLLY)公式サイト

知恵袋の三段論法の問題をPythonで解いてみた。

 知恵袋の三段論法の問題Pythonで解いてみました。

A: 社交的な人は協調性がある。
B: [ ]
C: 明朗でない人は社交的でない。
上のAとBから三段論法でCが導かれるという。Bは次のうちどれか。
1 社交的でない人は明朗でない。
2 明朗でない人は協調性がない。
3 協調性のある人は明朗でない。
4 明朗な人は協調性がある。
5 協調性のない人は明朗でない。

 「社交的である.」を s、「協調性がある.」を k、「明朗である.」を m として、{s,k,m} = {True, False}の直積で回してみました。その全パターンで、「条件A ∧ 条件B(1~5) → 条件C」が成り立つものを求める条件Bとしました。

● Syllogism1.py

# coding: UTF-8
# Syllogism1.py

import itertools
from time import time

# 論理包含「A⇒B」の真理値を得る
def Imp(a,b):
    return not a or b

# 真理値表の1行を文字列で得る
def getRowOfTFTbl(li):
    return ' '.join([str(b)[0] for b in li])

# 確実にいえる選択肢を得る
def getAns(cho,lbl='12345'):
    return ','.join([lbl[i] for i in range(len(cho)) if cho[i]])

def main():
    tm = time() # Timer Start
    choices = [True]*5
    TF = (True, False)
    print("[s,k,m,1,2,3,4,5]")
    for p in itertools.product(TF,repeat=3):
        # s:「社交的である.」; k:「協調性がある.」; m:「明朗である.」
        s,k,m = p
        A  = Imp(    s,     k)  # 条件A
        B1 = Imp(not s, not m)  # 条件B群
        B2 = Imp(not m, not k)
        B3 = Imp(    k, not m)
        B4 = Imp(    m,     k)
        B5 = Imp(not k, not m)
        C  = Imp(not m, not s)  # 条件C
        pass # 選択肢のチェック
        c1 = Imp(A and B1, C)   # 選択肢の真理値
        c2 = Imp(A and B2, C)
        c3 = Imp(A and B3, C)
        c4 = Imp(A and B4, C)
        c5 = Imp(A and B5, C)
        choices[0] &= c1
        choices[1] &= c2
        choices[2] &= c3
        choices[3] &= c4
        choices[4] &= c5
        # s,k,m と選択肢の真理値表を表示
        li = list(p) + [c1,c2,c3,c4,c5]
        print('[%s]'%getRowOfTFTbl(li))

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

if __name__ == '__main__':
    main()

●実行結果

[s,k,m,1,2,3,4,5]
[T T T T T T T T]
[T T F F T F F F]
[T F T T T T T T]
[T F F T T T T T]
[F T T T T T T T]
[F T F T T T T T]
[F F T T T T T T]
[F F F T T T T T]
∴2
Runtime : 0.001 [sec]

※参考URL

論理包含 - Wikipedia

・(P→Q)∧(Q→R)→(P→R) (推移律、三段論法)