【Python】Numer0n(ヌメロン)を作る方法 Part2

pythonでNumer0nを作成するPart2

こんにちは、にわこまです。

今回は、番号をコール(コマンドプロンプトからの入力)する関数と生成された番号とコールされた番号の比較を行う関数を作成します。これら2つの関数を作成したらNumer0nの完成です。

 

 

誤字脱字や分からない点がございましたらご連絡お願いいたします。

 

 

スポンサードサーチ


番号をコールする関数

番号をコールする関数

ここで言う「番号をコールする」とは、コマンドプロンプトから数字を入力することです。ただ入力するだけでなく、例外処理も行います。

 

番号をコールする関数のソースコードを以下に示します。

import random
import re
import sys

def createRnadomNumber(digits=3, dup=False):
    # 省略

def inputCallNumber(digits=3, dup=False):
    c = 0
    while(c < 5):
        call_num = input("数字を入力してください:")
        result = re.sub(r"\D", "", call_num)
        lng = len(call_num)
        if(dup and digits == lng and reuslt == call_num):
            return list(map(int, call_num))
        elif(not(dup) and digits == lng == len(set(call_num)) and result == call_num):
            return list(map(int, call_num))
        print("{0}桁の数字を入力してください".format(digits))
        print("")
        c += 1
    print("複数回間違った入力がされたためプログラムを終了します。")
    sys.exit()

def main():
    call_num_list = inputCallNumber(5, False)
    print("call_num_list :", call_num_list)

if __name__ == '__main__':
    main()
    pass

  

上記のコードは以下からダウンロードできます。

 

 

コードの解説

2行目の「import re」は、正規表現を扱うreライブラリをインポートしています。

 

3行目の「import sys」は、プログラムの動作に関するsysライブラリをインポートしています。

 

8行目から22行目の「inputCallNumer」は、番号をコール(コマンドプロンプトから数字を入力)する関数です。

第1引数の「digits」には桁数を代入します。初期値として3が代入してあります。

第2引数の「dup」には、TureまたはFalseを代入します。Trueの場合は「重複あり」、Falseの場合は「重複なし」になります。初期値としてFalse(重複なし)が代入してあります。

  

9行目の「c = 0」は、後述するwhile文の繰り替えし回数を数える変数です。

 

10行目から22行目の「while文」は、正しい数字が入力されるまで入力の要求を行う繰り返し文です。条件文は「c < 5」としており、5回以上間違った入力をしたらwhile文を抜け出すようにしてあります。

 

11行目の「call_num」は、入力された数字を代入する変数です。「input()」によってコマンドプロンプトから入力できるようにしてあります。

 

12行目の「result」は、call_numから抽出された数字を代入する変数です。re.sub()によって数字以外の文字を「””(空文字列)」に置換しています。

 

13行目の「lng」は、call_numの長さを代入しています。後述するif文の条件で使用します。

 

14行目の「if文」は、「dup」「digits == lng」「result == call_num」が全てTrueである場合に15行目の処理が実行されます。つまり、重複ありかつ桁数が正しかつ入力が数字のみである場合実行されます。

15行目の「return文」は、入力された数字を数値に変換しリスト形式で返却しています。

 

16行目の「if文」は、「not(dup)」「digits == lng == len(set(call_num))」「result == call_num」が全てTrueである場合に17行目の処理が実行されます。つまり、重複なしかつ桁数が正しいかつ入力が数字のみである場合実行されます。

17行目の「return文」は、入力された数字を数値に変換しリスト形式で返却しています。

 

20行目の「c += 1」は、whlie文の繰り返し回数を1増やしています。

 

22行目の「sys.exit()」は、強制的にプログラムを終了させています。

  

 

「inputCallNumber」動作確認

動作確認

コマンドプロンプトを開き、ファイルを保存したディレクトリまで移動します。移動したら以下のコマンドを入力し、実行します。

python numer0n_part2_1.py

 

任意の桁数の数字を入力して、入力した数字がリスト形式で表示されれば動作確認完了です。また、アルファベットや任意の桁数以外の入力を試してみてください。例として私の出力を以下に示します。

数字を入力してください:12345
call_num_list : [1, 2, 3, 4, 5]

  

 

スポンサードサーチ


生成された番号とコールされた番号の比較を行う関数

EAT数とBITE数を数える関数

生成された番号とはPart1で作成した「createRandomNumber関数」によって得られる番号(set_num_list)のことです。コールされた番号とは上記で作成した「inputCallNumber関数」によって得られる番号(call_num_list)のことです。

 

比較を行う関数では「set_num_list」と「call_num_list」の比較を行い、EATとBITEの数を返却します。

EAT(イート)とは、桁と数字が合っていることです。

BITE(バイト)とは、数字は合っているが桁が合っていないことです。

例えば、「123」という番号に対して「123」という番号をコールした場合は「3 EAT – 0 BITE」です。

また、「123」という番号に対して「312」という番号をコールした場合は「0 EAT – 3 BITE」です。

