Skip to content

Instantly share code, notes, and snippets.

@snova301
Created March 23, 2020 05:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save snova301/44766cc0dfcdd43c34c0c426a41e6007 to your computer and use it in GitHub Desktop.
Save snova301/44766cc0dfcdd43c34c0c426a41e6007 to your computer and use it in GitHub Desktop.
四則演算問題生成
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