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

回答編集履歴

5

追記

2018/04/12 07:24

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -37,6 +37,55 @@
37
37
  ラムダ式内でfor文は使えないです。
38
38
  ループ処理を書くためには、内包表記を使うか、再帰を使った黒テクニックが必要です。
39
39
 
40
+ 追記を受けて
41
+ ---
42
+ > なぜ以下のコードが文字の位置を考慮しがら、スペルミスを処理できる理由が分かるようでわかりません。
43
+
44
+ 次のように書いているのと似ています。並行して一文字ずつ取り出し、比較しているのです。
45
+ ```Python
46
+ diff = 0
47
+ for ra, a in zip(right_answer, answer):
48
+ if ra != a:
49
+ diff += 1
50
+ ```
51
+
52
+ ---
53
+ **似ている**という表現を使ったのは、内包表記ありきのテクニックを使っているからです。
54
+ 次の処理を追ってみます。
55
+ ```Python
56
+ >>> [(ra, a) for ra, a in zip('hoge', 'huge') if ra != a]
57
+ [('o', 'u')]
58
+ ```
59
+
60
+ `if ra != a`を満たすときだけ、リストに要素が追加されることがわかります。
61
+
62
+ また、`sum(1... )`という記法は、**シーケンス長を算出するとき**にしばしば使います。
63
+ ```Python
64
+ >>> sum(1 for _ in range(3))
65
+ 3
66
+ >>> sum(1 for _ in range(1, 4))
67
+ 3
68
+ >>> sum(1 for _ in 'hoge')
69
+ 4
70
+ ```
71
+
72
+ 毎周『1』を生成して、それを累計しているわけです。
73
+
74
+ ---
75
+ 上記二つのテクニックを組み合わせると、先の処理は次のように説明できます。
76
+ ```Python
77
+ diff = sum(
78
+ 1 for ra, a in zip(right_answer, answer) if ra != a
79
+ )
80
+ ```
81
+
82
+ 0. 二つの文字列を並列に比較する。
83
+ ・もし文字が同じでないときは、リストに1を追加する。
84
+ ・そうでないときは、リストに何も追加しない。
85
+ 0. リストの合計を算出する。この場合要素が全部1なので、リスト長を求めているのと同じ。
86
+
87
+ 実際にはジェネレータを利用しているのでもう少し効率的ですが、まだ気にしなくて良いでしょう。
88
+
40
89
  おまけ
41
90
  ---
42
91
  ゲームの特性によっては、クロージャを使うと便利です。

4

修正

2018/04/12 07:24

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -35,7 +35,7 @@
35
35
  data_nearly = list(map(lambda x: for i in set(x[0]) if i in x[-1],data_same_length))
36
36
 
37
37
  ラムダ式内でfor文は使えないです。
38
- ループ処理を書くためには、再帰を使った黒テクニックが必要です。
38
+ ループ処理を書くためには、内包表記を使うか、再帰を使った黒テクニックが必要です。
39
39
 
40
40
  おまけ
41
41
  ---

3

追記

2018/04/12 04:47

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -31,6 +31,12 @@
31
31
  条件式を使えば分岐も可能ですが、かなり読みづらくなります。
32
32
  ラムダ式で書きづらいときは通常の関数を定義した方が良いです。
33
33
 
34
+ > この処理が上手く機能しない
35
+ data_nearly = list(map(lambda x: for i in set(x[0]) if i in x[-1],data_same_length))
36
+
37
+ ラムダ式内でfor文は使えないです。
38
+ ループ処理を書くためには、再帰を使った黒テクニックが必要です。
39
+
34
40
  おまけ
35
41
  ---
36
42
  ゲームの特性によっては、クロージャを使うと便利です。

2

追記

2018/04/12 04:45

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -29,4 +29,38 @@
29
29
  > 以下のループ処理のコードをlmabda式に書きなおしたいが、細かい条件分岐を一文とまとめられない。
30
30
 
31
31
  条件式を使えば分岐も可能ですが、かなり読みづらくなります。
32
- ラムダ式で書きづらいときは通常の関数を定義した方が良いです。
32
+ ラムダ式で書きづらいときは通常の関数を定義した方が良いです。
33
+
34
+ おまけ
35
+ ---
36
+ ゲームの特性によっては、クロージャを使うと便利です。
37
+ ```Python
38
+ def make_mark(right_answer):
39
+ right_len = len(right_answer)
40
+
41
+ def mark(answer):
42
+ if len(answer) != right_len:
43
+ return 0
44
+
45
+ diff = sum(
46
+ 1 for ra, a in zip(right_answer, answer) if ra != a
47
+ )
48
+ if diff == 0:
49
+ return 2
50
+ if diff == 1:
51
+ return 1
52
+
53
+ return 0
54
+
55
+ return mark
56
+
57
+
58
+ n = int(input())
59
+ mark = make_mark(input())
60
+
61
+ for _ in range(n):
62
+ answer = input()
63
+ print(mark(answer))
64
+ ```
65
+
66
+ [Wandbox](https://wandbox.org/permlink/vRuZDNI3QVXBidO7)

1

追記

2018/04/12 04:21

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -23,4 +23,10 @@
23
23
  print(total_score)
24
24
  ```
25
25
 
26
- [Wandbox](https://wandbox.org/permlink/BjUJHZLCBCJ43zjW)
26
+ [Wandbox](https://wandbox.org/permlink/BjUJHZLCBCJ43zjW)
27
+
28
+ ---
29
+ > 以下のループ処理のコードをlmabda式に書きなおしたいが、細かい条件分岐を一文とまとめられない。
30
+
31
+ 条件式を使えば分岐も可能ですが、かなり読みづらくなります。
32
+ ラムダ式で書きづらいときは通常の関数を定義した方が良いです。