Получить ввод readline в виде массива - PullRequest
0 голосов
/ 03 марта 2020

Я сейчас занимаюсь программированием, но пытаюсь сделать правильный ввод. На моем выводе нет отзывов, есть только «ошибка», из-за которой мне очень сложно отлаживать. Вот входные данные:

4 2
1 4
2 9
4 7
5 8

, и я хочу собрать их следующим образом:

[4, 2, 1, 4, 2, 9, 4, 7, 5, 8];

Тестовая среда говорит мне, что я должен работать со входом следующим образом:

const readline = require('readline');

const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

rl.on('line', (line) => {
    var nums = line.split(' ');
    /*Solve the test case and output the answer*/
});

Как бы то ни было, я должен получить неправильный массив для моей переменной nums. Я испробовал несколько подходов (разбиение по / n и пробелам, итерация с для l oop и pu sh ... работа с rl .close ...) но так как отзывов о моем мнении практически нет, я впадаю в отчаяние. Простой интерфейс, который сообщает мне, что вывод моей программы помог бы ...

РЕШЕНИЕ

var nums = [];
rl.on("line", line => {
  let newLine = line.split(" ");
  newLine.map(line => nums.push(line));
});

rl.on("close", function() {
console.log(nums)
});

Я смог выполнить отладку через терминал, как только я правильно сделал ввод.

Ответы [ 2 ]

1 голос
/ 03 марта 2020

Простой интерфейс, который сообщает мне, что вывод моей программы поможет ...

Вы можете запустить ваше приложение nodejs с помощью nodejs! Вы можете скачать и установить его, а затем в свой терминал node yourjscodefile.js. Когда вы console.log(variable); будет выводить в терминал.

0 голосов
/ 03 марта 2020

Событие 'line' будет генерироваться каждый раз, когда rl читает новую строку, поэтому вы должны просто объявить свой nums вне функции обратного вызова слушателя. Примерно так:

...

var sums = [];

rl.on('line', (line) => {
    let newNumbers = line.split(' '); // [4, 2]
    sums.concat(newNumbers);
});

...

Возможно, вы захотите понять , как передатчик событий и слушатель событий работают в JavaScript.

Я думаю, что для вас нет ничего даже вы регистрируете прослушиватель событий 'error', потому что все работает, как ожидалось. И я считаю, что должно быть событие типа 'end' или 'closed', которое будет отправлено после того, как rl прочитает все содержимое ввода, и вы можете console.log свой массив sums, я думаю, вы можете получить свой ожидаемый результат.

Не следует обрабатывать массив sums сразу после закрывающих скобок, JavaScript является асинхронным, поэтому эти коды будут выполняться до того, как будут прочитаны все строки. Если есть метод, такой как rl.close, вы должны вызывать его в такой ситуации:

rl.on('line', (line) => {
 ...
 if (line === undefined) { // or any terminal character which createInterface would return. 
   rl.close();
 }
});

И я считаю, что rl.close() будет генерировать событие, как я говорил выше, что-то вроде 'end' или 'closed', поместите код для обработки окончательного sums там.

...