blogskol

思わず声に出して読みたくなるブログ

競プロのランダム入力生成方法

備忘録

はじめに

betrue12.hateblo.jp

この記事を読もう!
終わり

改善

※ここから先は Mac を仮定

oj を使い始めてからコード毎にディレクトリを作るようになったので、ランダム入力生成コードなどもその都度書く必要があり、汎用的な部分は snippet に追加することにした
愚直解に関しては C++ で毎回書いているけど、これももしかしたら愚直解書く時専用の関数とか作った方がいいのかも?

ランダム入力生成コード

python の snippet に以下を追加した
C++ の snippet があんまり増えるのが嬉しく無いので python にしたけど結構メリットが大きい

import random

def RND( l, r, n ):
  res = [ random.randint( l, r ) for _ in range(n) ]
  return res

# print( *RND( 5, 10, 3 ) ) => 9 6 5

最後のコメントにもある通り、print( *RND( l, r, n ) ) で競プロの入力っぽく出力してくれる

pythonを使うメリット
  • 数を少しだけ変えた時などに、コンパイルの手間が省ける
  • 直感的な操作が出来る関数が多い
  • パソコン出来る気分になる
shellscript

こちらも snippet

while true;do
  python rand.py>input.txt
  wrong=$(./a.out < input.txt)
  correct=$(./g.out < input.txt)
  if [ $wrong != $correct ]; then
    echo "$(<input.txt)"
    echo "Wrong:"
    echo $wrong
    echo "Correct:"
    echo $correct
    exit
  fi
done

冒頭の記事と比較すると、

  1. inputの出力
  2. どっちが正しい答えか記述

この2点は個人的にとっても大事だと思っている

あと、元の記事では make_random.out や guchoku.out みたいな長い名前を採用していたけど長いので適度に短く