#03:シンプルに問題を解く - その1
前回のチャプターでは、実際に問題を解きました。
今回のチャプターでは、関数やメソッドを使って、コードをシンプルにしていきます。
map(function, iterable, ...)
結果を返しながら、引数のfunction を iterable の全ての要素に適用するイテレータ(iterator)を返します。
引用元:map — Python 3.6.5 ドキュメント
https://docs.python.jp/3/library/functions.html#map
Python の map と filter ってなに? - いっきに Python に詳しくなるサイト
http://nihaoshijie.hatenadiary.jp/entry/2018/08/13/231423
データの流れを表すオブジェクトをイテレータと呼びます。
イテレータ型 — Python 3.6.5 ドキュメント
https://docs.python.jp/3/library/stdtypes.html#iterator-types
Python のイテレータってなに? - いっきに Python に詳しくなるサイト
http://nihaoshijie.hatenadiary.jp/entry/2016/11/21/221220
Python の iterable ってなに? - いっきに Python に詳しくなるサイト
http://nihaoshijie.hatenadiary.jp/entry/2018/07/06/163543
iterable と iterator - methaneのブログ
https://methane.hatenablog.jp/entry/2013/10/27/iterable_%E3%81%A8_iterator
# n と k を取得
input_str = input().split() # スペース区切りで取得
n, k = map(int, input_str)
# a_1, a_2 ... a_n を取得
input_list = input().split()
a_list = list(map(int, input_list))
# キャンペーンの各区間の平均値
average = []
for i in range(n - k + 1):
i_average = 0
for j in range(k): # k日間分足して平均を求める
i_average += a_list[i + j]
average.append(i_average / k)
ans_max = max(average)
ans_first_max = average.index(ans_max)
ans_count = average.count(ans_max)
print(str(ans_count) + " " + str(ans_first_max + 1))
日別訪問者数の最大平均区間
下記の問題をプログラミングしてください。
あなたは、とあるウェブサイトを管理していました。
ある連続したk日間、このウェブサイトでキャンペーンを行ったのですが、いつからいつまでの期間に行ったかを忘れてしまいました。
幸い、ウェブサイトを運営していた全n日分のアクセスログが残っており、1日ごとの訪問者数が分かっています。
とりあえず、連続するk日の中で、1日あたりの平均訪問者数が最も多い期間を、キャンペーンを行った期間の候補だと考えることにしました。
n日分の訪問者数のリストとキャンペーンの日数kが入力されるので、キャンペーンを行った期間の候補数と、候補の中で最も早い開始日を出力してください。
入力される値
入力は2行から成ります。
1行目にはnとkが半角スペース区切りで入力されます。
2行目にはn個の整数a_1, a_2, …, a_nが半角スペース区切りで入力されます。a_iはi日目の訪問者数を表します。
入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。
期待する出力
キャンペーンを行った期間の候補数と、候補の中で最も早い開始日を、この順で半角スペース区切りで1行で出力してください。
条件
すべてのテストケースにおいて、以下の条件をみたします。
・1≦n≦1,000
・1≦k≦n
・0≦a_i≦100
入力例1
5 3
1 2 3 2 1
出力例1
1 2
入力例2
10 2
6 2 0 7 1 3 5 3 2 6
出力例2
5 1