Naughty Love

 何か、ほんわかして癒される感じなので、はってみました。(^_^;
 TVアニメ「女神寮の寮母くん。」オープニングテーマです。
 ちなみに、「Naughty Love」とは、「いたずらな恋」という意味でしょうか。(^_^;
TVアニメ「女神寮の寮母くん。」オープニングテーマ「Naughty Love」Music Clip

※参考URL
TVアニメ「女神寮の寮母くん。」公式サイト

有罪無罪の論理問題をPythonで解いてみた。

 有罪無罪の論理問題Pythonで解いてみました。(^_^;

 4人の被告 A,B,C,Dが関与していて次の事実が明らかになった.
(1) AとBがともに有罪なら,Cは共犯者だ.
(2) Aが有罪ならば,BかCの少なくとも一人が共犯者だ.
(3) Cが有罪ならば,Dは共犯者だ.
(4) Aが潔白ならば,Dは有罪だ.
 確実に有罪なのは誰か.
1.A 2.B 3.C 4.D

 ただし、問題を一部修正して、選択肢を付けてみました。(^_^;
 有罪をTrue、無罪(潔白)をFalseとし、論理包含Impをとって回してみました。(^_^;

● Logic3.py

# coding: UTF-8
# Logic3.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]*4
    TF = (True, False)
    print("[A B C D]")
    for p in itertools.product(TF,repeat=4):
        a,b,c,d = p
        if not Imp(a and b,      c): continue   # 条件(1)
        if not Imp(      a, b or c): continue   # 条件(2)
        if not Imp(      c,      d): continue   # 条件(3)
        if not Imp(  not a,      d): continue   # 条件(4)
        pass # チェックを潜り抜けたものを表示
        print('[%s]'%getRowOfTFTbl(p))
        pass # 選択肢のチェック
        choices[0] &= a
        choices[1] &= b
        choices[2] &= c
        choices[3] &= d

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

if __name__ == '__main__':
    main()

●実行結果

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

※参考URL
数学とプログラミングに弱い学生が論理パズルをPythonで解きたい話 - a symmetry

teratailの「嘘つき族と正直族の問題」をPythonで解いてみた。

 teratailで見つけた「嘘つき族と正直族の問題」をPythonで解いてみました。(^_^;

ある村に,Aさん,Bさん,Cさん,Dさんの4人がいました.このうち2人は嘘つき族であり,このうち2人は正直族であることが分かっています.嘘つき族は必ずうそをつき,正直族は必ず正直に答えます.彼らは,論理的であり,ミスはありません.
あなたの手元には, 1,2,3,4と書かれた4枚のカードがあります.同じ数字が書かれたカードはありません.そこからランダムに選んで,一人1枚ずつ,彼らに渡しました. 彼らは,以下のように発言しました.
Aさん:私のカードは,偶数です.
Bさん:私のカードは,3か4のどちらかです.
Cさん:Bさんは,正直族です.
Dさん:私のカードは,1です.
彼らに配られた可能性のあるカードの数字と,誰が嘘つき族/正直族かを表示するプログラムを作成します.

 C++で作るのは難しいですが、Pythonなら簡単です。

● LiarsAndTruth-tellers.py

# coding: UTF-8
# LiarsAndTruth-tellers.py

import itertools
from time import time

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

def main():
    tm = time() # Timer Start
    TF = (True, False)
    CARDS = range(1,5)  # カード1~4
    print("配られたカード/正直族[1],嘘つき族[0]")
    print(" (A, B, C, D) / [A, B, C, D]")
    for p in itertools.permutations(CARDS):
        ca,cb,cc,cd = p         # card_a ~ card_d
        for q in itertools.product(TF,repeat=4):
            if not q.count(True)==2: continue
            la,lb,lc,ld = q     # liar_a ~ liar_d
            if not Eqv(la,ca%2==0): continue
            if not Eqv(lb,cb in [3,4]): continue
            if not Eqv(lc,lb): continue
            if not Eqv(ld,cd==1): continue
            pass # チェックを潜り抜けたものを表示
            print(' %s / %s'%(p,[int(x) for x in q]))

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

if __name__ == '__main__':
    main()

●実行結果

配られたカード/正直族[1],嘘つき族[0]
 (A, B, C, D) / [A, B, C, D]
 (1, 3, 2, 4) / [0, 1, 1, 0]
 (1, 3, 4, 2) / [0, 1, 1, 0]
 (1, 4, 2, 3) / [0, 1, 1, 0]
 (1, 4, 3, 2) / [0, 1, 1, 0]
 (3, 4, 1, 2) / [0, 1, 1, 0]
 (4, 2, 3, 1) / [1, 0, 0, 1]
Runtime : 0.000 [sec]

 ちなみに、Borland C++で、<algorithm>のnext_permutation()を使って作ると次のようになります。変数名などは、元のプログラムに合わせました。(^_^;

● LiarsAndTruth-tellers.cpp

/*
 * LiarsAndTruth-tellers.cpp
 */

#include<iostream>
#include<string>
#include <algorithm>    // next_permutation()を使うため
using namespace std;

int card_a, card_b, card_c, card_d;
int liar_a, liar_b, liar_c, liar_d;

void output() {
    cout << "配られたカード: ";
    cout << card_a << ", " << card_b << ", " << card_c << ", " << card_d << ", ";
    cout << "正直族[1],嘘つき族[0]:";
    cout << liar_a << ", " << liar_b << ", " << liar_c << ", " << liar_d << endl;
}

// 論理等価Eqv
int Eqv(int a, int b){
    return !(a^b);
}

int check() {
    int liars[] = {0,0,1,1};
    do{
        liar_a = liars[0]; liar_b = liars[1]; liar_c = liars[2]; liar_d = liars[3];
        if (! Eqv(liar_a, card_a%2==0)) continue;
        if (! Eqv(liar_b, card_b==3 || card_b==4)) continue;
        if (! Eqv(liar_c, liar_b==1)) continue;
        if (! Eqv(liar_d, card_d==1)) continue;
        return 1;   // true
    } while (next_permutation(liars, liars+4));
    return 0; // false
}

int main() {
    int cards[] = {1,2,3,4};
    do{
        card_a = cards[0]; card_b = cards[1]; card_c = cards[2]; card_d = cards[3];
        if (check()) {
            output();
        }
    } while (next_permutation(cards, cards+4));
    cout << "プログラム終了時は何かを入力" << endl;
    int x;    cin >> x;
    return 0;
}

●実行結果

配られたカード: 1, 3, 2, 4, 正直族[1],嘘つき族[0]:0, 1, 1, 0
配られたカード: 1, 3, 4, 2, 正直族[1],嘘つき族[0]:0, 1, 1, 0
配られたカード: 1, 4, 2, 3, 正直族[1],嘘つき族[0]:0, 1, 1, 0
配られたカード: 1, 4, 3, 2, 正直族[1],嘘つき族[0]:0, 1, 1, 0
配られたカード: 3, 4, 1, 2, 正直族[1],嘘つき族[0]:0, 1, 1, 0
配られたカード: 4, 2, 3, 1, 正直族[1],嘘つき族[0]:1, 0, 0, 1
プログラム終了時は何かを入力

 はてなで質問すればよかったのに。(^_^;

※参考URL
C++ - 嘘つき族と正直族の問題|teratail
next_permutationがイマイチよくわからなかったのでまとめてみた - Qiita

十進BASICでVBScriptのeval関数を呼び出してみた。(2)

 前回の続きです。(^_^;
 とりあえず、VBScriptのExecute文とeval()関数を呼び出せば、いろんなことができます。o(^-^)o

● VBsEval2.BAS

DECLARE EXTERNAL FUNCTION VBs.Eval$, VBs.Eval
DECLARE EXTERNAL SUB VBs.Exec
DECLARE EXTERNAL FUNCTION qq$,Replace$,SpecialFolders$

PRINT Replace$("pXXpXXPXXp","p","Y")
PRINT SpecialFolders$("Fonts")

END

! s$をダブルクォートで囲った文字列を返す
EXTERNAL FUNCTION qq$(s$)
LET qq$ = CHR$(34)& s$ &CHR$(34)
END FUNCTION

! VBScriptのReplace関数(ただし、引数3つ)
EXTERNAL FUNCTION Replace$(s$,f$,r$)
LET t$ = "Replace("& qq$(s$) &","& qq$(f$) &","& qq$(r$) &")"
LET Replace$ = VBs.Eval$(t$)
END FUNCTION

! 特殊フォルダー名取得 SpecialFolders$
EXTERNAL FUNCTION SpecialFolders$(s$)
CALL VBs.Exec("Dim objWshShell: Set objWshShell = CreateObject(""WScript.Shell"")")
LET t$ = "objWshShell.SpecialFolders("& qq$(s$) &")"
LET SpecialFolders$ = VBs.Eval$(t$)
END FUNCTION

MODULE VBs
OLE CREATEOBJECT "ScriptControl"
EXTERNAL SUB setLanguage(s$)
   OLE PropertyPut "language"
END SUB
CALL setLanguage("VBS")
PUBLIC FUNCTION Eval$, Eval
PUBLIC SUB Exec

EXTERNAL SUB Exec(s$)
   OLE METHOD "ExecuteStatement"
END SUB

EXTERNAL FUNCTION Eval$(s$)
   OLE METHOD "eval"
END FUNCTION

EXTERNAL FUNCTION Eval(s$)
   OLE METHOD "eval"
END FUNCTION

END MODULE

●実行結果

YXXYXXPXXY
C:\Windows\Fonts

※参考URL
Replace 関数|VBScript関数リファレンス
WSHで機能強化 | 十進BASIC 第2掲示板 | 3179
十進BASICでVBScriptのeval関数を呼び出してみた - rscのブログ

同じものを含む順列の問題をPythonで解いてみた。(3)

 知恵袋の同じものを含む順列の問題Pythonで解いてみました。(^_^;

 YOKOHAMAの8文字1列に並べるとき、次のような並べ方は何通りあるか。
(1)全ての並び方
(2)OとAが必ず偶数番目にある並べ方
(3)2つのAが隣り合う並べ方
(4)2つのOが隣り合わない並べ方
(5)Y、K、H、Mがこの順にある並べ方

 (2)番が一番、難しかったです。「OとAが必ず偶数番目にある」ということは、「Y、K、H、Mがすべて偶数番目にない」ということですよね。(^_^;

● PermSame3.py

# coding: UTF-8
# PermSame3.py

import itertools
from time import time

def toStr(li,sp=',',fm='%s'):
    return fm%sp.join(li)

def main():
    tm = time() # Timer Start
    P = 'YOKOHAMA'
    setPerms = set(itertools.permutations(P))   # 同じものを含む順列
    cnt1 = cnt2 = cnt3 = cnt4 = cnt5 = 0
    for p in setPerms:
        cnt1+=1
        s = toStr(p,'')
        y,k,h,m = s.index('Y'),s.index('K'),s.index('H'),s.index('M')
        t = [(x+1)%2 for x in (y,k,h,m)]    # 偶奇表
        if  0   not in t: cnt2+=1
        if 'AA'     in s: cnt3+=1
        if 'OO' not in s: cnt4+=1
        if y< k< h< m:    cnt5+=1

    print('(1) %d'%cnt1)
    print('(2) %d'%cnt2)
    print('(3) %d'%cnt3)
    print('(4) %d'%cnt4)
    print('(5) %d'%cnt5)
    print("Runtime : %.3f [sec]"%(time()-tm))   # Timer Stop & Disp

if __name__ == '__main__':
    main()

●実行結果

(1) 10080
(2) 144
(3) 2520
(4) 7560
(5) 420
Runtime : 0.085 [sec]

※参考URL
同じものを含む順列の問題をPythonで解いてみた。(2) - rscのブログ

十進BASICでVBScriptのeval関数を呼び出してみた

 十進BASICでVBScriptのeval()関数を呼び出してみました。(^_^;
 VBScriptで、代入や関数定義は、Execute文を使いますが、長いので、SUB Exec(s$)としました。
 また、Eval()関数は、戻り値として、数値や文字列などを返しますが、ここでは、数値を返すときは、Function Eval(s$)、文字列を返すときは、Function Eval$(s$)としました。
 ということで、これらのEval()関数は、できれば、例外状態処理 WHEN EXCEPTION IN ~ USE ~ END WHEN 文の中で使った方が安全かと思います。(^_^;
 ちなみに、VBScriptのeval()関数では代入ができないので、代入関数fLet()を作ってみました。自身は0を返すので、「x=a:~」とするところを「fLet(x,a)+~」として使います。(^_^;

● VBsEval1.BAS

DECLARE EXTERNAL FUNCTION VBs.Eval$, VBs.Eval
DECLARE EXTERNAL SUB VBs.Exec

CALL Exec("PI=4*ATN(1):E=EXP(1)")   ! 定数PI、Eを設定
CALL Exec("Function CosD(x):CosD=Cos(x/180*PI):End Function")  ! 関数定義
CALL Exec("Function fLet(ByRef x, a):x=a:fLet=0:End Function") ! 関数定義

LET f$ = "CosD(x)"
FOR x=0 TO 180 STEP 30
   WHEN EXCEPTION IN
      LET s$ = "fLet(x,"& STR$(x) &")+"& f$
      !PRINT s$,
      PRINT x, Eval(s$)
   USE
   END WHEN
NEXT x

END

MODULE VBs
OLE CREATEOBJECT "ScriptControl"
EXTERNAL SUB setLanguage(s$)
   OLE PropertyPut "language"
END SUB
CALL setLanguage("VBS")
PUBLIC FUNCTION Eval$, Eval
PUBLIC SUB Exec

EXTERNAL SUB Exec(s$)
   OLE METHOD "ExecuteStatement"
END SUB

EXTERNAL FUNCTION Eval$(s$)
   OLE METHOD "eval"
END FUNCTION

EXTERNAL FUNCTION Eval(s$)
   OLE METHOD "eval"
END FUNCTION

END MODULE

●実行結果

 0                       1 
 30                      .866025403784439 
 60                      .5 
 90                      6.12323399573677E-17 
 120                    -.5 
 150                    -.866025403784439 
 180                    -1 

※参考URL
十進BASIC−OCXの利用
同じものを含む順列の問題を十進BASICで解いてみた。
辞書式配列の問題を十進BASICで解いてみた。
十進BASICでVBScriptのeval関数を呼び出してみた。(2) - rscのブログ

【Arrayの略】のアンケート

 皆さん、アンケートの回答ありがとうございました。
 「ary」が一番人気のようです。ヨーロッパ系の女の人の名前っぽくて、何かいいですね。(^_^;
 「その他」の候補は、「a」あたりでしょうか。あと、有効期限延長のために使っただけで、選べなかったのかな。

※参考URL
Array - JavaScript | MDN
class Array (Ruby 3.0.0 リファレンスマニュアル)