Мы решили опубликовать ряд важных разъяснений к правилам, чтобы помочь участникам избежать типичных ошибок. Обидно было бы дисквалифицировать интересное решение из-за чисто технической ошибки.
По многочисленным просьбам мы также публикуем официальный скрипт для тестирования. С помощью него Вы можете самостоятельно проверить, работает ли Ваша программа в условиях нашей тестовой системы. Запустите скрипт без аргументов, чтобы узнать, как им пользоваться.
Для отправки работ осталась ещё неделя. Если этот пост помог Вам найти ошибку, ещё есть время её исправить.
Часто задаваемые вопросы
- Как же я смогу прочитать файл
words.txt
, если нельзя загрузить модульfs
? А можно ли скачать его из интернета? Можно ли использоватьprocess.binding
?
Ваша программа не будет иметь доступа к файлуwords.txt
. В этом и смысл. Если бы можно было просто прочитать этот файл, задача была бы тривиальной. Ничего нельзя скачать, потому что для этого понадобились бы такие модули, какhttp
илиnet
. Включить словарь в своё решение тоже не получится из-за ограничения по размеру.
Это означает, что написать решение, всегда дающее правильные ответы, скорее всего, невозможно. Но можно написать программу, которая чаще угадывает правильно, чем неправильно, и тот, чья программа точнее угадывает, победит. - В словаре есть некоторые слова с прописными буквами. Могут ли они попасться в тестах?
Могут, но они будут переведены в нижний регистр. - Что означает «64 КиБ»?
64*1024 = 65536 байт. - Если мой файл данных сжат методом gzip, то должен ли его размер до или после сжатия укладываться в 64 КиБ вместе с текстом программы?
Учитывается размер после сжатия. - Что за странный словарь! Там полно каких-то непонятных слов.
Мы знаем, что он странный. Это самый большой словарь английского языка для проверки правописания, в который входит большое число аббревиатур, заимствований, редких слов, диалектизмов и даже невозможных словоформ. Тем не менее, мы выбрали именно этот словарь, поэтому для данной задачи «английское слово» — это то, которое встречается конкретно в этом словаре. - Какого размера набор «не-слов», используемый в генераторе тестов?
Генератор тестов не использует какого-либо фиксированного набора «не-слов». Он генерирует псевдослучайные слова, похожие на английские, непосредственно при запросе по алгоритму, который мы опубликуем при подведении итогов конкурса. - Как тестовая система будет учитывать дубликаты, то есть слова, встречающиеся более чем в одном из блоков по 100 слов?
Каждое вхождение будет учитываться как отдельное слово. Посмотрите, как устроен наш скрипт для тестирования. - Что, если победителю ссылку на конкурс прислали два человека?
Премию получит тот, кто прислал её первым.
Типичные ошибки
К сожалению, во многих решениях, которые мы получили на сегодняшний день, содержатся похожие технические ошибки:
- Функции
test
иinit
не экспортированы или экспортированы неправильно. Недостаточно просто объявить функции, их надо экспортировать из модуля. Если Вы не уверены, что сделали это правильно, проверьте свою программу нашим тестовым скриптом. - Функция
init
работает со своим аргументомdata
как с текстовой строкой, тогда как в условии явно сказано, что это будетBuffer
. - Программа использует файл данных, но он не приложен.
- Файл данных упакован методом gzip, но соответствующая опция в форме отправки не выбрана.
- Опция gzip в форме отправки выбрана, но файл вместо gzip представляет собой zip-архив. Это не одно и то же!
- Программа пытается использовать
require
илиprocess.binding
. Это запрещено правилами.
Удачи всем участникам!
Комментарии (66)
chianti
20.05.2016 22:04+1Большое спасибо, что создали еще одну тему, теперь я могу писать сюда комментарии, и еще большее спасибо за тестовый скрипт. Скрипт бесценен, поскольку я не программирую на JavaScript и не знал таких подробностей, как экспорт функций.
Потратил пару недель на обучение нейронных сетей и пришел к выводу, что ничему существенному их научить не смогу. Перепробовал разные варинаты: mlp и convolutional, но, видимо, нужна практика, чтобы добиться существенного результата с помощью данного метода. Единственное, что работает, это фильтрация совсем шума.
В итоге перешел к эвристическим методам, пока достиг 75+%
Imp5
20.05.2016 22:16+1feldgendler, моё решение в этом тестовом скрипте проверяется со скоростью ~50 слов в секунду (против 4000 в секунду моим скриптом), я так полагаю, это из-за виртуальной машины.
Это 5 часов на 1 000 000 слов.
Такая скорость проверки считается разумной? Или мне надо что-то исправить?
Antelle
20.05.2016 22:32Доступен
Buffer.allocUnsafe
;)
Не забудьте в параметр запуска добавить--zero-fill-buffers
, а то можно 100% набрать.deNULL
21.05.2016 05:45+1С приведенным примером тестирующего скрипта получить 100% можно и проще.
Описал способ feldgendler в личку, если он будет не против — могу рассказать и здесь (все равно решения победителей, я думаю, будут вручную просматриваться и всякие хаки там не прокатят).feldgendler
21.05.2016 09:19Не против. На всякий случай предупреждаю всех любителей обходных путей, что за манипуляцию тестовой системой последует дисквалификация.
deNULL
21.05.2016 09:58+3Для пущего веселья я решил заодно уместить свое решение в 3 строчки (и 146 байт), по-прежнему набирая этим кодом 100% :)
exports.init = exports.test = () => { Buffer.prototype.toString = () => '{' + new Array(100).fill().map((_, i) => `"${i}":0`).join(',') + '}' }
feldgendler
21.05.2016 15:20+2А после этого некоторые удивляются, почему нет живого leaderboard. А потому что не будем мы непроверенный код автоматически запускать на своих серверах, и не просите.
Don_Eric
21.05.2016 15:58+1теперь понятно
leaderboard хорош тем, что если я вижу что нахожусь в топе, то может смогу потратить еще несколько дней и урвать долю процента. А если разница очень большая, то даже и не пытаться тратить время а искать другое решение.
но в данном случае и leaderboard не поможет, так как всегда можно придержать лучшее решение на последний момент, или посылать решения которые нарушают правила. Тут только сработает формат kaggle
trong
21.05.2016 20:54+3А чего бы не запускать в docker-контейнерах например?
feldgendler
22.05.2016 01:17Конечно, есть способы. Но затраты труда на проведение конкурса всё-таки ограничены.
chianti
21.05.2016 22:10+2Я не очень понимаю, как вы предполагаете проверять код перед запуском? Каждое решение глазами? Там же, вполне вероятно, будет минифицированный код. Также часть кода, я, например, запихнул в data.gz и исполняю через eval. Как вы этот код проверите, кроме как запуском?
vermilion1
21.05.2016 22:15Поэтому просят прикреплять исходники.
Если это будет попытка обойти систему, то его не так и сложно отследить, даже в минифицированном варианте.
feldgendler
22.05.2016 01:19+1Главное, что результат из скрипта не попадёт автоматически в публичную таблицу. А так всё равно всё ещё и в виртуальной машине.
Suntechnic
21.05.2016 00:27> Функции test и init не экспортированы или экспортированы неправильно. Недостаточно просто объявить функции, их надо экспортировать из модуля. Если Вы не уверены, что сделали это правильно, проверьте свою программу нашим тестовым скриптом.
Если доходи до такого, может лучше выложить шаблон кода? Пусть test содержит там хотя бы просто return true; но это поможет избежать нелепых ошибок тем кто видит js первый раз.feldgendler
21.05.2016 00:31+4exports.init = function(data){ ... }; exports.test = function(word){ ... };
Suntechnic
21.05.2016 00:35+1Спасибо, конечно но я знаю. Я имел ввиду добавить в статью. Для незнакомых с js вообще.
tyomitch
21.05.2016 02:27Заголовок топика — «Конкурс по программированию на JS».
Вряд ли люди, незнакомые с js вообще, решат принять в нём участие.feldgendler
21.05.2016 09:20+6Поскольку наша корыстная цель — найти программистов для повседневной работы именно с Node.js, то нас это вполне устраивает.
hellosandrik
21.05.2016 00:50Почитал комментарии к прошлой статье и возник вопрос: почему никому применение нейронных сетей здесь не кажется странным? Это же совсем не задача машинного обучения. Его задача — классификация и обобщение, но уж никак не запоминание. А тут, судя по сетам правильных и неправильных слов (честно признаюсь, не сильно в них всматривался, но все же), они сгенерированы одним и тем же генератором, т.е. нет никаких паттернов, по которым их можно было бы различить. Нейронные сети тут будут выдавать более-менее приемилимый результат только в результате переобучения, а в этом случае теряется весь смысл нейронных сетей. P.S: Хотя вот задача распознования лиц тоже решается нейронными сетями и это может ввести в заблуждение, но только вот там применяются CNN, которые, грубо говоря, отображают лица в набор особенностей и производят переобучение на этих наборах. Т.е. их использовать удобно потому что они автоматически выявляют признаки, а не потому что у них хорошая память.
Suntechnic
21.05.2016 00:56+1Потому, что некоторые рассчитывали, что в словообразовании есть некоторые правила и их можно выявить с помощью нейронной сети.
Но большинству уже понятно, что зря.feldgendler
21.05.2016 01:00+1Вам же интуитивно понятно, что «dfowyy» не похоже на английское слово? А определяете Вы это нейронной сетью, больше нечем. То есть на нейронных сетях задача вполне решается, только не обязательно легко.
Suntechnic
21.05.2016 01:08+2Чем я это определяю большой вопрос. Т.е. в обобщенном смысле конечно нейронной сетью. Только вот между нейронной сетью о которой мы тут говорим и нейронной сетью мозга пропасть.
Ну и кроме того этой же нейронной сетью я определяю что pfd тоже не фига не английское слово, а вот какой-нибудь ongaze мог бы и проканать. Боюсь если определять буду я, то не обгоню в этом конкурсе даже самый простые алгоритмы.feldgendler
21.05.2016 01:10+1Да, 100% Вы не определите. Генератор устроен так, что он выдаёт слова разной степени схожести с английскими — от белого шума до почти неотличимых. Это сделано для того, чтобы разные программы могли соревноваться в различении большего числа «ступеней» сходства.
Suntechnic
21.05.2016 01:26+1И вот об эти слова как раз и споткнется нейронная сеть! Так же как спотыкается наш мозг. Тут нужно действительно решение которое хорошо запоминает данные в минимальном объеме.
tyomitch
21.05.2016 02:30Никто не запрещает комбинировать различные алгоритмы: нейросеть для отсева «dfowyy», и что-нибудь другое для отсева «ongaze».
Don_Eric
21.05.2016 15:04немного ламерский вопрос — у меня установлена версия 6.2.0, и скрипт на ней проходит ок (после комментирования строчки с проверкой на «6.0.0»). Нет ли никаких breaking changes с тех пор? Особыми фичами языка не пользуюсь
П.С. а не могли б организаторы посылать при каждой заявке на мейл также результат предварительной проверки? Было б очень здорово
А если б еще и leaderboard… :)mwizard
21.05.2016 15:11+2$ npm install -g nvm $ nvm install 6.0.0 $ nvm run 6.0.0 your_app.js
Don_Eric
21.05.2016 15:22спасибо. хотя nvm не сработал, но получилось через n
mwizard
21.05.2016 15:31Спасибо, я не знал про n. А как именно не сработал nvm, чтобы можно было багрепорт отправить?
p.s. Интересно, чем вызван минус…Don_Eric
21.05.2016 15:35минус не я поставил, но скомпенсировал плюсом :)
>nvm download 6.0.0
>sudo nvm install 6.0.0
Not built yet
>sudo nvm build 6.0.0
Configuring… File "/Users/Roman/.nvm/node-v6.0.0/configure", line 481
'''
^
SyntaxError: Missing parentheses in call to 'print'
Запускал на макеmwizard
21.05.2016 15:40У меня тоже мак… крайне странно! У вас nvm 0.28.0? Дело в том, что он не должен билдить node, а только скачивать и распаковывать готовый, плюс мой вообще не имеет команды build!
И да, я, кажется, понимаю, за что минус.
Я пребывал в ошибочной уверенности, что ставил nvm через npm.$ npm install nvm npm WARN deprecated nvm@0.0.3: This is NOT the correct nvm. Visit http://nvm.sh and use the curl command to install it.
feldgendler
21.05.2016 15:19Мы для того и опубликовали тестовый скрипт, чтобы каждый мог заранее убедиться, что его программа не содержит технических ошибок.
Don_Eric
21.05.2016 17:04вопрос к организаторам — а вы можете сказать какое будет минимальное кол-во блоков для тестирования? Мой результат стабилизируется до промилле после 4000, и надеюсь что в тесте будет больше
feldgendler
21.05.2016 17:08+2Такое, какое потребуется, чтобы увидеть уверенную разницу между лидерами.
Shedar
21.05.2016 17:36+1Что является уверенной разницей?
Например, на одном блоке одно решение даст 65% а другое 75%. Является ли это уверенной разницей?
У меня разброс между самым удачным и самым неудачным блоком в тестовом наборе больше 20%feldgendler
22.05.2016 01:15Начнём с 1000 блоков, а потом видно будет.
Zavtramen
22.05.2016 02:04+1Более-менее результат стабилизируется после 10000 блоков. По крайней мере у меня.
Tiulkin
21.05.2016 22:05А хотя бы с порядком не сориентируете(тысячи/десятки тысяч/сотни тысяч/миллионы)?
SabMakc
22.05.2016 09:54Вы для выявления уверенной разницы будете «гонять» все решения или только лучшие?
feldgendler
22.05.2016 11:17+2Когда решим, сколько нужно для лучших, прогоним на этом количестве всех.
LostVoice
23.05.2016 12:25feldgendler, а можно нескромный вопрос? Планируется ли какое-то поощрение участникам, которые не попадут в ТОР-3 но будут очень близки к этому? У меня складывается впечатление, что разница между победителями и лучшей десяткой будет меньше 1%. Обидно будет участникам не попавшим в призы из-за пол процента. Или это жесткий конкурс, где даже сотая процента отделяет «всё или ничего»? :)
feldgendler
23.05.2016 13:09+4Во множестве видов спорта разница между лидерами гонки может оказаться ничтожной. Не вижу причин, почему здесь должно быть иначе.
Gromo
23.05.2016 15:20+1Судя по описанию конкурса можно получить спец призы за интересные и оригинальные решения на усмотрение организаторов конкурса. По мне очень даже справедливо. К тому же место в первой десятке тоже довольно сильно тешит ЧСВ :)
SerzhShuklin
23.05.2016 13:10Возможно ламерский вопрос.
в условии кроме рачего скрипта позволяется еще файлик с «мини-словарем» (ну или той инфой что мне нужна). Как его прочитать?feldgendler
23.05.2016 13:10Ваш файл данных будет прочитан тестовой системой и передан Вашей функции init в качестве аргумента типа Buffer.
SabMakc
23.05.2016 22:12Хотел предложить объединить тесты в один большой файл вида:
post 1
ch'stalietized 0
magnanimously 1
...
что могло бы ускорить прогон тестов до 3-х раз…
Но с текущей реализацией тестирования это не даст желаемых результатов.
На простом решении вида «return 0» с 20-ю миллионами тестовых слов (200к блоков) получил такие результаты:
1. Решение с обходом каталога, vm (из статьи): 12m23.839s
2. Решение с обходом каталога, «честный» require: 0m59.152s
3. Решение с одним большим файлом (через readline), «честный» require: 0m18.198s
Сделал несколько прогонов, чтобы файлы были в кэше.
Диск SSD, оперативки с запасом (16GB).feldgendler
23.05.2016 22:15Спасибо. Мы этот скрипт не оптимизировали, тут цель была дать возможность проверять корректность. Когда при подведении итогов встанет задача прогонять большое число решений на большом числе блоков, скорее всего, так или иначе оптимизируем.
chianti
23.05.2016 22:40Я для эстетики еще аргументы местами переставил, заодно и парсить проще:
1 post
0 ch'stalietized
1 magnanimouslySabMakc
23.05.2016 23:45Не вижу особой разницы в эстетике или в парсинге…
Понятное дело, что подобный файл сортировать построчно нельзя.
Но если вдруг отсортируют… Будет нарушено одно из условий работы тестового генератора — на 100 тестов (1 блок) примерно поровну слов и не-слов.
А в предложенном мною варианте сортировка не будет столь катастрофична :-)
chianti
25.05.2016 09:58Почитав соседнюю ветку, пришел к оценке, что по крайней мере 5 человек смогли преодолеть порог в 80%, или, по крайней мере, верят в то, что смогли преодолеть. Так что, вполне вероятно, кто-нибудь и покажет результат в 85%
Zavtramen
25.05.2016 16:20Так что, вполне вероятно, кто-нибудь верит в то, что покажет результат в 85% )
chianti
26.05.2016 23:29А можно описание решения выложить попозже? Например, после предварительных итогов. А-то сейчас код представляет собой некоторую кашу из Java, Python, Shell-скриптов и JavaScript, которую я, конечно, приложу сразу, но в которой, вообще, трудно разобраться.
chianti
27.05.2016 15:24Дрожащими руками залил решение. Неплохо бы на будущее, чтобы еще MD5 от файлов приходило на почту, чтобы можно было проверить то или не то загрузил
Don_Eric
обязательно называть свои файлы solution.js и data.gz?
feldgendler
Именно для тестового скрипта — да. При отправке решения файлы могут называться как угодно.
Gromo
судя по тому, что файлы отправляются через форму, не обязательно