javascriptを上達させたいけど、非同期ioが足を引っ張って競技プログラミングを解くのには使いにくい。
そこで自前でPythonっぽい関数を実装してみた。
環境
- windows 10
- node.js 12.18.3
windowsマシンゆえに
main(require('fs').readFileSync('/dev/stdin', 'utf-8'))
が使えない。提出する分には問題ないが、デバッグする時に困る。
実装した関数
input()
コンソールから入力を1行だけ文字列として受け取る関数。
Pythonのinput()
を模した。
異なる点は使用する際にawait
を付けるということ。
- コード
function input(){ const readline = require('readline') const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); return new Promise((resolve, reject) => { rl.on('line', (line) => { resolve(line); rl.close(); }) }) }
- 使用例
async function main(){ const n = await input(); //await はasync関数の中でのみ有効 const ans = (n <= 999) ? 'ABC' : 'ABD'; console.log(ans); }
- 解説(備忘録)
input関数はreadline
モジュールの'line'
イベントを実行するPromise(PythonでいうとFuture)オブジェクトを返す。
async関数内でawaitを付けてinput関数を呼び出すことで、インタープリターはPromiseが完了するまで次の行へは進まずに待機する。
Promiseは完了するとresolve
の中身を返すので、それを変数n
で受け取っている。
- 参考
ja.javascript.info
(accessed on 2020/09/25)
nodejs.org
(accessed on 2020/09/25)
以前自作したツールのテンプレートとして登録すれば準備完了だ。
https://nnt339es.hatenablog.com/entry/2020/09/25/153524nnt339es.hatenablog.com
というわけでもなく、アルゴリズムを柔軟に実装するにはもう少し自前ライブラリが必要と感じた。