LoginSignup
0
0

More than 1 year has passed since last update.

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

Last updated at Posted at 2021-08-24

<アルゴリズム問題シリーズ(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.参考文献

6.ご意見・ご感想をお待ちしております

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

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0