回答編集履歴

5

追記

2018/04/12 07:24

投稿

LouiS0616
LouiS0616

スコア35658

test CHANGED
@@ -76,6 +76,104 @@
76
76
 
77
77
 
78
78
 
79
+ 追記を受けて
80
+
81
+ ---
82
+
83
+ > なぜ以下のコードが文字の位置を考慮しがら、スペルミスを処理できる理由が分かるようでわかりません。
84
+
85
+
86
+
87
+ 次のように書いているのと似ています。並行して一文字ずつ取り出し、比較しているのです。
88
+
89
+ ```Python
90
+
91
+ diff = 0
92
+
93
+ for ra, a in zip(right_answer, answer):
94
+
95
+ if ra != a:
96
+
97
+ diff += 1
98
+
99
+ ```
100
+
101
+
102
+
103
+ ---
104
+
105
+ **似ている**という表現を使ったのは、内包表記ありきのテクニックを使っているからです。
106
+
107
+ 次の処理を追ってみます。
108
+
109
+ ```Python
110
+
111
+ >>> [(ra, a) for ra, a in zip('hoge', 'huge') if ra != a]
112
+
113
+ [('o', 'u')]
114
+
115
+ ```
116
+
117
+
118
+
119
+ `if ra != a`を満たすときだけ、リストに要素が追加されることがわかります。
120
+
121
+
122
+
123
+ また、`sum(1... )`という記法は、**シーケンス長を算出するとき**にしばしば使います。
124
+
125
+ ```Python
126
+
127
+ >>> sum(1 for _ in range(3))
128
+
129
+ 3
130
+
131
+ >>> sum(1 for _ in range(1, 4))
132
+
133
+ 3
134
+
135
+ >>> sum(1 for _ in 'hoge')
136
+
137
+ 4
138
+
139
+ ```
140
+
141
+
142
+
143
+ 毎周『1』を生成して、それを累計しているわけです。
144
+
145
+
146
+
147
+ ---
148
+
149
+ 上記二つのテクニックを組み合わせると、先の処理は次のように説明できます。
150
+
151
+ ```Python
152
+
153
+ diff = sum(
154
+
155
+ 1 for ra, a in zip(right_answer, answer) if ra != a
156
+
157
+ )
158
+
159
+ ```
160
+
161
+
162
+
163
+ 0. 二つの文字列を並列に比較する。
164
+
165
+ ・もし文字が同じでないときは、リストに1を追加する。
166
+
167
+ ・そうでないときは、リストに何も追加しない。
168
+
169
+ 0. リストの合計を算出する。この場合要素が全部1なので、リスト長を求めているのと同じ。
170
+
171
+
172
+
173
+ 実際にはジェネレータを利用しているのでもう少し効率的ですが、まだ気にしなくて良いでしょう。
174
+
175
+
176
+
79
177
  おまけ
80
178
 
81
179
  ---

4

修正

2018/04/12 07:24

投稿

LouiS0616
LouiS0616

スコア35658

test CHANGED
@@ -72,7 +72,7 @@
72
72
 
73
73
  ラムダ式内でfor文は使えないです。
74
74
 
75
- ループ処理を書くためには、再帰を使った黒テクニックが必要です。
75
+ ループ処理を書くためには、内包表記を使うか、再帰を使った黒テクニックが必要です。
76
76
 
77
77
 
78
78
 

3

追記

2018/04/12 04:47

投稿

LouiS0616
LouiS0616

スコア35658

test CHANGED
@@ -61,6 +61,18 @@
61
61
  条件式を使えば分岐も可能ですが、かなり読みづらくなります。
62
62
 
63
63
  ラムダ式で書きづらいときは通常の関数を定義した方が良いです。
64
+
65
+
66
+
67
+ > この処理が上手く機能しない
68
+
69
+ data_nearly = list(map(lambda x: for i in set(x[0]) if i in x[-1],data_same_length))
70
+
71
+
72
+
73
+ ラムダ式内でfor文は使えないです。
74
+
75
+ ループ処理を書くためには、再帰を使った黒テクニックが必要です。
64
76
 
65
77
 
66
78
 

2

追記

2018/04/12 04:45

投稿

LouiS0616
LouiS0616

スコア35658

test CHANGED
@@ -61,3 +61,71 @@
61
61
  条件式を使えば分岐も可能ですが、かなり読みづらくなります。
62
62
 
63
63
  ラムダ式で書きづらいときは通常の関数を定義した方が良いです。
64
+
65
+
66
+
67
+ おまけ
68
+
69
+ ---
70
+
71
+ ゲームの特性によっては、クロージャを使うと便利です。
72
+
73
+ ```Python
74
+
75
+ def make_mark(right_answer):
76
+
77
+ right_len = len(right_answer)
78
+
79
+
80
+
81
+ def mark(answer):
82
+
83
+ if len(answer) != right_len:
84
+
85
+ return 0
86
+
87
+
88
+
89
+ diff = sum(
90
+
91
+ 1 for ra, a in zip(right_answer, answer) if ra != a
92
+
93
+ )
94
+
95
+ if diff == 0:
96
+
97
+ return 2
98
+
99
+ if diff == 1:
100
+
101
+ return 1
102
+
103
+
104
+
105
+ return 0
106
+
107
+
108
+
109
+ return mark
110
+
111
+
112
+
113
+
114
+
115
+ n = int(input())
116
+
117
+ mark = make_mark(input())
118
+
119
+
120
+
121
+ for _ in range(n):
122
+
123
+ answer = input()
124
+
125
+ print(mark(answer))
126
+
127
+ ```
128
+
129
+
130
+
131
+ [Wandbox](https://wandbox.org/permlink/vRuZDNI3QVXBidO7)

1

追記

2018/04/12 04:21

投稿

LouiS0616
LouiS0616

スコア35658

test CHANGED
@@ -49,3 +49,15 @@
49
49
 
50
50
 
51
51
  [Wandbox](https://wandbox.org/permlink/BjUJHZLCBCJ43zjW)
52
+
53
+
54
+
55
+ ---
56
+
57
+ > 以下のループ処理のコードをlmabda式に書きなおしたいが、細かい条件分岐を一文とまとめられない。
58
+
59
+
60
+
61
+ 条件式を使えば分岐も可能ですが、かなり読みづらくなります。
62
+
63
+ ラムダ式で書きづらいときは通常の関数を定義した方が良いです。