Created
March 23, 2020 05:29
-
-
Save snova301/44766cc0dfcdd43c34c0c426a41e6007 to your computer and use it in GitHub Desktop.
四則演算問題生成
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import numpy as np | |
import csv | |
class Operation4: | |
def __init__(self): | |
self.num_question = 10 # 問題数 | |
self.num_digit = 1 # 問題の桁数 | |
self.isNegative = False # 負の数を含めるか | |
self.isDecimal = False # 問題に小数を含めるか | |
def pre_calc(self, admd): # 問題を生成する関数 | |
# 設定した桁数をもとに問題の数値の範囲を設定 | |
if self.isNegative == True: # 負の数を含めるとき | |
lim_l = -1 * 10**(self.num_digit)+1 | |
lim_h = 10**(self.num_digit)-1 | |
else: # 正の数のみ | |
lim_l = 10**(self.num_digit-1) | |
lim_h = 10**(self.num_digit)-1 | |
# 問題の数値の範囲をもとに問題をランダムに生成 | |
if self.isDecimal == True: # 小数を含めるとき | |
np.set_printoptions(precision=2) | |
arr = (lim_h - lim_l) * np.random.rand(self.num_question, 2) + lim_h | |
else: # 小数を含めないとき | |
arr = np.random.randint(lim_l, lim_h, (self.num_question, 2)) | |
# 「負の数を設定しない」にしたとき、引き算の答えも負の数にならないようにする | |
if self.isNegative == False and admd is 'diff': | |
diff_negative = np.where(arr[:, 0] < arr[:, 1]) | |
for i in diff_negative[0]: | |
arr_index = arr[i] | |
arr[i] = arr_index[1], arr_index[0] | |
return arr | |
def calc_ope4(self, admd): # 解答を作成する関数 | |
calc_formula = self.pre_calc(admd) # 問題の生成 | |
if admd == 'add': # 足し算 | |
calc_result = np.array([np.sum(calc_formula, axis=1)]).T | |
calc_info = 'add' | |
calc_symbol = '+' | |
elif admd == 'diff': # 引き算 | |
calc_result = np.array(np.diff(calc_formula, axis=1) * (-1)) | |
calc_info = 'diff' | |
calc_symbol = '-' | |
elif admd == 'multiply': # 掛け算 | |
calc_result = np.array([calc_formula[:,0] * calc_formula[:,1]]).T | |
calc_info = 'multiply' | |
calc_symbol = '*' | |
elif admd == 'div': # 割り算 | |
calc_result = np.array([calc_formula[:,0] / calc_formula[:,1]]).T | |
calc_info = 'div' | |
calc_symbol = '/' | |
else: # エラー処理 | |
return 'ERROR', 'CHECK ARGUMENT' | |
# 問題と解答のデータを出力できる形に変形 | |
output_formula = np.array([calc_formula[:, 0], np.repeat(calc_symbol, self.num_question), calc_formula[:, 1], np.repeat('=', self.num_question)], dtype='str').T | |
output_calc = np.concatenate([output_formula, calc_result], axis=1) | |
return calc_info, output_calc | |
def export_tsv(read_data): # tsvで出力する関数 | |
f_name = 'export_tsv' | |
with open(f_name, mode='w', encoding='utf-8') as fo: | |
tsv_writer = csv.writer(fo, delimiter='\t') | |
tsv_writer.writerows(read_data) | |
def main(): | |
operation4class = Operation4() | |
# 引数の意味 - 'add' : 足し算, 'diff' : 引き算, | |
# 引数の意味 - 'multipy' : 掛け算, 'div' : 割り算 | |
calc_info, output_calc = operation4class.calc_ope4('add') | |
print(calc_info,'\n', output_calc) | |
export_tsv(output_calc) | |
if __name__ == '__main__': | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment