Всем привет,
Для раздела 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 г.