2023年12月15日金曜日

JavaScriptで標準入力をPython3っぽく受け取る

Paizaやその他、競プロでJavaScriptを使う時、他の言語と違って面倒なのは標準入力の受取である。 全部一気に受け取ってしまって、それらを配列で管理しなければならない。 この管理が非常に面倒なので、Python3みたいにinput()で一行ごとに受け取りたいと考えることしばしばである。 ふと思ったが、標準入力を一気に受け取って、一行ずつ吐き出すオブジェクトをつくればよいのである。 ということで早速実装
//classは巻き上げられないので最初に書く
class inputClass{
    constructor(){
        this.inputCounter = 0;
        this.list = [];
        this.len = 0
    }
    append (value){
        this.list.push(value);
        this.len++;
    }
    input(){
        if (this.inputCounter < this.list.length){
            return this.list[this.inputCounter++];
        }else{
            return '';
        }
    }
}
let data = new inputClass();
let reader = require("readline").createInterface({
    input: process.stdin,
    output: process.stdout
});
reader.on("line", (line) => {
    data.append(line.split(' '));
})
reader.on("close", () => {
    //読み込み行数を保持するlenプロパティで末尾まで取り出し
    for (let i=0; i < data.len; i++){
        console.log(data.input());
    }
});

入力
1 1
2 2
a
c
f g h

出力
[ '1', '1' ]
[ '2', '2' ]
[ 'a' ]
[ 'c' ]
[ 'f', 'g', 'h' ]

概ね期待通りに実装できた。 イテレーターで実装したほうが便利だと作った後に気づいたが ひとまず実装したのでよしとしたい。