teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

質問文のコードを引用!

2018/02/04 06:20

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -22,28 +22,29 @@
22
22
 
23
23
  行っているのはhit&blowの判定なため、
24
24
  2-1,HitAndBlowクラスを新規作成
25
- 2-2,check_numではなくJudgeメソッドメソッド名を変更
25
+ 2-2,関数名をcheck_numからHitAndBlow#Judgeに変更
26
- 2-3,答えの数字を生成するgenerate関数を追加。
26
+ 2-3,答えの数字を生成するHitAndBlow#generate関数を追加。
27
27
  0~9の数字配列を生成後に[random#shuffle](https://docs.python.jp/3/library/random.html#random.shuffle)を使用して生成する。
28
28
 
29
29
  ```Python
30
30
  class HitAndBlow(object):
31
- def __init__(self, n=3):
31
+ def __init__(self, n: int=3):
32
+ assert 10 >= n
32
33
  self.N = n
33
34
  # HitAndBlowクラスが正解情報(onum)を管理するほうがいいです。
34
- # ※self.answerを使ったjudgeメソッドは宿題にしておきます。
35
+ # ※self.answerを使ったjudge関数は宿題にしておきます。
35
36
  self.answer = self.generate()
36
37
 
37
- def generate(self):
38
+ def generate(self) -> list:
38
39
  """
39
40
  答えの数字を生成。
40
41
  :return:
41
42
  """
42
- digits = [i for i in range(10)]
43
+ digits = list(range(10))
43
44
  random.shuffle(digits)
44
45
  return digits[:self.N]
45
46
 
46
- def judge(self, guess, answer):
47
+ def judge(self, guess: list, answer: list) -> tuple:
47
48
  """
48
49
  Hit&Blowの判定処理
49
50
  :param guess: 予測した数字
@@ -54,7 +55,7 @@
54
55
  assert len(guess) == len(answer)
55
56
  hit = sum(g == a for g, a in zip(guess, answer))
56
57
  blow = sum(g in answer for g in guess) - hit
57
- return (hit, blow)
58
+ return hit, blow
58
59
 
59
60
  ```
60
61
 
@@ -64,11 +65,22 @@
64
65
  hit, blow = game.judge(pnum, onum)
65
66
  ```
66
67
 
67
- 3,check_numを使用せずに、check関数でhit&blowの判定を行っている部分もあります。
68
+ 3,check関数内で以下のようにcheck_num関数を使用せずに、hit&blowの判定を行っている箇所が4箇所あります。check_num関数の呼び出しに統一するとコードの行が削減できます。
69
+ ```Python
70
+ ##リストシャッフル動作
71
+ hit = 0
72
+ blow = 0
73
+ for i in range(0,n):
74
+ for s in range(0,n):
68
- check_numメソッドの呼び出しに統一するコードの行が減ります。
75
+ if opre[i] == pnum[s]:
76
+ if i == s:
77
+ hit += 1
78
+ else:
79
+ blow += 1
80
+ ```
69
81
 
70
82
  ■余談
71
- Opponentクラスのcheck関数が158行と長すぎるためデバックしずらいと思います。
83
+ Opponentクラスのcheck関数が158行と長すぎるためデバックしずらいす。
72
84
  機能を絞った関数を作成して呼び出すようにするか、各数字を生成する部分/ループ処理/条件判定を分けたほうが、個々でテストできるようになります。
73
85
 
74
86
  ■参考情報

3

random#shuffle

2018/02/04 06:20

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -23,6 +23,8 @@
23
23
  行っているのはhit&blowの判定なため、
24
24
  2-1,HitAndBlowクラスを新規作成
25
25
  2-2,check_numではなくJudgeメソッドにメソッド名を変更
26
+ 2-3,答えの数字を生成するgenerate関数を追加。
27
+ 0~9の数字配列を生成後に[random#shuffle](https://docs.python.jp/3/library/random.html#random.shuffle)を使用して生成する。
26
28
 
27
29
  ```Python
28
30
  class HitAndBlow(object):
@@ -37,13 +39,10 @@
37
39
  答えの数字を生成。
38
40
  :return:
39
41
  """
40
- # この位置にonumの生成処理を記述
41
- answer = list(map(lambda i: 0, range(0, self.N)))
42
+ digits = [i for i in range(10)]
42
- while len(answer) != len(set(answer)):
43
+ random.shuffle(digits)
43
- answer = list(map(lambda i: random.randint(0, 9), range(0, self.N)))
44
+ return digits[:self.N]
44
45
 
45
- return answer
46
-
47
46
  def judge(self, guess, answer):
48
47
  """
49
48
  Hit&Blowの判定処理

2

変更点をさくじょ!

2018/02/03 16:01

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -23,7 +23,6 @@
23
23
  行っているのはhit&blowの判定なため、
24
24
  2-1,HitAndBlowクラスを新規作成
25
25
  2-2,check_numではなくJudgeメソッドにメソッド名を変更
26
- 2-3,check_numの引数nはenumerateでlistを列挙すれば不要なため引数から削除
27
26
 
28
27
  ```Python
29
28
  class HitAndBlow(object):

1

Edit!

2018/02/03 15:31

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -21,9 +21,9 @@
21
21
  ```
22
22
 
23
23
  行っているのはhit&blowの判定なため、
24
- 1,HitAndBlowクラスを新規作成
24
+ 2-1,HitAndBlowクラスを新規作成
25
- 2,check_numではなくJudgeメソッドにメソッド名を変更
25
+ 2-2,check_numではなくJudgeメソッドにメソッド名を変更
26
- 3,check_numの引数nはenumerateでlistを列挙すれば不要なため引数から削除
26
+ 2-3,check_numの引数nはenumerateでlistを列挙すれば不要なため引数から削除
27
27
 
28
28
  ```Python
29
29
  class HitAndBlow(object):