Paizaのスキルチェックの例題のデバッグをJupyterとかのローカル環境でやるときの入力の手間を省きたい【Python】


挨拶

本記事が初投稿です。気になったことなどをほそぼそと書いていきたいと思いますのでよろしくおねがいします。

はじめに paizaスキルチェックとは

paizaスキルチェックとは、paiza株式会社が運営するpaizaという、IT人材の育成、就活支援を目的としたサイトで受けられるプログラミングのスキルテストです。
ユーザーはこのスキルチェックでクリアできた問題の難易度に応じてランク付けされ、コードを見た企業からスカウトされることもあります。

この記事の目的

出題例デバッグ時の面倒なコピペ作業からの脱却
paizaのスキルチェックを含むプログラミングテストの問題にはたいてい例題として入力例と出力例が載っていて、まずはその例題から試しますよね。
paizaの場合、問題画面の最下部からオンライン上で試しに実行して動作を確認できますが、難易度が上がり、コードが長くなってくるとJupyter Notebookなどで小分けにデバックしたくなると思います(少なくとも私はそうなります)。
その際は入力例をコピペして使うことになりますが、いちいち一行ずつ写すのは面倒ですし、とはいえ提出する時の形のまま書きたいという気持ちもあります。
ということでなんとかしたい、なんとかしよう。ということでなんとかしました。

どうしたか

単刀直入に申しますと、input()関数をオーバーロード、というか上書きしました。

以下の画像は、paizaラーニング スキルチェック入門編の入力例です。
これを

こう代入するだけで使える関数を作るところが目標です。

  ・
  ・
  ・

paiza_test.py
def preinput(input_text):
    out=input_text.split("\n")
    for i in out:
        yield i

def input(reset=False):
    global input_text,inp
    if reset:del inp,input_text,repeat;return
    try:return inp.__next__()
    except:
        if repeat:inp=preinput(input_text)
        return inp.__next__()

def def_input(s,isRepeat=False):
    global input_text,inp,repeat
    input_text=s
    repeat=isRepeat
    inp=preinput(input_text)

できました(雑)。
これをpyファイルとしてデバックを行うディレクトリに置いてインポートして使います。

debug.ipynb
from paiza_test import*

先程のように入力例を代入した変数を用意して、def_input()関数に放り込めば準備完了です。

debug.ipynb
input_text="""6
apple
book
information
note
pen
pineapple"""

def_input(input_text)

あとはデバッグしたいコードを提出したいそのままの形で書くことができます.

debug.ipynb
n=int(input())
for i in range(n):
    print(input())
出力
apple
book
information
note
pen
pineapple

デフォルトでは入力が最後まで行くと次呼び出した際にエラーを吐きますが、def_input()を呼ぶ際に引数のisRepeatTrueに指定すれば繰り返し頭から出力します。

def_input(input_text,isRepeat=True)
n=int(input())
for i in range(3*n):
    print(input())
出力
apple
book
information
note
pen
pineapple
6
apple
book
information
note
pen
pineapple
6
apple
book
information
note

また、引数resetTrueにして呼び出すとdef_input()を呼び出す前の状態にリセットされます(戻り値はありません)。

def_input(input_text)
input(reset=True)

input()  #------> error

3/16追記
isRepeatの設定タイミングをdef_input()呼び出し時に修正。

まとめ

この記事が同じ不満を抱いている人に届いて、お役に立てたら嬉しいです…
paiza以外にもAtCoderなど他のプログラミングコンテストのデバッグにも使えると思います。
もっといい方法や改善点があるよーって方はコメントを頂けると幸いです。