JOI 予選の入出力について
今日 12 月 16 日は情報オリンピックの予選ですね!!!
ということで、あんまり見かけなかった入出力について書こうと思います。
はじめに
情報オリンピックの予選ではプログラムを提出し、向こうのサーバーで実行して正誤判定をするのではなく、与えられた入力ファイルに対する出力ファイルを提出します。
で、これで問題なのがファイルで与えられてファイルで出力するってところ。
標準入力でもなければ標準出力でもないです。わーたいへん!
ちなみに:標準入力は cin / scanf 、標準出力は cout / printf です。(たぶん
予選当日になってファイルで入出力する方法調べるのめんどい!ファイルで入出力させるために色々書くのめんどい!というあなたにリダイレクトという技を教えようと思います。
(あと、コードを書いてファイル入出力する感じでやってしまうといちいちファイル名を書き直して実行しなおさないといけないのでめんどうというのもあります)(頭良い方法があるのかもしれないが知らない)
リダイレクトとは
リダイレクトとは:プログラムの入力元や出力先を通常とは違うものに変更すること。
リダイレクト【redirect】
つまりは、コードでは標準入力 / 出力しているけど、実行する時にファイルに入力 / 出力するように出来るよってことですね。
実際に書いた時の実行例を一度示します。あとあときちんと解説します。
(環境は OS X なので Windows とは実行ファイル等の名前が違うと思いますが、Windows でもリダイレクトは出来るとおもいます)
li_saku $ c++ joi_yo_1.cpp li_saku $ ./a.out # 適当にサンプルを実行する、大丈夫そうなので提出用の出力ファイルを作る li_saku $ ./a.out < 2012-yo-t1-in1.txt > 2012-yo-t1-out1.txt li_saku $ ./a.out < 2012-yo-t1-in2.txt > 2012-yo-t1-out2.txt li_saku $ ./a.out < 2012-yo-t1-in3.txt > 2012-yo-t1-out3.txt li_saku $ ./a.out < 2012-yo-t1-in4.txt > 2012-yo-t1-out4.txt li_saku $ ./a.out < 2012-yo-t1-in5.txt > 2012-yo-t1-out5.txt
こんな感じでしょうか。サンプルの下り書く必要あったのかは疑問ですが一応。
で、この部分がリダイレクトです。
li_saku $ ./a.out < 2012-yo-t1-in1.txt > 2012-yo-t1-out1.txt li_saku $ ./a.out < 2012-yo-t1-in2.txt > 2012-yo-t1-out2.txt li_saku $ ./a.out < 2012-yo-t1-in3.txt > 2012-yo-t1-out3.txt li_saku $ ./a.out < 2012-yo-t1-in4.txt > 2012-yo-t1-out4.txt li_saku $ ./a.out < 2012-yo-t1-in5.txt > 2012-yo-t1-out5.txt
ファイル名を見て分かる通り、2012-yo-t1-in1.txt が入力ファイル、 2012-yo-t1-out1.txt というのが出力ファイルです。
この時のコードの中身はファイル入出力なんかしていなくて、普通に使うように標準入出力してます。
「<」の右側にあるファイルを標準入力として実行ファイルに与えて、「>」の右側にあるファイルに標準出力をする、といった感じです。
(ちなみに、出力ファイルに存在しないファイル名を指定した場合そのファイルを作ってくれます。また、存在するファイル名を指定した場合は中身が上書きされます)
リダイレクトを使うと、ファイル入出力のことなんか考えずに問題を解くことができますね!でも!!!
ファイルが 5 つもある!!!おおい!!! 5 回も実行したらどこかで数字間違えるよ!!!という人居ませんか?(わたしはそうです)
ということでシェルスクリプト書きました。
シェルスクリプト
ファイル名を固定していますが、例年この形なので今年もきっとこれだと思います。そうでなかったら、合うように調整してください。
OS X, Cygwinなどなど
書いたものはこれです。→ https://gist.github.com/4298378
(cygwin で使用するときは、a.out を a.exe に書き換えてください。 a.exe でなく、問題毎に実行ファイルの名前を変えている場合はそのファイル名にしてください。)
左の方に Download とかいうボタンがあるとおもうのでそこからダウンロードして、名前を「[任意の英数字からなる文字列].sh」にしてください。拡張子は固定です。そうじゃないと動かないと思います。
使い方は以下の通りです。(このファイルが redirect.sh と保存されているとします。)
li_saku $ sh redirect.sh 1
これだけです。
sh というのはこれを実行するのに必要なもので、 redirect.sh はファイル名です。そのあとの 1 というのは問題の番号を表しています( 1 〜 6 のどれか)。
もし cygwin でエラーが出た場合、ファイルの中の ./a.exe という部分を a.exe に変えると上手くいくかもしれません。(手元に実行環境がないので未確認)
windows のコマンドプロンプト(cmd.exe)
スクリプトファイルはこれです。→ https://gist.github.com/4298328
実行ファイルを a.exe という名前で指定していますが、問題毎に実行ファイルの名前を変えている方は適宜変更して対応してください。
左の方に Download とかいうボタンがあるとおもうのでそこからダウンロードして、名前を「[任意の英数字からなる文字列].bat」にしてください。拡張子は固定です。そうじゃないと動かないと思います。
使い方は以下の通りです。(このファイルが redirect.bat と保存されているとします。)
li_saku $ redirect.bat 1
これだけです。
redirect.bat はファイル名です。そのあとの 1 というのは問題の番号を表しています( 1 〜 6 のどれか)。
使う時の注意など
これを一度実行するだけで、入力ファイル 5 つ全てに対する出力ファイルが生成されます。
なので、同じフォルダ内に入力ファイルがすべて入っている必要があります。
また、redirect.sh / redirect.bat の後に与える数字は一つじゃないとダメです。エラー処理なんかしてないので、各自気を付けてください。
おわりに
情報オリンピックの予選、がんばってください、応援してます!!!
環境もろもろ
12/15 0:53 ; そらはー先生の助言と入れてるフォントを追記
そろそろ Macbook Pro Retina Display Model が届くので、環境とかやっておきたいことを纏めようとおもいます。
はじめにやること
- なぜか出荷状態だと調子が悪いことが多いらしい?ので(びすたん談)とりあえず最初は適当に起動して、そのあと Option 押しながら起動して OS 再インストールする
- ( Mountain Lion だと簡単に出来るらしい)
- 参考:OS X Mountain Lion(マウンテンライオン)をクリーンインストールする方法
- 今はやらなくても大丈夫らしい
- 必要な設定ファイルもろもろはちゃんと Macbook Air から抜いておく
OS の設定が終わったらやること
- Windows 用にパーティションをわける。Windows には 128 GB ぐらい割り当ててあげればいいかも。→パーティションを分けるのはもろもろ突っ込む前の方が良い、とりあえず最速でBootcampマネージャ使って分けておくとよい
- XCode の command line tool を install して clang を入れる←他にも方法はあるかも
- XCode の command line tool は homebrew に必要なのでそれも真っ先に入れるべき
- 必要そうな Application を入れる
- Homebrew を入れて、 git を入れる
- そらはー先生を参考に Ruby のバージョンをあげる
- 無事にバージョンが上がったら、 pry と rails を install したあと、 rbenv rehash する
- Haskellを入れる
- ここを参考にして Java を入れる
- TopCoder.jnlp をダウンロード、設定
- Safari のエクステンションは pixplus のみ
ふぉんと
- あずきフォント / たぬき油性マジック / はんなり明朝 / ふい字 / しねきゃぷしょん / アームドレモン / アームドバナナ / S2G月フォント
こんなところかなあ。
SRM 564
21:10 ~ 22:25 のにっていでした。
@marin72_com が初参加だったよ!!!
easy
- 文字列が与えられます。同じ文字が並んでいる場合は圧縮する事が出来ます。
- XXXXXYX = XYX みたいにできる。
- 文字列を圧縮したものが回文のときは偽回文です。
- 回文か偽回文かそうでないか判定してください。
- ソースコードをかくだけ
- 偽回文の定義を間違えてみすった
medium
- R, G, B の順にボールをひとつずつすてられるロボットがいます。
- R, G, B のボールの数がそれぞれ与えられた時に、k 番目に捨てられるボールの色はなんですか?
- ふつうにやると、 k < 10^12 なので TLE するのでがんばりましょう
- 場合分けゲーだと思って書き始める
- 途中でとんでもないコードを書いていることに気付いてがんばって冷静になり、 vector に突っ込んでソートする
- 一番少ないボールを使い切った時点で k を越えていたら mod 3 で色をかえす
- 使い切ってもダメな場合は残り二つで考えて、 mod 2 でかえす
- 二つのうちひとつを使い切ってもだめだったら一番多いものの色をかえす
- はじめて本番でここまでかけた問題
けっか
- ox- / 220.01 pts / room : 11/20, whole : 366 / 737
- 927 -> 927
- 変動無しとは一体…
- 終わったあとに、じゃっぷるさんときゅうりにこのケースで落ちるよって言われたので直して Practice で通しました
- 2 行書き換えるだけで通った(´・ω・`)
- つぎは 500 も通したいです(そうじゃないともう Rating 上がらない
- おつかれさまでした。
SRM 563
- 12/9 02:10 ~ 03:25 のにってい。
easy
- ある文字列 S と T が与えられます。 S に対して出来るのは、S のどこかに同じ文字列をちょうど一回挿入することです。
- S = Ciel のときに出来るもののひとつは CCieliel みたいな感じ(いい感じの日本語がみつからない)
- T は S に対して適切な操作を行ったかどうかを Yes / No でこたえてください。
- (だと思う)
- STL でなんとかなりそうだったけどわからなかったので、挿入する位置を先頭からずらしていった文字列を全部つくって、それと T が合ってるか比較した
medium
- #, o, . からなるボードが与えられて、それぞれ障害物、コイン、空のマスです。
- ボタンを一度おすと上下左右のどれかの方向にコインを(?)ずらすことができます。
- コインをずらした先が障害物のばあい、コインはその場から動きません。
- コインをボードからちょうど一つだけ落とすことが出来たら終わりです。
- ボタンを 10 回以下押すことでコインを落とすことが出来たら、その最小の数を、出来なかったら -1 を返してください。
- 再帰でやるのかなあとか思ったけど、とんでもなくバグらせて、バグとったりお水飲んだりしてたら時間おわってた。かなしい。
けっか
- o-- / 212.24 pts / room : 7/20, whole : 256 / 704
- 922 -> 927
- +5 とか地味すぎて何もいえない
- おつかれさまでした。
JOIssにさんかしました
8/21 ~ 8/24(JOIss前)
- めぐさんとかちょくだいさんとかさかにゃんとかじゃぷるさんとかおぺにゃんとかとゆうごはんたべる。社長力やばかった。
- じゃぷるさんとゲーセンいったりする。リズム感よすぎてリフレク負けてばっかりだった
- じゃぷるさんの赤いライムの粒がすごいたまっててやべえよやべえよってなった
- 3日間で29クレぐらいしていた(やりすぎ)
- ライムはやりはじめてわりとすぐ赤くなった気がする
- リフレクたのしいです
- おおかみこども見た
- たのしかった(小並感)
- 雪がどんどん可愛くなっていてヤバい
- さいしょのほうあまりの疲れに寝てた
8/25 ~ 8/29(JOIss)
- かきせみいくまえに新宿のゲーセンにいった
- 本は遺伝的プログラミングをえらんだ
- ちゅーたーはじゃぷるさん
- セミナーでしたことと言われてぱっと出てくるものが無いレベルのことをした
- 講義の記憶がない(お察し)
- ぶっちゃけ木構造とか全くわからんし実装したこともなかったし、どうやって表現するとかさっぱりで手も足も出てなかったので人のを眺めていただけだった
- 初日と二日目体調崩して死にかける
- 事務局様に風邪薬もらった、やさしい
- きゅうりのTwitterとかTerminalに悪戯を仕掛けて遊んだ
- 二回ともわたしが犯人ですてへぺろ
- ぬるみねらる氏ときたゆた氏のスライドに登場したけど実際あんなに煽ったつもりはなかった
- わたしの前に発表した沖縄高専のひと二人のプレゼン力が高すぎてやばかった
- プレゼンうまくないのですごくこわかった
- ぬるみねらる氏の「あのさぁ…」がツボった
- 夏季セミ参加勢の一部がすごくホモホモしかった
- たのしかった
- 発表が大体数学か乱択で、数学出来ない勢のわたしはほぼ意味がわからなかった
- おわったのざんねん
8/30 ~ 8/31(JOIss後)
- ディズニーランドいきました
- たのしかった
- いろんなところいけた
- あした(31日)かえります
- 帰りたくないでござる〜〜〜
まとめ
- たのしかった(小並感)
- 今年で最後なのが本当に残念
- 来年も参加できる高2以下のひとたちはがんばってください
- キルミーベイベー冗談抜きでクソつまらんかった