- PVSM.RU - https://www.pvsm.ru -
Компания Hola [1] объявляет начало весеннего конкурса по программированию! Призовой фонд увеличен:
Мы ищем талантливых программистов, поэтому авторы интересных решений будут приглашены на собеседования.
На этот раз мы решили попробовать что-то новенькое: для разнообразия, этот конкурс — не на производительность кода.
Условия конкурса на английском языке размещены на GitHub [3]. Ниже — перевод на русский язык.
Вам нужно написать программу, которая отличает слова английского языка от последовательностей символов, не являющихся словами. В этой задаче мы считаем словами английского языка те и только те строки, которые встречаются в списке words.txt [5], прилагаемом к условию. Членство в списке регистронезависимое. Казалось бы, это просто — нужно только проверить, встречается ли строка в словаре — если бы не ограничение на размер решения в 64 КиБ.
Едва ли возможно написать программу, которая укладывалась бы в ограничение и всегда давала бы верные ответы. Но этого и не требуется. Мы измерим, как часто Ваша программа будет отвечать правильно, и победит программа, дающая наибольший процент правильных ответов.
Ваш JS-файл должен быть модулем для Node.js, экспортирующим две функции:
init(data)
Необязательно. Если функция экспортирована, она будет вызвана один раз для инициализации модуля. В качестве аргумента data
будет передано содержимое дополнительного файла данных (в виде Buffer
), если Вы его предоставили, или undefined
в противном случае.
test(word)
Эта функция должна возвращать true
, если она классифицирует word
как слово английского языка, и false
в противном случае. Эту функцию можно вызывать многократно для различных слов.
Вместе с программой Вы можете предоставить дополнительный файл данных. Если Вы это сделаете, то тестовая система прочитает этот файл в Buffer
и передаст Вашей функции init
. Файл данных делит квоту в 64 КиБ с JS-файлом, то есть ограничение применяется к сумме размеров этих двух файлов. Вы также можете указать, что Ваш файл данных сжат с помощью gzip. Если Вы отметите соответствующую опцию в форме отправки решения, то содержимое файла данных будет обработано функцией zlib.gunzipSync
перед тем, как попасть в функцию init
. Этот вариант удобен тем, что Вам не нужно ни внедрять в код на JS двоичные данные, ни писать самостоятельно стандартный алгоритм распаковки. При этом, конечно, ограничение по размеру касается сжатых данных; после распаковки их размер вполне может превысить 64 КиБ.
Мы будем тестировать Вашу программу на большом количестве слов. Некоторые из них будут реальными словами из предоставленного словаря, а некоторые — генерированными не-словами с различной степенью сходства с настоящими словами, от шума вроде dknwertwi до почти-слов вроде sonicative. Мы будем использовать в тестах только ASCII-строки, содержащие латинские буквы нижнего регистра, а также символы '
и -
.
В отличие от предыдущих соревнований, Вы можете заранее увидеть наши тесты по адресу hola.org/challenges/word_classifier/testcase [6]. При каждой загрузке Вы получите редирект на адрес, содержащий случайное число. Это число — начальное значение для детерминистического генератора псевдослучайных чисел. С каждым конкретным начальным значением Вы всегда получите один и тот же набор тестов, а, варьируя начальное значение, можете получить множество разных тестов. Генератор возвращает JSON-объект, ключами которого являются 100 различных слов, а значениями — true
или false
в зависимости от того, встречается ли слово в словаре (хотя последнее Вы легко можете проверить самостоятельно). С помощью генератора тестов Вы можете сами измерить процент правильных ответов, которые даёт Ваша программа, или сравнить разные версии решения между собой. Мы оставляем за собой право ограничивать частоту запросов к генератору тестов.
Наша тестовая система загрузит Ваш модуль один раз. Затем, если модуль экспортирует функцию init
, тестовая система её вызовет. Если Вы предоставили дополнительный файл данных, он будет загружен в Buffer
, распакован при необходимости, и передан функции init
в качестве аргумента data
. После этого тестовая система вызовет функцию test
много раз для разных слов и подсчитает число правильных ответов. Значения, которые возвращает функция, будут приведены к булевым.
Мы будем генерировать тесты тем же генератором, который описан выше. Мы сгенерируем некоторое количество блоков по 100 слов. Решения всех участников получат одни и те же наборы тестов. Мы возьмём столько блоков по 100 слов, сколько потребуется для того, чтобы с уверенностью различить между результатами тройки призёров. В случае практически неразличимых результатов мы оставляем за собой право разделять призы между несколькими участниками. Вместе с результатами конкурса мы опубликуем начальные значения псевдослучайного генератора, которые мы использовали для тестирования, и исходный код генератора тестов.
Для отправки решений пользуйтесь формой [4]. Мы не принимаем решения по электронной почте.
Мы ожидаем, что многие решения будут содержать генерированный, минифицированый, сжатый код или данные, и поэтому просим отправить нам также и исходники решения. Если код или данные — результат генерации, приложите, пожалуйста, генератор. Если код минифицирован или сжат, включите оригинал, а также программу для сжатия, если это не публичный модуль. Если код скомпилирован из другого языка вроде CoffeeScript, включите оригинал на этом языке. Мы также просим Вас по возможности включить файл README с кратким описанием Вашего подхода к решению (на английском языке). Не включайте, пожалуйста, словарь из условия задачи — он у нас уже есть. Всё это упакуйте, пожалуйста, в tar.gz или zip, и отправьте нам вместе с решением. Размер этого архива не учитывается при проверке ограничения на размер решения в 64 КиБ. Мы опубликуем содержимое Вашего архива, но не будем его тестировать. Оно также поможет нам определить, кого наградить специальными призами за оригинальность.
Если у Вас не получается отправить решение, напишите, пожалуйста, комментарий или письмо [7].
Желаем удачи всем участникам!
Автор: Hola
Источник [8]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/javascript/119387
Ссылки в тексте:
[1] Hola: https://hola.org
[2] наш адрес: mailto:challengejs+habrahabr@hola.org
[3] на GitHub: https://github.com/hola/challenge_word_classifier
[4] этой формы: https://hola.org/challenges/word_classifier
[5] words.txt: https://cdn.rawgit.com/hola/challenge_word_classifier/1945d565fd929118c88fbceadfe4818d138e3b5f/words.txt
[6] hola.org/challenges/word_classifier/testcase: https://hola.org/challenges/word_classifier/testcase
[7] письмо: http://challengejs@habrahabr.ru
[8] Источник: https://habrahabr.ru/post/282624/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best
Нажмите здесь для печати.