ввод/вывод на js (node js) для решения задач

Начал решать тренировочный контест на языке Node.js, решил пару задач, реализовал ввод/вывод, хоть и убогий (как мне кажется), но проверку решение прошло. В этой задаче на вход поступает одно число, я его получил, произвёл некие вычисления, и вывел в консоль по событию on.close (думаю можно лучше, но не понимаю пока ничего в node).

var readline = require('readline');
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
let total = 0;
rl.on("line", function (data) {
    data = +data;
    while (data > 1) {
    data /= 2;
    total++;
    }
    rl.close();
});
rl.on("close", () => {
    console.log(total);
});

В примерах есть ещё такая строчка, но я так и не смог получить от неё ответ, может и тут кто подскажет, в чём проблема и как это использовать.

process.stdin.on('end', () => { console.log(total); process.exit(0); });

Начал решать следующее задание, в котором на вход поступает 3 строки, и я не понимаю, каким образом их получить, так как в предыдущих двух задачах на вход поступала одна строка. Выглядят входные данные так:

Ввод   
5 5   
1 4 9 16 25   
2

Похожие вопросы посмотрел, там всё слишком сложно описано, думаю можно обойтись примерно такой же записью, какая описана выше. Пытался входные данные записывать в массив, и получать элемент массива по индексу. В своём редакторе всё работает хорошо, но контест решение не принял (при этом понять почему решение не прошло - невозможно, там не показывается где ошибка, и какие тесты не прошли). Подскажите, пожалуйста, каким образом лучше получать входные данные на node js в подобных задачах, может модуль fs применяется в таких случаях.

Заранее спасибо.


Ответы (1 шт):

Автор решения: Alexey Ten

Обычно в таких заданиях данных не очень много и не требуется никакой обработки ошибок. Поэтому можно просто синхронно прочитать данные и разложить по переменным.

«Магия» тут в том что readFileSync принимает не только путь к файлу, но и файловый дескриптор (число) которое для стандартного входа традиционно равно 0.

Примерно так:

'use strict';

const [ line1, line2, line3 ] = require('fs')
    .readFileSync(0, 'utf-8')
    .trim()
    .split('\n')
    .map(s => s.trim().split(/\s+/).map(Number));

console.dir({
    line1,
    line2,
    line3
});

Получается примерно так:

$ cat input.txt | node program.js
{
  line1: [ 5, 5 ],
  line2: [ 1, 4, 9, 16, 25 ],
  line3: [ 2 ]
}

Тут основная идея это синхронное чтение входных данных в массив строк, а что с ними делать дальше уже зависит от задачи.

const lines = require('fs')
    .readFileSync(0, 'utf-8')
    .trim()
    .split('\n');
→ Ссылка