2023年12月15日金曜日

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

Paizaやその他、競プロでJavaScriptを使う時、他の言語と違って面倒なのは標準入力の受取である。 全部一気に受け取ってしまって、それらを配列で管理しなければならない。 この管理が非常に面倒なので、Python3みたいにinput()で一行ごとに受け取りたいと考えることしばしばである。 ふと思ったが、標準入力を一気に受け取って、一行ずつ吐き出すオブジェクトをつくればよいのである。 ということで早速実装
  1. //classは巻き上げられないので最初に書く
  2. class inputClass{
  3. constructor(){
  4. this.inputCounter = 0;
  5. this.list = [];
  6. this.len = 0
  7. }
  8. append (value){
  9. this.list.push(value);
  10. this.len++;
  11. }
  12. input(){
  13. if (this.inputCounter < this.list.length){
  14. return this.list[this.inputCounter++];
  15. }else{
  16. return '';
  17. }
  18. }
  19. }
  20. let data = new inputClass();
  21. let reader = require("readline").createInterface({
  22. input: process.stdin,
  23. output: process.stdout
  24. });
  25. reader.on("line", (line) => {
  26. data.append(line.split(' '));
  27. })
  28. reader.on("close", () => {
  29. //読み込み行数を保持するlenプロパティで末尾まで取り出し
  30. for (let i=0; i < data.len; i++){
  31. console.log(data.input());
  32. }
  33. });
  34. 入力
  35. 1 1
  36. 2 2
  37. a
  38. c
  39. f g h
  40. 出力
  41. [ '1', '1' ]
  42. [ '2', '2' ]
  43. [ 'a' ]
  44. [ 'c' ]
  45. [ 'f', 'g', 'h' ]

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