Школа программиста

Забыли пароль?
[задачи] [курсы] [олимпиады] [регистрация]
Логин:   Пароль:    
Скрыть меню
О школе
Правила
Олимпиады
Фотоальбом
Гостевая
Форум
Архив олимпиад
Архив задач
Состояние системы
Рейтинг
Курсы
Новичкам
Работа в системе
Курсы ККДП
Дистрибутивы
Статьи
Ссылки


 
Вернуться
Тема: 1116 JS Presentation Error 21267134
1
  1  Березин Дмитрий, 25 марта 2024 г. 11:17:38
      Удалось-таки запустить вариант 3 из "Работа в системе".

Да, он действительно делает то, что мне нужно.
Когда я впервые его просматривал, то увидел fs.readSync и решил, что он читает из файла.
Но тут, оказывается, все намного хитрее.

Есть, правда, пара вопросов к нему, но я создам отдельную тему.

А вообще, я, пока думал, пришел к такому варианту:

async function solve(read) {
const a = await read(Number);
const b = await read(Number);

return a + b;
}

(async function run() {
const connectTo = stream => {
let input = [];

const receive = () => new Promise(resolve => {
const consume = () => {
input = stream.read().toString().trim().split(/\s+/); // 16kib
stream.removeListener('readable', consume);
resolve(input.shift());
};

stream.on('readable', consume);
});

return async Type => Type(input.length ? input.shift() : await receive());
}

console.log(await solve(connectTo(process.stdin)));
process.exit();
})();

Это пока черновик, не тестировал на скорость, но, думаю, идея понятна: нужны данные - открываем поток, читаем - закрываем поток.
Не знаю, правда, что будет, если размер данных больше буфера stdin. Ну и нет проверки на внезапное завершение потока, но это не должно быть критично для олимпиадных задач.
В остальном пока, вроде, работает.
  2  Меньшиков Фёдор Владимирович, 23 марта 2024 г. 23:30:53
      Вариант 3, кстати, не только работает с терминалом, его ещё и для интерактивных задач можно применять, где только исключительно консольный ввод и нужно ответить на строчку ввода до чтения следующей.
  3  Меньшиков Фёдор Владимирович, 23 марта 2024 г. 23:27:20
      На странице "Работа в системе" варианты 1 и 3 для node.js работают с консолью, не с файлами. И все 3 варианта принимаются acmp. У Вас дома может не работать, если у Вас версия Node.js меньше, чем на acmp.
  4  Березин Дмитрий, 22 марта 2024 г. 16:59:58
      В общем, да, я увидел проблему.

Буду думать, напишу здесь решение, когда найду.

Спасибо, Фёдор Владимирович, без Вашей помощи я бы не сдвинулся с места.
  5  Березин Дмитрий, 21 марта 2024 г. 23:49:38
      Стандартный windows prompt ничего не пишет.
Но я работаю через git bash, и он пишет: "stdin is not a tty"

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

Моя идея заключалась в том, чтобы создать рабочий js-шаблон, которому был бы нужен только терминал.
И все было хорошо, пока не попалась задача, где надо считать 2 строки вместо одной.
  6  Меньшиков Фёдор Владимирович, 21 марта 2024 г. 14:18:06
      А посмотрите, что у Вас дома получается при таком запуске: node 1.js < input.txt

Также отмечу, что на странице "Работа в системе" приведены рабочие варианты решения A+B на всех языках.
  7  Березин Дмитрий, 20 марта 2024 г. 19:17:09
      Самое интересное, что оба(!) варианта считывания из файла (синхронный и асинхронный) работают.

Та же задача при
- синхронном чтении: https://acmp.ru/index.asp?main=source&id=21268498
- асинхронном чтении: https://acmp.ru/index.asp?main=source&id=21273400

То есть проблема даже не в асинхронности как таковой, а именно в чтении из командной строки нескольких строк данных.
И проявляется только на сервере.
  8  Березин Дмитрий, 20 марта 2024 г. 5:39:12
      Аналогичная ситуация: https://acmp.ru/index.asp?main=source&id=21268941

Как и прежде, все работает локально.

В чем может быть разница между тем, как я подаю строки на ввод, и тем, как это делает скрипт на сервере?
  9  Березин Дмитрий, 19 марта 2024 г. 18:40:40
      Задача: 1116
Решения:
https://acmp.ru/index.asp?main=source&id=21267134
https://acmp.ru/index.asp?main=source&id=21267150

Работают локально (проверял только https://acmp.ru/index.asp?main=source&id=21267150, но они должны быть эквивалентны).

Предполагаю, что проблема в способе подачи построчных данных на сервере.

Что можно сделать, чтобы исправить и избежать проблем в будущем?
1

Чтобы оставить сообщение необходимо зарегистрироваться и авторизоваться!

Красноярский краевой Дворец пионеров, (c)2006 - 2024, ИНН 246305493507, E-mail: admin@acmp.ru