<アルゴリズム問題シリーズ(Python)>
#1.はじめに
同一ファイル内で入力から出力を実施する方法としてはhttps://qiita.com/ajim/items/4d350710ba70056f5f6f を参考にしました。
import sys
import io
_INPUT = """\
5 4
1
3
4
5
"""
sys.stdin = io.StringIO(_INPUT)
・sys
モジュールはインタプリタで使用・管理している変数や、インタプリタの動作に深く関連する関数を定義しています。sys.stdin
はインタプリタが使用する、それぞれ標準入力、標準出力、および標準エラー出力の ファイルオブジェクト であり、stdin は (input() の呼び出しも含む) すべての対話型入力に使われます。https://docs.python.org/ja/3/library/sys.html
・io モジュールは様々な種類の I/O を扱う Python の主要な機能を提供しています。StringIO オブジェクトはインメモリーのテキストストリームです。
io.StringIO(initial_value='', newline='\n')
のように使用し、バッファの初期値を initial_value で与えることが出来ます。改行変換を有効にすると、改行コードは write() によってエンコードされます。ストリームはバッファの開始位置に配置されます。https://docs.python.org/ja/3/library/io.html?highlight=io#io.StringIO
#2.問題(難度:易)
ある小学生のN人のグループは某テレビ番組が好きなあまり、駄菓子屋で値札の無いM個の商品の値段を予測するゲームを始めた。各人が点数を競い、最も低い点数を出した人の点数を出力しなさい。点数は 100 点からの減点方式で 0 点を下回った場合は0点とする。以下を参考にして、予測に誤差があるたびに点数を引いていく。ただし誤差とは、正しい値段と自分が予測した値段の差の絶対値とする。
・誤差 5 円 以内なら減点しない
・上記に当てはまらず、誤差 10 円 以内なら 1 点減点
・上記に当てはまらず、誤差 20 円 以内なら 2 点減点
・上記に当てはまらず、誤差 30 円 以内なら 3 点減点
・上記に当てはまらない場合、5 点減点
入出力は以下のようになる。
##入力
N M #N人 M個の商品
a_1 #1個目の商品の正しい値段
...
a_M
h_{1,1} #1個目の商品に対して1人目の予測した値段
...
h_{M,1} #M個目の商品に対して1人目の予測した値段
h_{1,2}
...
h_{M,2}
...
...
...
h_{1,N}
...
h_{M,N} #M個目の商品に対してN人目の予測した値段
##出力
最低点数
##例
入力
2 3
200
240
250
210
290
200
150
200
250
出力
89
#3.解答
import sys
import io
_INPUT = """\
2 3
200
240
250
210
290
200
150
200
250
"""
sys.stdin = io.StringIO(_INPUT)
N,M = map(int,input().split()) #N=2, M=3
a = [int(input()) for i in range(M)] #[200, 240, 250]
h = [[int(input()) for i in range(M)] for i in range(N)] #[[210, 290, 200], [150, 200, 250]]
score = 100
scores = [] #[89, 90]
for i in range(N):
for j in range(M):
if abs(a[j] - h[i][j]) <= 5:
pass
elif abs(a[j] - h[i][j]) <= 10:
score -= 1
elif abs(a[j] - h[i][j]) <= 20:
score -= 2
elif abs(a[j] - h[i][j]) <= 30:
score -= 3
else:
score -= 5
if score <= 0:
scores.append(0)
else:
scores.append(score)
score = 100
print(min(scores)) #89
#4.メモ、やり直し
コメント頂いた方からの助言を踏まえて
・score = 100は for j in range(M): の先頭に1つだけあればよい。
・error = a[j] - h[i][j]などとすべき。
・for j in range(M): 中に処理の順番を逆にすることでpass, elseの部分をなくせる。
・scoreが負の場合の処理は scores.append(max(0, score)) で簡素化。
・絶対値はabs(数値)(複素数も可)。
#5.参考文献
https://docs.python.org/ja/3/library/sys.html
#6.ご意見・ご感想をお待ちしております
当方、未熟なプログラマーのため、よりよいコード等ありましたら教えていただけると幸いです。
皆様のメッセージをお待ちしております。