ввод/вывод на 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 шт):
Обычно в таких заданиях данных не очень много и не требуется никакой обработки ошибок. Поэтому можно просто синхронно прочитать данные и разложить по переменным.
«Магия» тут в том что 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');