さらに、「123」という番号に対して「421」という番号をコールした場合は「1 EAT – 1 BITE」です。

  

生成された番号とコールされた番号を比較する関数(checkNumber)のソースコードを以下に示します。

import random
import re
import sys

def createRnadomNumber(digits=3, dup=False):
    # 省略

def inputCallNumber(digits=3, dup=False):
    # 省略

def checkNumber(set_num_list, call_num_list, digits=3):
    num_eat = 0     # EATの数を表す変数
    num_bite = 0    # BITEの数を表す変数
    counted_list = []
    call_num_set = set(call_num_list)
    for n in call_num_set:
        num_eat_temp = 0    # 特定の数字のEATの数を表す変数
        num_bite_temp = 0   # 特定の数字のBITEの数を表す変数
        idx_list = [i for i, x in enumerate(call_num_list) if x == n]   
        for idx in idx_list:
            if(set_num_list[idx] == call_num_lsit[idx]):
                num_eat += 1
                num_eat_temp += 1
        if(n not in counted_list):
            counted_list.append(n)
            num_bite_temp = set_num_list.count(n)
            if(num_bite_temp > 0):
                num_bite += num_bite_temp - num_eat_temp
    return num_eat, num_bite

def main():
    set_num_list = [3, 6, 9]
    call_num_list = [1, 3, 9]
    num_eat, num_bite = checkNumber(set_num_list, call_num_list, 3)
    print("{0} EAT - {1} BITE".format(num_eat, num_bite))

if __name__ == '__main__':
    main()
    pass

 

上記のコードは以下からダウンロードできます。

  

 

コードの解説

11行目から29行目の「checkNumber」は、生成された番号とコールされた番号を比較しEATの数とBITEの数を返却する関数です。

第1引数の「set_num_list」には、creatRandomNumber関数によって生成された番号を代入します。

第2引数の「call_num_list」には、inputCallNumber関数によって取得した番号を代入します。第3引数の「digits」には桁数を代入します。初期値として3が代入してあります。

 

12行目の「num_eat」は、EATの数を代入する関数です。

13行目の「num_bite」は、BITEの数を代入する関数です。

  

14行目の「counted_list」は、既にEATとBITEの数を数えられた数字を代入する変数です。

 

16行目から28行目の「for文」は、数字の種類だけ繰り返される繰り返し文です。また、各数字のEATとBITEの数を数えます。

 

17行目の「num_eat_temp」は、特定の数字のEAT数を代入する変数です。

18行目の「num_bite_temp」は、特定の数字のBITE数を代入する変数です。

 

19行目の「idx_list」は、特定の数字のインデックスを代入する変数です。例えば、「1232」という番号に対して「2」のインデックスは「1, 3」となります。

 

20行目から23行目の「for文」は、idx_listの長さだけ繰り返します。また、生成された番号とコールされた番号の同じインデックスにある数字の比較を行います。

 

21行目の「if文」は、生成された番号とコールされた番号の同じインデックスにある数字を比較しています。同じ数字であれば、22行目と23行目の処理が実行されます。

 

22行目の「num_eat += 1」は、EATの数を1増やしています。

23行目の「num_eat_temp += 1」は、特定の数字のEATの数を1増やしています。

  

20行目から23行目の「for文」のイメージを以下の図に示します。

for文の図解

 

24行目の「if文」は、counted_listに特定の数字が含まれていないか判別しています。counted_listに含まれていなければ以降のBITEの数を数える処理を行います。

 

25行目の「counted_list.append(n)」は、特定の数字をcounted_listに追加しています。

 

26行目の「num_bite_temp」は、生成された番号に含まれている特定の数字の数を代入します。例えば「1231」に「1」は2つ含まれています。よってこの場合は2を代入します。

 

27行目の「if文」は、num_bite_tempが0より大きいか判別しています。0より大きい場合は28行目の処理を行います。

 

28行目の「num_bite」は、num_bite_tempからnum_eat_tempを引いた数を足します。num_bite_tempはEATの数も数えているため、コールした番号に含まれている数からEATの数を引いています。

num_biteの図解

 

29行目の「return文」は、コールした番号のEAT数とBITE数を返却しています。

 

 

「checkNumber」の動作確認

動作確認

コマンドプロンプトを開き、ファイルを保存したディレクトリまで移動します。移動したら以下のコマンドを入力し実行します。

python numer0n_part2_2.py

 

実行結果を以下に示します。これで動作確認は完了です。

1 EAT - 1 BITE

  

他の組み合わせなども試してみてください。

 

 

スポンサードサーチ


まとめ

まとめの画像

今回は、番号をコール(コマンドプロンプトからの入力)する関数と生成された番号とコールされた番号の比較を行う関数を作成しました。

これでNumer0nに必要な関数はそろいましたが、コマンドプロンプトで遊ぶには少々見にくいため、次回は見やすく表示する関数と実際にNumer0nを動かすmain関数を作成します。次回で完成です。

 

 

  

最後までお読みいただきありがとうございます。


スポンサードサーチ