Qiitaの存在を知らせてくれた企業、株式会社ゆめみ。
コードチェックのレベルが高いと評されて、私も自分の力が足りなかったので落ちました。
落ちた後、残念さに公式ホームページのエンジニア応募者向けの模試をPythonで解いてみました。
ちなみに、この試験で完全に自信を失ってしまったので、6ヶ月後の再受験はあきらめるつもりです
(日本語は未熟なので、文法が違ったり、ぎこちなければ教えてください!)
考え方
- 複雑なアルゴリズムを使うのは面倒だからPASS
- 手軽に読みやすく作成しよう
requirements.txtを編集することで外部ライブラリ使用が可能でしたので、pandasを使用しました。
問題
このようなCSVから以下の条件で抽出する。
create_timestamp,player_id,score
2021/01/01 12:00,player0001,12345
2021/01/02 13:00,player0002,10000
2021/01/03 12:00,player0021,100
2021/01/04 12:10,player0031,200
2021/01/05 12:00,player0041,300
- プレイヤー平均点の上位10人を抽出する。
- スコアは四捨五入し、同点の場合は11人以上抽出される場合がある。
- プレイヤー数は1万人以下、ログは数千万行。
入出力例
$ ./get_ranking game_score_log.csv
rank,player_id,mean_score
1,player0001,10000
1,player0002,10000
3,player0003,9000
4,player0004,7000
5,player0005,1000
6,player0006,999
7,player0007,998
8,player0008,997
9,player0009,990
9,player0010,990
9,player0011,990
9,player0012,990
出力ルール
- 各プレイヤーにおける、全てのプレイの平均点を利用した上位10名を出力
- 出力は3列のCSV形式とする
- 1行目はヘッダとして、rank,player_id,mean_scoreを出力する
- 上記ヘッダに準じて2列目以降を出力する
- rankの項目には平均スコア上位から1,2,3,…の数字が割り当てられる
- 平均スコアは四捨五入で整数で丸められる
- 同点の平均スコアのプレイヤーが居た場合、rankingの数字は同じ数字が割り当てられる
- 同点の平均スコアのプレイヤーが居た場合において、10名以上のランキングが作られる事がある
回答
import pandas as pd
import sys
# 引数をもらう部分です。Trackで実行するために必要です。
args = sys.argv[1:]
command_line_argument = args[0]
# 受けた引数を通じて当該ファイルを読む作業を行います。
data = pd.read_csv(str(command_line_argument), encoding='utf-8')
# 四捨五入とソーティングの処理
data = data.groupby(['player_id'], as_index=False).mean()
data.score = data.score.round()
data['rank'] = data['score'].rank(method='min', ascending=False)
data = data.sort_values(by='rank')
# 出力のルールを合わせるためにColumnの名前とタイプを変更
dataNew = data[['rank', 'player_id', 'score']]
dataNew = dataNew.rename(columns={'score': 'mean_score'})
dataNew['rank'] = dataNew['rank'].astype(int)
dataNew['mean_score'] = dataNew['mean_score'].astype(int)
# 上位10名をカットして出力します。
dataNew = dataNew.nlargest(n=10, columns='mean_score', keep='all')
# print(data)、CSVとして保存
dataNew.to_csv('result.csv', index=False)
f = open("result.csv","rt")
c = f.read()
print(c)
- 09/09 追加
コードチェックでも出力を私の勝手にして落ちたので恥ずかしいです。
間違った部分があれば知らせてください
感想
普段よく使うpandasを利用したデータ処理を利用すれば簡単に解くことができました。
Atcoderも企業のコードテストも、日本のテストは難しいですね…。
勉強します!