Всем привет,

Для раздела TL;DR просто перейдите в конец.

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

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

Затем возник следующий вопрос: а как я могу запустить только один файл в моем проекте Typescript, который содержит много других проблем (или, по крайней мере, будет)?

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

Это пакет codeforces-io.
Это простой макет для функций readline() и print(), поэтому вам не нужно изменять существующий код при его копировании для отправки.

Документация описывает, как использовать его как простой пакет, поэтому я напишу здесь учебник от начала до конца с некоторыми расширенными вариантами использования, которые могут вам понравиться.

Я создал этот пакет для тех, кто хочет, чтобы их код был максимально close to the submission code без необходимости иметь дело с boilerplate™, например. 1, 2.

Небольшой пакет для имитации функций Codeforces Javascript IO

npm i @ip-algorithmics/codeforces-io

Во-первых, у вас должен быть проект npm в папке. Итак, откройте терминал в нужной папке и просто введите npm init. Вы можете использовать значение по умолчанию.

Затем npm i @ip-algorithmics/codeforces-io

Если вы не используете Typescript, это все, что вам нужно сделать, в противном случае… просто запускайте это одно за другим.

Примечание: если вы хотите настроить Typescript, вам дополнительно потребуется запустить

Не забудьте not включить библиотеку 'DOM' в lib, потому что print функция уже объявлена ​​в библиотеке DOM для печати файлов.
Вы можете просто потребовать/импортировать функцию print для этого пакета для вывода на консоль. Если вам нужны другие функции из объекта консоли, вам может потребоваться весь файл console.

Использование с ts-node или node

Теперь, когда у вас есть рабочая среда, вы можете создать файл .js или .ts и приступить к работе.
В этой библиотеке используются современные модули импорта/экспорта ES6, но для этого нужно объявить еще несколько вещей в конфигурации проекта.
> Так что давайте пока остановимся на require.
В верхней части вашего файла просто напишите

Теперь, когда у нас есть функции, мы можем использовать их в проекте.

Функция readline читает из input.txt файла, который должен находиться в той же папке.
Вот краткий пример.

А вот и input.txt

Теперь, когда у нас есть файлы, мы можем просто запустить
node example.js или ts-node example.ts. Вы можете использовать абсолютный или относительный путь, эта библиотека будет искать место, где находится скрипт, а затем читать оттуда входной файл.
Так что вам не нужно cd <path>, вы можете просто использовать node <path>/<file>.

Использование с шуткой

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

Сравните это:

  • ts-node src/1300-points/totally-real-problem/index.ts
  • jest -t 'totally-real-problem Я бы сказал, что немного короче. Но как вы можете получить это? Ну, это просто на самом деле.

Просто запустите npm i -g jest ts-jest и npm i @types/jest и затем в корне проекта нужно создать файл с именем jest.config.ts и прописать в нем следующие строки:

Для javascript вы можете просто запустить jest --init, и это будет работать по умолчанию.

За исключением этого, теперь все ваши скрипты должны быть тестовыми
, поэтому имя должно быть .test.ts или .spec.ts или создайте папку с именем__tests__ и поместите в нее свои скрипты (то же самое относится к javascript также).

Теперь вам нужно преобразовать ваши скрипты в тесты. Это так же просто, как обернуть все в

Пример выше будет преобразован в это.

Чтобы запустить его, просто введите jest -t 'example'.

Специальное упоминание

Для проектов машинописи, если вы используете одни и те же имена функций, не помещая их в класс, вы получите сообщение об ошибке, что имя занято, поэтому вам нужно добавить export {}; в конец файла, чтобы имена не конфликтовали.

Если что-то не работает, не стесняйтесь оставлять комментарии, открывать тикеты или, что еще лучше, создавать пулреквесты.

  • Создал библиотеку для Codeforces, которая читает input.txt из папки, в которой был вызван скрипт.
  • npm i @ip-algorithmics/codeforces-io
  • Пример кода

А вот и input.txt

Удачного кодирования!

Я добавил функцию testOutput. Теперь вы можете создать свой файл output.txt и поместить в него выходные данные.
Вам просто нужно запустить функцию в конце скрипта, и она предложит вам вывод Passed или Failed в консоли.
Помните, что нельзя копировать эту функцию в представлении.

Внутренне теперь print кэширует все, чтобы testOutput мог проверить, совпадает ли то, что было напечатано, с тем, что находится в output.txt

Первоначально опубликовано на https://dev.to 17 марта 2021 г.