0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

競プロの計算量概算用VSCode拡張機能(Competitive Calculator)

Last updated at Posted at 2022-10-17

TL;DR

空の行に数式を入力し、macOSではCmd+Alt+c、WindowsではCtrl+Alt+cを押すと概算の計算結果が表示されるVSCode拡張機能です. 2^255C310!などといった記号を含むものも計算できます.

使用可能な演算一覧

演算子 演算子
足し算 +
引き算 -
掛け算 *
割り算 / 結果が小数の場合は小数点以下が切り捨てられます。
組み合わせ nCr 大文字小文字は不問です。
階乗 n!
対数(底2) log(n) 括弧が必須です。結果が小数の場合は小数点以下が切り捨てられます。
括弧 ()

※入力の空白は全て無視されます。

仕様・使用例など

最近ときどきAtCoderというサイトで競技プログラミングをしているのですが、思いついた解法が実行時間制限に間に合うかどうかの計算がVSCode内で完結できるとエレガントだなと思い、今日少し時間があったのでVSCodeの拡張機能を作ってみました。

例えば2²⁰₁₀C₅をパパッと計算したいとき、新しい行に

2^20*10c5

と入力してmacOSではCmd+Alt+c、WindowsではCtrl+Alt+cを押すと

2^20*10c5 = 264,241,152

と結果が出ます。この例では実行時間制限に間に合わなそうですね。

JavaScriptのBigInt型で計算しているので、用途はよく分かりませんが10000!とか10000c5000とかも平気な顔して計算します。

その他

数式の構文解析

例えば1+2*3を左から読んで実行してしまうと答えが9になってしまい、括弧なども使えません。

再帰を使えばできそうだなぁ、でもかなり面倒だなぁ、などと思いながら調べていたところ、操車場アルゴリズムというものに行き当たりました。

このアルゴリズムでは、数と演算子を保持するスタックを用意して左から数式を読んでいき、次に読んだ演算子の優先順位がスタック最後尾の演算子の優先順序よりも低い場合にはそうでなくなるまでスタックの演算子を潰していきます。

今回はこのアルゴリズムを実装して入力を逆ポーランド記法に変換し、その後簡単なスタックマシンで結果を計算しています。math.jsなどを使った方が楽だったかもしれません。

VSCodeの拡張機能開発について

こちらはnpmさえインストールされていればpublishするところまで全く難しくなく、とてもスムーズに開発できました。

おわりに

VSCodeの拡張機能開発は初めてでしたが、とても開発が楽で3時間程度で完成してしまいました。また何か思いついたら作ろうと思います。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?