知恵袋で見つけた数的処理の最大・最小の問題をPythonで解いてみた。

 知恵袋で見つけた数的処理の最大・最小の問題Pythonで解いてみました。(^_^;

 A〜D4つの都市がある。ある人が車である都市を出発し、他の都市に1度ずつ立ち寄って、再び最初の都市に戻る。ある人の運転する車で各都市間を移動する際の燃料消費量が以下のようになるとき最小となる燃料消費量はいくらか。
 移動経路(消費量L)
 A→B(20) C→A(15)
 A→C(15) C→B( 8)
 A→D(10) C→D( 6)
 B→A(14) D→A( 7)
 B→C( 4) D→B(12)
 B→D( 8) D→C( 4)

 ABCDとBCDAのように円順列で同じものとみなされる関係にあるものは、加法の交換法則から和が同じになるので、円順列を考えて、Aを起点に固定して考えます。すると、BCDの順列だけ考えて6通りだけ考えればよいことになります。
 ちなみに、A→B(20)、B→A(14)とあるように、逆順では和は同じになりません。
 プログラムでは、Aを固定して、BCDの順列で回して、取りうる経路のそれぞれの燃料消費量の合計を比較して最小値を求めました。

● FuelConsum1.py

# coding: UTF-8
# FuelConsum1.py

import itertools
from time import time

def toStr(lst):
    return '%s'%''.join(lst)

def main():
    tm = time()  # Timer Start
    fc = {  # 燃料消費量の辞書
        'AB':20, 'AC':15, 'AD':10, 'BC': 4, 'BD': 8, 'CD': 6,
        'BA':14, 'CA':15, 'DA': 7, 'CB': 8, 'DB':12, 'DC': 4
    }
    P = 'BCD'
    min,res = 1000,''
    for p in itertools.permutations(P):     # 'BCD'の順列で回す
        s = 'A'+toStr(p)    # 移動経路
        l = len(s)
        sum,expr = 0,''
        for i in range(l):
            t = fc[(s+'A')[i:i+2]]
            expr+='+%2s'%str(t)
            sum+=t
        expr = '%s: %s = %d'%(s,expr,sum)
##        print(expr)
        if sum< min:
            min,res = sum,expr
    print(res)  # 結果
    print("Runtime : %.3f [sec]"%(time()-tm))   # Timer Stop & Disp

if __name__ == '__main__':
    main()

●実行結果

ADCB: +10+ 4+ 8+14 = 36
Runtime : 0.000 [sec]









【チェスのフリーソフト】の質問

 皆さん、質問の回答・コメント有難うございました。
 チェスエンジンにStockfishを使って、チェスエンジン用GUIArenaを使ってみることにしました。ここで、備忘録の代わりにやり方をメモしておきます。(^_^;
 一番目の参考URLを参考にして、Arena Chess GUIをインストールしましたが、「Arena Language Selection」では「English_Russian_Codepage」を選択しました。ここで、「English」を選択してしまうと、英語にドイツ語の混じった変な表示になってしまうのでご注意!
 また、駒がアルファベットになって変だったので、[Options]→[Appearance...]とクリックして、「Pieces」タブの「Settings for TrueType Fonts」を「Arial Unicode MS」に変更しました。
 二番目と三番目の参考URLを参考にして、StockfishをArenaに連係させました。三番目の参考URLでは、3.0へのバージョンアップにともないStockfishの連係が上手くいかなくなったとのことですが、現在のバージョン(3.5.1)では改善されたようです。
 ArenaのEnginesフォルダに、ダウンロードした「stockfish-9-win」をフォルダごとコピーしておいて、[Engines]→[Install New Engine] とクリックして、「stockfish_9_x32」を選択しました。これは、Windowsが32bitか64bitかで選びます。
 自分で検索したら、Lucas ChessScid Chessもいいみたいです。両方とも初めから、Stockfishが入っていましたが、特に、Lucas Chessには他にもたくさんのエンジンが入っていました。

※参考URL
チェス オープニング入門: Arena 3.0 ダウンロード〜解凍手順
チェスエンジン活用法
チェス オープニング入門: Arena と Critter を連係させる
https://www.chess.com/forum/view/chess-equipment/best-5-free-chess-software
https://www.chess.com/article/view/the-best-computer-chess-engines
Scid - Browse /Scid/Scid 4.6 at SourceForge.net

質問のコインの確率の問題をPythonで解いてみた。(2)

 質問のコインの確率の問題Pythonで解いてみました。(^_^;

コインを10枚、同時に投げ、表の出た枚数を数える、という施行を100回、繰り返したとき、表の枚数が0枚〜10枚のそれぞれになる「理論上の」回数

 1回の試行あたりのそれぞれの確率を求めて100をかければいいのかな。(^_^;
 検算のため、カウントして求める方法と反復試行の確率の公式から求める方法の2通りの方法で求めて比較してみました。(^_^;

P.S.
 質問がキャンセルされてしまったようです。(^_^;

● ProbOfCoin2.py

# coding: UTF-8
# ProbOfCoin2.py

from time import time
import itertools
import math

def nCr(n,r):
    f = math.factorial
    return f(n) // f(r) // f(n-r)

def main():
    tm = time()  # Timer Start
    C = 'AB'    # コインの表(A)裏(B)
    total = 0
    count = [0]*11
    for c in itertools.product(C,repeat=10):
        total+=1
        count[c.count('A')]+=1
##        print(c)
    li1 = [100.0*n/total for n in count]
    print(li1)
##    print(sum(li1))
    # 検算のため、反復試行の確率の公式でも求めてみる
    li2 = [100.0*nCr(10,n)*(1.0/2)**10 for n in range(10+1)]
    print(li2)
    print(li1==li2)
    print("Runtime : %.3f [sec]"%(time()-tm))   # Timer Stop & Disp

if __name__ == '__main__':
    main()

●実行結果

[0.09765625, 0.9765625, 4.39453125, 11.71875, 20.5078125, 24.609375, 20.5078125, 11.71875, 4.39453125, 0.9765625, 0.09765625]
[0.09765625, 0.9765625, 4.39453125, 11.71875, 20.5078125, 24.609375, 20.5078125, 11.71875, 4.39453125, 0.9765625, 0.09765625]
True
Runtime : 0.003 [sec]

※参考URL
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10150196165
https://stackoverflow.com/questions/4941753/is-there-a-math-ncr-function-in-python
https://mathtrain.jp/hanpukushikou









【Cドライブの空き容量不足】の質問

 皆さん、質問の回答・コメント有難うございました。削除してしまっても大丈夫みたいですね。
 Windows Defenderセキュリティセンターもクリーンインストールを勧めていますが、面倒なので、このままいこうかと思っています。(^_^;
 ちなみに、ディスク使用状況表示ソフトは、DiskInfoを使いました。
 それから、レジストリを変更するのが面倒だったので、Windows10設定変更ツール WinUpdateSettingsを使ってコルタナを無効にしてみましたが、タスクマネージャーのバックグラウンドプロセスの所に、状態は「中断」とはなっていますが、Cortanaが出てきています。「中断」ならば、初めから出てこなければいいのに。(^_^;

※参考URL
https://forest.watch.impress.co.jp/library/software/diskinfo/
https://forest.watch.impress.co.jp/library/software/winupdateset/

質問のコインの確率の問題をPythonで解いてみた。

 質問のコインの確率の問題Pythonで解いてみました。(^_^;

 A、Bが以下のルールで勝負したとき、Aが勝利する確率を計算してください。
[ルール1]コインを投げて、表が出たらAのポイント、裏が出たらBのポイントとする。
[ルール2]先に6ポイント獲得した方が、その時に相手に2ポイント以上の差をつけていた場合に勝利とする。どちらかが6ポイント獲得した際のポイント差が0または1の場合は、2ポイントの差がつくまでコインを投げ続けることとする。
[ルール3]1回目はコインの表が出たと仮定して計算することとする。
 Aがコインを投げる回数12回以下で勝利する確率を求めてください。

 確率の問題は、検算が難しいため、答えに確信が持てないことが多いですね。(^_^;

● ProbOfCoin1.py

# coding: UTF-8
# ProbOfCoin1.py

from fractions import Fraction
from time import time
import itertools

def toStr(li):
    return '%s'%''.join(li)

def main():
    tm = time()  # Timer Start
    C = 'AB'    # コインの表(A)裏(B)
    total = count = 0
    for c in itertools.product(C,repeat=11):
        total+=1
        s = 'A'+toStr(c)    # 結果を文字列にして並べる
        for i in range(6,12+1):
            t = s[:i]
            a,b = t.count('A'), t.count('B')
            if b>=6 and b>=a+2: break
            if a>=6 and a>=b+2:
##                print(t)
                count+=1
                break

    print("%d/%d = %s"%(count,total,Fraction(count,total)))
    print("Runtime : %.3f [sec]"%(time()-tm))   # Timer Stop & Disp

if __name__ == '__main__':
    main()

●実行結果

1150/2048 = 575/1024
Runtime : 0.032 [sec]

※参考URL
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13191407788
https://okwave.jp/qa/q9505686.html









判断推理のお弁当のおかずの種類の問題をPythonで解いてみた。

 判断推理のお弁当のおかずの種類の問題Pythonで解いてみました。(^_^;

 ある幼稚園では、図のように4人ずつのグループで円卓を囲んでお弁当を食べる。
 ある日のA〜Dの4人のお弁当に入っているおかずの種類を数えると、ハンバーグ、ベーコン巻き、春巻き、トマト、ブロッコリー、ポテトサラダの6種類だった。
 どの子供のお弁当も3種類ずつ入っており、向かいの人と同じおかずは一つもないが、隣の人とは同じおかずが少なくとも一つあった。・・・条件ア
 4人のお弁当のおかずについて次のことがわかっているとき、確実にいえるのはどれか。
 〇 Aには、ハンバーグとポテトサラダが入っていた。・・・条件イ
 〇 Bには、Aと同じおかずが二つあった。・・・条件ウ
 〇 Cには、トマトと春巻きが入っていた。・・・条件エ
 〇 Dには、春巻きもブロッコリーも入っていなかった。・・・条件オ

1. AとBのお弁当には、どちらもブロッコリーが入っていた。
2. AとDのお弁当には、どちらもハンバーグが入っていた。
3. BとCのお弁当には、どちらもハンバーグは入っていなかった。
4. BとDのお弁当には、どちらもポテトサラダは入っていなかった。
5. CとDのお弁当には、どちらもポテトサラダは入っていなかった。

    A
  /|\
 D--+--B
  \|/
    C

 ただし、条件にア〜オの名前を付けました。また、プログラムでは、次のような略号を用いました。

 おかず:(ハンバーグ,ベーコン巻き,春巻き,トマト,ブロッコリー,ポテトサラダ)
    ⇒(ハ,ベ,春,ト,ブ,ポ)

 プログラムで、条件ア-1の向かいの人の条件と条件ア-2の隣の人の条件は、それぞれ次式で表すことができます。
 条件ア-1:len(set(x+y))==6
 条件ア-2:len(set(x+y))< 6
ただし、x,yは、向かい合う二人または、隣り合う二人のお弁当のおかずのタプルです。(^_^;
 ちなみに、向かいの人の条件から、c,dを次式のように決めると、ループを2つ省くことができます。
 c = tuple(set(B)-set(a))
 d = tuple(set(B)-set(b))

● Bento1.py

# coding: UTF-8
# Bento1.py

import itertools
from time import time

def toStr(lst):
    return '[%s]'%','.join(lst)

def main():
    tm = time()  # Timer Start
    ch = [False]*5
    B = u'ハベ春トブポ'
    cnt = 0
    for a in itertools.combinations(B,3):
        if not u'ハ' in a: continue                     # 条件イ
        if not u'ポ' in a :continue                     # 条件イ
        for b in itertools.combinations(B,3):
            if not len(set(a+b))==6-2: continue         # 条件ウ
            for c in itertools.combinations(B,3):
                if not u'ト' in c: continue             # 条件エ
                if not u'春' in c: continue             # 条件エ
                if not len(set(a+c))==6: continue       # 条件ア-1
                if not len(set(b+c))< 6: continue       # 条件ア-2
                for d in itertools.combinations(B,3):
                    if u'春' in d: continue             # 条件オ
                    if u'ブ' in d: continue             # 条件オ
                    if not len(set(b+d))==6: continue   # 条件ア-1
                    if not len(set(c+d))< 6: continue   # 条件ア-2
                    if not len(set(d+a))< 6: continue   # 条件ア-2
                    # チェックを潜り抜けたものだけを表示
                    cnt+=1
                    print("[%d]"%cnt)
                    print('A: '+toStr(a))
                    print('B: '+toStr(b))
                    print('C: '+toStr(c))
                    print('D: '+toStr(d))
                    # 選択肢のチェック
                    if cnt==1: ch = [True]*5
                    ch[0] &= (u'ブ' in a and u'ブ' in b)
                    ch[1] &= (u'ハ' in a and u'ハ' in d)
                    ch[2] &= (u'ハ' not in b and u'ハ' not in c)
                    ch[3] &= (u'ポ' not in b and u'ポ' not in d)
                    ch[4] &= (u'ポ' not in c and u'ポ' not in d)
    s = ""
    for c in ch:
        if c : s+=" %s"%(ch.index(c)+1)
    print(u"∴%s"%s)
    print("Runtime : %.3f [sec]"%(time()-tm))   # Timer Stop & Disp

if __name__ == '__main__':
    main()

●実行結果

[1]
A: [ハ,ブ,ポ]
B: [ハ,春,ブ]
C: [ベ,春,ト]
D: [ベ,ト,ポ]
[2]
A: [ハ,ブ,ポ]
B: [春,ブ,ポ]
C: [ベ,春,ト]
D: [ハ,ベ,ト]
∴ 1
Runtime : 0.015 [sec]