blog.bouzuya.net

2020-07-24 ARC002 A, B, C / WASM を使った npm パッケージをためした

ARC002 A, B, C 考察

ARC002 A うるう年

うるう年を計算する。書かれている条件を並べる。後のものがより優先されるので逆順に並べると良い。ただし 4 番目の条件は既定値なので最後で良い。

最初は 1 行で書いたがこの記事を書くときに分かりやすいよう素直な形へと書き直した。

https://atcoder.jp/contests/arc002/submissions/15383827

ARC002 B 割り切れる日付

判定は書かれているとおりの (y % m) == 0 && ((y / m) % d) == 0 で終わる。順に日付をたどるところが言語によっては難しくないが面倒だ。 d を 1 ずつ増やして月の最後の日を超えていたら次の月かつ 1 日に。同様に m を 1 ずつ増やして年の最後の月を超えていたら次の年かつ 1 月に。あとは条件を満たすまで判定と次の日付を繰り返せば良い。

月の最後の日がうるう年かどうかで変わる。そこで ARC002 A の提出を使用できるようになっている。

https://atcoder.jp/contests/arc002/submissions/15383869

ARC002 C コマンド入力

L と R のすべての組み合わせは 4 * 4 * 4 * 4 = 256 。それらに対して N (N <= 1000) を順に走査しても間に合う。

途中の走査でなぜか 2 ずつインクリメントしていて WA を出した。

https://atcoder.jp/contests/arc002/submissions/15383942


npm:@bouzuya/tsv-wasm をつくった。

npm:@bouzuya/tsv と似たような tsv を操作する npm パッケージ。ただそれはどうでもよくて問題なのは実装が WASM になっている点だ。

Rust で書いて WASM を使う形にしている。手順は https://rustwasm.github.io/docs/book/ にあるとおり wasm-pack で素朴に対応した。

唯一はまった点は Vec<Vec<String>> という入れ子の Vec を読めないという点。 https://rustwasm.github.io/docs/wasm-bindgen/reference/arbitrary-data-with-serde.html にあるとおり serde で JsValue として受け取ってそれを deserialize して取り出した。おそらく一度 JSON に変換されている。

速度を測ってみたけどこのパッケージの場合は TypeScript で書いた方が早かった。おそらく ↑ の JSON.stringify が効いているのだと思う。細かいところまでは調べていない。


髪を切った。