fukke.cafe

TypeScript JavaScriptでAtCoderする

競プロをすることで取得できる言語に対する知識ってあるよね

ってことでTypeScriptで競プロをやってみました.

入力

C++やC以外で競プロをするときに気になるのはやはり入力の仕方です.
C++やCの場合は都度入力ができるのですが、TypeScriptの場合は最初に全ての入力を受け取り、それをパースして変数として使っていくっていう形になります.
多分一番ここが面倒くさいです.
実際のコードは、
import * as fs from "fs";

const input = fs.readFileSync("/dev/stdin", "utf8").trim();
これで入力がinput変数に文字列として入ります. trimメソッドを使っているのは最後に謎の空文字が入ったりしたので取り除くためです.
このinput内の文字列を、例えば split(' ')で空白ごとに分割したり、 split('\n')で改行ごとに分割したりと工夫して入力として使用します.

出力

出力はconsole.log()でOKです.

ABC167 A問題

例えばこちらの問題
https://atcoder.jp/contests/abc167/tasks/abc167_a
ではこのようなコードになります.
import * as fs from "fs";

const input = fs.readFileSync("/dev/stdin", "utf8").trim().split("\n");
const output = (x: any) => console.log(x);

const [S, T] = input;
S === T.slice(0, -1) ? output("Yes") : output("No");
入力を改行ごとに分割します.
配列の分割代入を用いて、 SとTの変数に代入するとスッキリと書くことができます.

ローカル環境での実行

C++, Cのときと同様にローカル環境でも実行できます.
例えば npx ts-node A.tsという感じです.
ただ注意点として入力がおわったらCtrl+Dをしないといけません.
これを忘れて「実行できねーーーーーーなんでーーーーーーー」って一時間ぐらいなってました。はい。

考察

TypeScriptで解くメリットとデメリットについてです.
メリットは
  1. TypeScriptで解ける!!(それはそう)
  2. WebStorm等のIDEを使える
    デメリットは
  3. やっぱり入力が面倒くさい
  4. 実行時間が気になる
    という感じです.
TypeScriptで解くのが目的なのでメリットはそれに他ならないです.
あと個人的にWebStormが使えるっていうのがとても高評価でIDEによる補完も効くしデバッグも簡単っていうのが良いです.
デメリットの入力はまぁガチ勢じゃない僕は丁寧丁寧にやってけばいいだけなんですけど、どうしてもリアタイとかで参加するとなると時間をとるなーと思います. 例えばABC166 B問題
https://atcoder.jp/contests/abc166/tasks/abc166_b
B問題なので簡単なんですけど、この手の入力が多い問題はTypeScriptだと地獄です。はい。
いろいろ工夫しながらパースしていかないといけないですね.
あとコンパイル言語に比べると実行時間が遅い(当たり前)なのでオーダーが重いと致命的かなあと思います。

おわりに

楽しいのでみんなもTSでやって

公開日 2020/05/16

目次

Thanks you for reading.