1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ゆめみの採用試験の模試をPythonで解いてみた

Last updated at Posted at 2022-09-08

Qiitaの存在を知らせてくれた企業、株式会社ゆめみ。
コードチェックのレベルが高いと評されて、私も自分の力が足りなかったので落ちました。
落ちた後、残念さに公式ホームページのエンジニア応募者向けの模試をPythonで解いてみました。
ちなみに、この試験で完全に自信を失ってしまったので、6ヶ月後の再受験はあきらめるつもりです:frowning2:
(日本語は未熟なので、文法が違ったり、ぎこちなければ教えてください!)

考え方

  • 複雑なアルゴリズムを使うのは面倒だから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)

re.JPG

  • 09/09 追加
    コードチェックでも出力を私の勝手にして落ちたので恥ずかしいです。
    間違った部分があれば知らせてください:sweat_smile:

感想

普段よく使うpandasを利用したデータ処理を利用すれば簡単に解くことができました。
Atcoderも企業のコードテストも、日本のテストは難しいですね…。
勉強します!:books:

1
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?