【Python】Numer0n(ヌメロン)を作る方法 Part5 英単語バージョン

pythonでNumer0n英単語バージョンを作成する方法

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

今回は、英単語をコールする関数と選択された英単語とコールされた英単語を比較する関数を作成します。

 

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

 

 

スポンサードサーチ


英単語をコールする関数

英単語をコールする関数

コマンドプロンプトから英単語を入力し、入力された英単語が小文字のアルファベットのみで構成されているか調べます。

 

英単語をコールする関数(inputCallWord)のソースコードを以下に示します。

import random
import json
import re
import sys

def createRnadomWord(digits, dup):
    # 省略

def inputCallWord(digits, dup):
    c = 0
    while(c < 10):
        call_word = input("英単語を入力してください:")
        result = re.sub(r"[^a-z]", "", call_word)
        lng = len(call_word)
        if(dup and digits == lng and call_word == result):
            return list(call_word)
        elif(not(dup) and digits == lng == len(set(call_word)) and call_word == result):
            return list(call_word)
        print("{0}文字の英単語を入力してください:".format(digits))
        print("")
        c += 1
    print("複数回間違った入力がされたためプログラムを終了します。")
    sys.exit()

def main():
    call_word_list = inputCallWord(3, False)
    print("call_num_list : ", call_word_list)

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

 

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

 

 

コードの解説

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

 

4行目の「import sys」は、動作関係を扱うsysライブラリをインポートしています。

 

9行目から22行目の「inputCallWord」は、英単語をコールする関数です。

第1引数の「digits」には、文字数を代入します。

第2引数の「dup」には、FalseまたはTrueを代入します。Falseは重複なし、Trueは重複ありを表現しています。

 

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

 

11行目の「while文」は、正しい入力がされるまで英単語の入力を要求する繰り返し文です。条件分は「c < 10」としています。つまり、11回以上間違った入力をするとwhile文から抜け出します。

 

12行目の「call_word」は、入力された英単語を代入する変数です。input関数によりコマンドプロンプトから入力できるようになっています。

 

13行目の「result」は、call_wordからアルファベットの小文字のみを抽出した文字列を代入する変数です。正確には抽出ではなく、call_wordに含まれる小文字のアルファベット以外の文字を「””(空文字列)」に置換しています。

14行目の「lng」は、call_wordの文字数を代入する変数です。後述する条件分岐で使用します。

 

15行目と16行目の「if文」は、重複ありの条件分岐です。「dup」「digits == lng」「result == call_word」が全てTrueである場合に16行目の処理が実行されます。つまり、重複ありかつ文字数が正しかつ入力が小文字のアルファベットのみである場合実行されます。

16行目の「return文」は、入力された英単語をリスト形式で返却しています。

 

17行目と18行目の「if文」は、重複なしの条件分岐です。「not(dup)」「digits == lng == len(set(call_word))」「result == call_word」が全てTrueである場合に18行目の処理が実行されます。つまり、重複なしかつ文字数が正しかつ入力が小文字のアルファベットのみである場合実行されます。

18行目の「return文」は、入力された英単語をリスト形式で返却しています。

 

20行目の「c += 1」は、while文の繰り返し回数を数える変数に1を足しています。

 

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

 

 

「inputCallWord」の動作確認

動作確認

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

python numer0n_part5_1.py

  

入力した小文字のアルファベットがリスト形式で表示されれば動作確認完了です。

英単語を入力してください:afd
call_num_list :  ['a', 'f', 'd']

 

 

スポンサードサーチ


英単語を比較する関数

選択された英単語とコールされた英単語を比較する関数

選択された英単語とはPart4で作成した「createRandomWord関数」によって得られる英単語(set_word_list)のことです。

コールされた英単語とは上記で作成した「inputCallWord関数」によって得られる英単語(call_word_list)のことです。

 

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

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

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

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

また、「fix」という英単語に対して「xfi」という英単語をコールした場合は0 EAT – 3 BITEです。

さらに、「fix」という英単語に対して「fai」という英単語をコールした場合は1 EAT – 1 BITEです。

  

選択された英単語とコールされた英単語を比較する関数(checkWord)のソースコードを以下に示します。

import random
import json
import re
import sys

def createRnadomWord(digits, dup):
    # 省略

def inputCallWord(digits, dup):
    # 省略

def checkWord(set_word_list, call_word_list, digits):
    word_eat = 0    # EATの数を表す変数
    word_bite = 0   # BITEの数を表す変数
    counted_list = []
    call_word_set = set(call_word_list)
    for w in call_word_set:
        word_eat_temp = 0    # 特定のアルファベットのEATの数を表す変数
        word_bite_temp = 0   # 特定のアルファベットのBITEの数を表す変数
        idx_list = [i for i, x in enumerate(call_word_list) if x == w]
        for idx in idx_list:
            if(set_word_list[idx] == call_word_list[idx]):
                word_eat += 1
                word_eat_temp += 1
        if(w not in counted_list):
            counted_list.append(w)
            word_bite_temp = set_word_list.count(w)
            if(word_bite_temp > 0):
                word_bite += word_bite_temp - word_eat_temp
    return word_eat, word_bite

def main():
    call_word_list = inputCallWord(3, False)
    print("call_num_list : ", call_word_list)

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

 

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

 

 

コードの解説

12行目から30行目の「checkWord」は、選択された英単語とコールされた英単語を比較しEATの数とBITEの数を返却する関数です。

第1引数の「set_word_list」には、creatRandomWord関数によって選択された英単語を代入します。

第2引数の「call_word_list」には、inputCallWord関数によって取得した英単語を代入します。

第3引数の「digits」には文字数を代入します。

 

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

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

 

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

 

16行目の「call_word_set = set(call_word_list)」は、コールされた英単語の種類を取得しています。例えば「b, o, o, k」であれば「b, o, k」を取得できます。

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

 

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

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

 

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

 

21行目から24行目の「for文」は、idx_listの長さだけ繰り返します。また、選択された英単語とコールされた英単語の同じインデックスにある文字の比較を行います。

 

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

 

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

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

 

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

 

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

 

27行目の「word_bite_temp」は、選択された英単語に含まれている特定の文字の数を代入します。例えば「book」に「o」は2つ含まれています。よってこの場合は2を代入します。

  

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

 

29行目の「word_bite」は、word_bite_tempからword_eat_tempを引いた数を足します。word_bite_tempはEATの数も数えてしまっているからです。

 

30行目の「return文」は、コールした英単語のEAT数とBITE数を返却しています。

 

 

「checkWord」の動作確認

動作確認

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

python numer0n_part5_2.py

  

以下のように表示されれば動作確認完了です。いろいろな入力を試してみてください。

1 EAT - 1 BITE

  

 

スポンサードサーチ


まとめ

まとめの画像

今回は、英単語をコールする関数と選択された英単語とコールした英単語を比較する関数を作成しました。

Numer0n英単語バージョンを遊ぶための関数は作成し終わりました。しかし、コマンドプロンプトで遊ぶには見にくいため、次回は表示用の関数を作成します。

また、Numer0n英単語バージョンを実際に動かすmain関数を作成します。

 

 

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


スポンサードサーチ