📝

Track のコーディングテストの対策

2022/06/13に公開

はじめに

2022年6月、今年も遂にサマーインターンの選考が本格的に始まりました。
大学3年の私も例に漏れず、遂に就職活動が始まってしまったなといった感じです。
私は現在、主にWeb系企業のインターンにエントリーしているのですが、多くの企業でコーディングテストが実施されていました。
そしてその殆どで、Trackというコーディングテスト用のプラットフォームが利用されておりました。

https://tracks.run

今回記事にしようと思ったきっかけは、このTrackを利用して、某Web系企業のコーディングテストを受けた際に、実行すると10,000行以上の結果が出力されるというテストケースがありました。

これを目視でデバッグした時に、大変苦労したため、同じような人の役に立てばと思い、この記事を書くことにしました。

対象とする読者

  • 現在trackでコーディングテストを受けている、または今後受ける予定
  • Pythonを利用している(今回の実例ではpythonを利用)
  • 何らかのdiffツールがローカルPCに入っている(今回の実例ではVScodeを利用)

具体的な方針

問題点の確認

一応、trackのデバッグのやり方は以下公式サイトにて説明されています。
https://help.tracks.run/ja/articles/3728252-実装-アルゴリズム問題のデバッグ方法
確かに1行〜10行程度の実行結果を見る分には、この方法で何ら問題ないと思われます。
しかし、先に述べたように出力が10,000行を超えてくると、あからさまなエラーならまだしも部分的に間違っているような状態で間違っている部分を見つけるのは人間向きではないです。てか、私には無理です。
実力不足で落ちるなら仕方がないですが、僅かなコーディングミスで落ちるのは納得いかないので、この状況を改善します。

現状

まず、現状私はブラウザー上のtrackでは、入力補完機能が不十分なため、主にローカルPC上のVSCodeでコードを書いています。

そしてローカル環境で一度要求文上の入力例を入力し、結果に問題がなければ、それをコピーして、ブラウザー上のエディターに貼り付けて実行するという方法で解答を行なっています。

解決法

共通する作業

まず、ローカルに以下の様な構成で空のファイルを作成します。

track
├── in.txt
├── main.py
├── out.txt
├── result.txt
└── run.sh

次に、run.shに 以下のような1行を書きます。

run.sh
cat in.txt | python main.py > result.txt

これによって、in.txtに書かれている入力値がmain.pyに渡され、その結果がresult.txtに書き出されます。
尚、python以外のスクリプト言語を利用している方は、このpython main.pyを自分の利用している言語のファイルに変更してください。
コンパイラ型言語を利用している方は、コンパイラ処理をこの前に書けば問題なく動くはずです。

そして、VScodeを起動して、macの方は「command & shift & p」を押すと以下の画像のように、機能検索ができます。
ここに「compare」と入力し、out.txtとresult.txtを比較します。

すると以下の画像のように差分が分かりやすく表示されます。

テストごとの作業

trackの解答画面左上のハンバーガーメニューをクリックするとテストケースを見ることができます。
それぞれ、対になった入力と出力のファイルの中身を全選択してコピーし、先ほど作成したローカルPC上のin.txt、out.txtファイルへ貼り付けて保存してください。

実行

後は、テストしたいプログラムをローカルフォルダー内のmain.pyに貼り付けて、以下のコマンドを入力するだけです。

sh run.sh

使用例

例えば、「入力として渡された値の1の位を出力する。ただし、zeroが入力された時には、"zero"と出力する」というプログラムを作成しなければいけないのに、以下の様な間違った実装をしていたとします。

main.py
import sys
def main(lines):
    for l in lines:
        #誤った実装
        i = int(l) %10
        print(i)

if __name__ == '__main__':
    lines = []
    for l in sys.stdin:
        lines.append(l.rstrip('\r\n'))
    main(lines)

この時、あるテストケースは以下のように設定されます。

in.txt
164
247
344
424
556
56
633
665
777
550
231
551
53
out.txt
4
7
4
4
6
6
3
5
7
zero
1
1
3
sh run.sh

そして、上記コマンドをフォルダー内で実行すると、当然誤ったファイルがresult.txtに出力され、ファイルの差分が自動でハイライトされることにより、ひと目でどこの結果が違うかを見つけることができます。

まとめ

とりあえずサマーインターンの選考はこれで乗り切ろう思いますが、もし、より効率の良い方法などがありましたら教えてくださると幸いです。

GitHubで編集を提案

Discussion