駄菓子の値段を予測し、自腹を切る人を決める

**＜アルゴリズム問題シリーズ（Python）＞**

#１．はじめに
同一ファイル内で入力から出力を実施する方法としてはhttps://qiita.com/ajim/items/4d350710ba70056f5f6f を参考にしました。

```py
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

#２．問題（難度：易）
ある小学生のN人のグループは某テレビ番組が好きなあまり、駄菓子屋で値札の無いM個の商品の値段を予測するゲームを始めた。各人が点数を競い、最も低い点数を出した人の点数を出力しなさい。点数は 100 点からの減点方式で 0 点を下回った場合は0点とする。以下を参考にして、予測に誤差があるたびに点数を引いていく。ただし誤差とは、正しい値段と自分が予測した値段の差の絶対値とする。

・誤差 5 円 以内なら減点しない
・上記に当てはまらず、誤差 10 円 以内なら 1 点減点
・上記に当てはまらず、誤差 20 円 以内なら 2 点減点
・上記に当てはまらず、誤差 30 円 以内なら 3 点減点
・上記に当てはまらない場合、5 点減点

入出力は以下のようになる。
##入力
```py
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人目の予測した値段
```
##出力
```py
 最低点数
 ```
##例
```py
入力
2 3
200
240
250
210
290
200
150
200
250
出力
89
```


#３．解答
```py
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
        
        
```

#４．メモ、やり直し
**コメント頂いた方からの助言を踏まえて**
・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(数値)（複素数も可）。



#５．参考文献
https://docs.python.org/ja/3/library/sys.html

https://docs.python.org/ja/3/library/io.html?highlight=io#io.StringIO

https://qiita.com/Ma_AtoP/items/63ec026b3b373b7f84c1

https://qiita.com/ajim/items/4d350710ba70056f5f6f

https://www.mathpython.com/ja/python-number-absolute/#:~:text=Python%20%E3%81%A7%E3%81%AF%E6%95%B0%E3%81%AE%E7%B5%B6%E5%AF%BE%E5%80%A4%E3%81%AF%20abs%20%E3%81%A7%E6%B1%82%E3%82%81%E3%81%BE%E3%81%99%E3%80%82%20%E6%95%B4%E6%95%B0%E3%81%A0%E3%81%91%E3%81%A7%E3%81%AA%E3%81%8F%E5%B0%8F%E6%95%B0%E3%82%84%E5%88%86%E6%95%B0%E3%81%AE%E7%B5%B6%E5%AF%BE%E5%80%A4%E3%82%82%E6%B1%82%E3%81%BE%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%20x%20%E3%81%AF%20-2,%E8%A4%87%E7%B4%A0%E6%95%B0%E3%81%AE%E8%99%9A%E6%95%B0%E3%81%AF%20j%20%E3%81%A7%E8%A1%A8%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%20%E4%BE%8B%E3%81%88%E3%81%B0%203%2B4i%20%E3%81%AF%203%2B4j%20%E3%81%A8%E3%81%97%E3%81%BE%E3%81%99%E3%80%82


#６．ご意見・ご感想をお待ちしております
当方、未熟なプログラマーのため、よりよいコード等ありましたら教えていただけると幸いです。
皆様のメッセージをお待ちしております。