目標)
英単語採点アプリをつくりたい
採点方法
・正しい単語と完全一致→ 2 点
・正しい単語と長さ(文字数)が異なる→ × 0 点
・正しい単語と長さは同じだが 1 文字だけ異なる→ △ 1 点
・正しい単語と長さは同じだが 2 文字以上異なる→ × 0 点
例)
正解: desk, 解答: desc → 1 点 (長さは同じだが 1 文字だけ異なる)
正解: phone, 解答: pheen → 0 点 (長さは同じだが 2 文字異なる)
正解: cute, 解答: cute → 2 点 (完全一致)
合計得点 → 3 点
なお、N回分英単語が入力される
正解の英単語と生徒の回答が半角スペースで与えられる
入力例1
2
desk deee
cute cuta
出力例1
1
入力例2
4
pen pen
note nota
head hhhh
arm aaa
出力例2
3
質問)
以下のループ処理のコードをlmabda式に書きなおしたいが、細かい条件分岐を一文とまとめられない。
お力添えお願い致します。
また、このような処理を関数やクラス等を利用してよりスマートなコードがございましたら、教えて頂きたいです。
コード N = int(input()) data = list(input().split() for i in range(N)) print(*data) score = 0 for x in data: if x[0] == x[-1]: score += 2 elif (len(x[0]) == len(x[-1])): #一文字以上異なる場合を処理、 しかし文字の位置が考慮されていないから不十分 match = [i for i in set(x[0]) if i in x[-1]] if len(match) == len(x[0])-1: score += 1 else: pass else: pass print(score)
コード N = int(input()) data = list(input().split() for i in range(N)) #完全一致 data_perfect = list(map(lambda x: x[0] == x[-1],data)) #長さのみ同じのリスト作成 data_same_length = list(map(lambda x: len(x[0]) == len(x[-1]),data)) #長さのみ同じリスト から 一文字のみ違うリストをつくりたい #この処理が上手く機能しない data_nearly = list(map(lambda x: for i in set(x[0]) if i in x[-1],data_same_length)) result = sum(map(int, [x and y for x,y in zip(data_perfect, data_nearly)])) print(result)
※追記質問
一文字だけ異なる場合のときに、私のループ処理では文字の位置が考慮されていない。
match = [i for i in set(x[0]) if i in x[-1]]
集合の値のみを見ているため、文字の位置が関係していない。
記入例)
note one!
この場合だと、ルール上は 文字の位置まで考慮するため、文字の長さが同じだが、スペルミスが2つ以上のため 0点
しかし、私のコードだと、文字の位置を考慮していないため、文字の長さが同じ、かつスペルミスが1つのため、1点
コメント頂いた方のコードを参照すると以下のようになる。
コード def mark(right_answer, answer): if len(right_answer) != len(answer): return 0 #文字の位置を考慮しがら、スペルミスを処理 diff = sum( 1 for ra, a in zip(right_answer, answer) if ra != a ) if diff == 0: return 2 if diff == 1: return 1 return 0 n = int(input()) total_score = sum( mark(*input().split()) for _ in range(n) ) print(total_score)
なぜ以下のコードが文字の位置を考慮しがら、スペルミスを処理できる理由が分かるようでわかりません。
先頭から文字の一致を確認し、スペルミスがあればその数を合計する処理でしょうか?
コード #文字の位置を考慮しがら、スペルミスを処理 diff = sum( 1 for ra, a in zip(right_answer, answer) if ra != a ) if diff == 0: return 2 if diff == 1: return 1 return 0
回答4件
あなたの回答
tips
プレビュー