Компания Hola объявляет начало весеннего конкурса по программированию! Призовой фонд увеличен:

  1. Первое место: 3000 USD.
  2. Второе место: 2000 USD.
  3. Третье место: 1000 USD.
  4. Возможно, мы решим отметить чьи-то чрезвычайно оригинальные решения двумя специальными призами в 400 USD.
  5. Если Вы отправите кому-то ссылку на этот конкурс, поставив наш адрес в CC, и этот человек займёт призовое место, Вы получите половину суммы приза (разумеется, не в ущерб награде победителя). За одного победителя такую награду может получить только один человек — тот, кто отправил ссылку первым.

Мы ищем талантливых программистов, поэтому авторы интересных решений будут приглашены на собеседования.



Правила


На этот раз мы решили попробовать что-то новенькое: для разнообразия, этот конкурс — не на производительность кода.

Условия конкурса на английском языке размещены на GitHub. Ниже — перевод на русский язык.

  • Отправляйте решения с помощью этой формы. По электронной почте решения не принимаются.
  • Решения принимаются до 27 мая 2016, 23:59:59 UTC.
  • Предварительные результаты будут опубликованы 3 июня 2016, а окончательное объявление победителей — 10 июня 2016.
  • Можно отправлять решения многократно, но от каждого участника будет рассмотрено только самое последнее решение, отправленное до окончания срока приёма работ.
  • Для тестирования мы будем использовать Node.js v6.0.0 (текущая версия на момент публикации). Можно использовать любые возможности языка, поддерживаемые интерпретатором в стандартной конфигурации.
  • Весь код решения должен находиться в единственном файла на JS.
  • Решение должно быть на JS. Если Вы предпочитаете CoffeeScript или подобные языки, необходимо оттранслировать решение в JS перед отправкой.
  • Нельзя загружать никаких модулей, даже тех, что входят в стандартный комплект Node.js.
  • Ваш JS-файл должен быть не больше 64 КиБ.
  • Вы можете предоставить один дополнительный файл данных для своей программы (см. ниже). Если Вы предоставляете такой файл, то он делит квоту в 64 КиБ с JS-файлом.
  • Если Ваш JS-файл или дополнительный файл данных — продукт генерации, минификации и/или компиляции с других языков вроде CoffeeScript, пожалуйста, приложите архив с исходниками, а также, желательно, описанием подхода. Содержимое этого архива будет опубликовано, но мы не будем его тестировать.
  • Нам нужно знать Ваше полное имя, но если Вы хотите, мы опубликуем вместо него псевдоним. Мы сохраним Ваш адрес электронной почты в тайне.
  • Запрещается публикация участниками своих решений до окончания конкурса. Нарушители будут дисквалифицированы.
  • Задавайте вопросы по условию задачи в комментариях к этой публикации или по электронной почте.

Постановка задачи


Вам нужно написать программу, которая отличает слова английского языка от последовательностей символов, не являющихся словами. В этой задаче мы считаем словами английского языка те и только те строки, которые встречаются в списке words.txt, прилагаемом к условию. Членство в списке регистронезависимое. Казалось бы, это просто — нужно только проверить, встречается ли строка в словаре — если бы не ограничение на размер решения в 64 КиБ.

Едва ли возможно написать программу, которая укладывалась бы в ограничение и всегда давала бы верные ответы. Но 100% правильных ответов и не требуется. Мы измерим, как часто Ваша программа будет отвечать правильно, и победит программа, дающая наибольший процент правильных ответов.

API

Ваш 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. При каждой загрузке Вы получите редирект на адрес, содержащий случайное число. Это число — начальное значение для детерминистического генератора псевдослучайных чисел. С каждым конкретным начальным значением Вы всегда получите один и тот же набор тестов, а, варьируя начальное значение, можете получить множество разных тестов. Генератор возвращает JSON-объект, ключами которого являются 100 различных слов, а значениями — true или false в зависимости от того, встречается ли слово в словаре (хотя последнее Вы легко можете проверить самостоятельно). С помощью генератора тестов Вы можете сами измерить процент правильных ответов, которые даёт Ваша программа, или сравнить разные версии решения между собой. Мы оставляем за собой право ограничивать частоту запросов к генератору тестов.

Наша тестовая система загрузит Ваш модуль один раз. Затем, если модуль экспортирует функцию init, тестовая система её вызовет. Если Вы предоставили дополнительный файл данных, он будет загружен в Buffer, распакован при необходимости, и передан функции init в качестве аргумента data. После этого тестовая система вызовет функцию test много раз для разных слов и подсчитает число правильных ответов. Значения, которые возвращает функция, будут приведены к булевым.

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

Отправка решения

Для отправки решений пользуйтесь формой. Мы не принимаем решения по электронной почте.

Мы ожидаем, что многие решения будут содержать генерированный, минифицированый, сжатый код или данные, и поэтому просим отправить нам также и исходники решения. Если код или данные — результат генерации, приложите, пожалуйста, генератор. Если код минифицирован или сжат, включите оригинал, а также программу для сжатия, если это не публичный модуль. Если код скомпилирован из другого языка вроде CoffeeScript, включите оригинал на этом языке. Мы также просим Вас по возможности включить файл README с кратким описанием Вашего подхода к решению (на английском языке). Не включайте, пожалуйста, словарь из условия задачи — он у нас уже есть. Всё это упакуйте, пожалуйста, в tar.gz или zip, и отправьте нам вместе с решением. Размер этого архива не учитывается при проверке ограничения на размер решения в 64 КиБ. Мы опубликуем содержимое Вашего архива, но не будем его тестировать. Оно также поможет нам определить, кого наградить специальными призами за оригинальность.

Если у Вас не получается отправить решение, напишите, пожалуйста, комментарий или письмо.

Желаем удачи всем участникам!

Комментарии (312)


  1. romy4
    27.04.2016 18:44
    -2

    В чём сложность конкурса скачать файл и найти в нём слово?


    1. feldgendler
      27.04.2016 18:48
      +3

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


      1. dottedmag
        27.04.2016 18:51
        +7

        Если программа без require сможет скачать файл, то автор будет вполне достоин спецприза :)


        1. Demogor
          05.05.2016 01:27
          -5

          Для программы — фигня вопрос(решение по конкурсу не проходит, т.к. нельзя вмешиваться в тестовую систему). Для модуля — пока не придумал.

          node index.js <words.txt для локального файла

          что-нибудь в духе

          lynx -dump https://github.com/hola/challenge_word_classifier/raw/master/words.txt>words.txt
          node index.js <words.txt

          для удаленного файла.

          Считывание:
          var stdin = process.openStdin();
          var result=[];
          var t="";
          var word=«aaa»;

          stdin.addListener(«data», function(d) {
          t+=d.toString();
          });
          stdin.addListener(«end», function(d) {
          result=t.split('\n');
          var a=result.findIndex((x)=>x.toLowerCase()===word)===-1;
          console.log('Result: ', a);
          });


      1. romy4
        27.04.2016 18:51
        -2

        Ок, а где брать словарь? Реализовывать http (ну хоть сокеты доступны)?


        1. dottedmag
          27.04.2016 18:53
          +2

          Нет, сокеты недоступны.


        1. feldgendler
          27.04.2016 18:53
          +3

          Сокеты без require тоже недоступны. Надо угадывать, похоже слово на английское или нет.


          1. romy4
            27.04.2016 19:01
            -4

            написано, что модули нельзя загружать, но не написано, что нельзя загружать словарь по урлу, если я правильно понял. — верно?


            1. BuriK666
              27.04.2016 19:02
              +5

              чтоб загрузить словарь нужен модуль http ну или tcp.


  1. VovanZ
    27.04.2016 18:53
    +4

    Вы статью читали?

    > Казалось бы, это просто — нужно только проверить, встречается ли строка в словаре — если бы не ограничение на размер решения в 64 КиБ.

    Файл размером 6+ МБ. С собой тащить все данные не получится.

    > Нельзя загружать никаких модулей, даже тех, что входят в стандартный комплект Node.js.

    Загрузить их откуда-то тоже не получится (ну а как это сделать без модуля http?), да и это явно противоречит духу правил.


    1. romy4
      27.04.2016 19:00
      -9

      написано, что модули нельзя загружать, но не написано, что нельзя загружать словарь по урлу, если я правильно понял.


      1. feldgendler
        27.04.2016 19:03
        +1

        А как Вы загрузите словарь по урлу?


        1. romy4
          27.04.2016 19:03
          -6

          Всё очень зависит от накладываемых ограничений и ОС.


          1. feldgendler
            27.04.2016 19:05
            +1

            Покажите пример хотя бы для какой-нибудь одной ОС.


            1. romy4
              27.04.2016 19:11
              -7

              Не хочу, чтобы это наталкивало на какие-то мысли :)


              1. feldgendler
                27.04.2016 19:19
                +6

                Мы всё равно дисквалифицируем всех, кто придумает, как обмануть тестовую систему.


                1. Jamdaze
                  27.04.2016 22:06
                  +1

                  А может лучше за это премию дать?


                  1. feldgendler
                    27.04.2016 22:07
                    +7

                    Одно другому не мешает. Мы вполне можем дать премию за оригинальный подход, и при этом дисквалифицировать из основного зачёта.


      1. VovanZ
        28.04.2016 00:19
        +1

        Как ни странно, соглашусь. Вроде как, это очевидно по «духу» правил, но явно не упомянуто.
        feldgendler, я думаю, стоит в явном виде написать, что нельзя работать с сетью и файловой системой (если вы почитаете правила ACM и подобных соревнований — там это явно написано).


        1. dottedmag
          28.04.2016 00:59

          В ICPC нет запрета на использование стандартных библиотек.


          1. VovanZ
            28.04.2016 01:22

            Да, но тут вопрос в том, что считать стандартной библиотекой js.
            Можно ли считать модули, входящие в поставку node стандартной библиотекой JS (не node)? В браузере то их нет :)
            Так что вопрос неочевидный…


            1. feldgendler
              28.04.2016 03:13
              +3

              «Нельзя загружать никаких модулей, даже тех, что входят в стандартный комплект Node.js».


  1. romy4
    27.04.2016 19:02

    И ещё хотел спросить, на какой ОС (семействе ОС) будет тестирование?


    1. feldgendler
      27.04.2016 19:04

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


      1. romy4
        27.04.2016 19:09
        -3

        Раз нельзя загружать стандартные модули, то значит можно пользоваться тем, что уже загружено в глобальном пространстве. Из этого можно что-то состряпать.


        1. feldgendler
          27.04.2016 19:18
          +2

          Желаю удачи. Как сказал выше dottedmag, успешное решение такого типа тянет на специальный приз. Имейте в виду, что обходной способ загрузить какой-либо модуль без использования require запрещён так же, как и require.

          Задача, тем не менее, не об этом.


          1. dom1n1k
            27.04.2016 19:19
            +1

            Да отрубите тестовую машину от интернета, да и делов.


          1. romy4
            27.04.2016 19:39

            Я не собираюсь загружать node модули.


  1. dom1n1k
    27.04.2016 19:15

    Ну как отфильтровать действительно случайные последовательности — более-менее понятно.
    А вот как бороться с «почти словами» с 1-2 опечатками — пока даже идей никаких нет.


    1. feldgendler
      27.04.2016 19:21
      +1

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


  1. mihmig
    27.04.2016 19:30
    +1

    А будет только победитель или можно будет посмотреть на каком месте моё решение?


    1. dottedmag
      27.04.2016 19:33
      +3

      Будет таблица результатов для всех участников.


  1. expolit
    27.04.2016 19:41
    +3

    1. Я правильно понимаю, что задача сводится к написанию алгоритма который сможет ответить есть ли данная последовательность символов в предоставленном словаре, без учета регистра, пробелов или спец символов, т.е. только [a-zA-Z\-]?

    2. Я правильно понимаю, Что даже если слово правильное и английское, но его нету в словаре который предоставили — оно считать, что слово не английское?


    1. dottedmag
      27.04.2016 19:57

      Да и да.

      В test будут подаваться только слова вида [a-zA-Z'-]+, не нужно отфильтровывать пробелы и спецсимволы.


      1. expolit
        27.04.2016 20:08
        +1

        Спасибо вам за: https://simple.wikipedia.org/wiki/Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch

        3. Т.е. я правильно понимаю то что регистр слов не важен?
        4. Там есть все буквы английского словаря как слова с одной буквой. Это тоже считаем что это слово? Например «Z»?


        1. dottedmag
          27.04.2016 20:13
          +1

          Ответы на это написаны в условии.


          1. expolit
            27.04.2016 20:14
            -2

            Т.е. я правильно понимаю что ответы да и да?


            1. dottedmag
              27.04.2016 20:15
              +1

              Да.


      1. OLS
        27.04.2016 22:09

        Зачем подавать в тестах слова с дефисом, если в словаре нет ни одного слова с дефисом?


        1. feldgendler
          27.04.2016 22:19
          +2

          Это была ошибка в условии, исправлено. Дефисов не будет.


  1. vitvad
    27.04.2016 19:58
    +14

    … дающая наибольший процент правильных ответов.

    а вдруг повезет
    function main(){
      return Math.random() > 0.5
    }
    
    module.exports = {
      init: function(data){
        // м-м-м бинарничек
        console.log('бдыщь')
      },
      test: main
    }
    
    

    не, ну а че б и нет? :)


    1. dottedmag
      27.04.2016 20:13
      +2

      50% — это baseline, да.


      1. vitvad
        27.04.2016 21:03

        почти

        Math.random
        var n = 1000000;
        new Array(n).join('1').split('').reduce(function(memo){
          memo += new Array(100).join('1').split('').map(function(){ return Math.random() > 0.5;}).filter(function(item){ return item;}).length / 100;
          return memo;
        }, 0) / n;
        // 0.4949049399999358
        


        1. NeXTs_od
          27.04.2016 21:18
          +1

          потому что

          map calls a provided callback function once for each element in an array, in order, and constructs a new array from the results. callback is invoked only for indexes of the array which have assigned values; it is not invoked for indexes which have been deleted or which have never been assigned values.
          © mdc


          1. vitvad
            27.04.2016 21:20

            да спасибо уже нашел

            callbackfn should be a function that accepts three arguments. map calls callbackfn once for each element in the array, in ascending order, and constructs a new Array from the results. callbackfn is called only for elements of the array which actually exist; it is not called for missing elements of the array.

            http://www.ecma-international.org/ecma-262/6.0/index.html#sec-array.prototype.map


        1. fend
          28.04.2016 03:14

          Array.from(new Array(10))

          Array.from(new Array(10)).map((el, ind) => el = ind+1)
          // [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]


          1. rock
            28.04.2016 12:13

            Зачем извращаться, при том через протокол итераторов, если есть


            Array(10).fill()

            ?


            Учите стандартную библиотеку языка.


      1. Mr_Destiny
        28.04.2016 13:13

        Простите за оффтоп,

        Боюсь на сто тестов статистики не хватит чтобы набить 50%.

        Тем более что мы имеем две вероятности — того тест в словаре, и того что рандом выдаст >0.5. Поправьте если ошибаюсь, но тогда baseline 25% при условии случайного выбора «слово» — «не слово» для теста.


        1. feldgendler
          28.04.2016 13:14

          Программа, всегда возвращающая false, наберёт 50%. Чтобы сделать хуже, чем 50%, нужно специально постараться.


          1. Mr_Destiny
            28.04.2016 13:32

            Да, Вы совершенно правы.
            Впрочем, человек в начале треда постарался и сделал 25% с рандомом :)

            Интересно, сколько будет подано решений с return false — return true?


            1. vintage
              28.04.2016 13:37
              +1

              50% он сделал. Не усложняйте рассуждения сверх меры :-)


              1. Mr_Destiny
                28.04.2016 13:49

                А, я забыл добавить совпадения типа «нет в словаре» — «нет в словре». Тогда получаем 50%

                Надо придумать простое решение которое будет давать меньше 50% и получить приз за spectacular failure.


                1. degorov
                  28.04.2016 13:53

                  Взять нормальное решение и добавить инверсию… Хотя это уже не очень простое получается.


                  1. Mr_Destiny
                    28.04.2016 13:55
                    +2

                    Да, именно что «не очень простое».

                    Хотя, если получится простое ошибочное, можно к нему добавить инверсию иии… PROFIT!


    1. heart
      28.04.2016 12:12
      +1

      «Вы дисквалифицированы»


      1. feldgendler
        28.04.2016 12:15
        +3

        Примечание: это не официальное заявление организаторов конкурса.


  1. dkukushkin
    27.04.2016 20:13
    +2

    Данная задача чисто алгоритмическая — без привязки к конкретному языку реализации алгоритма. Т.е. уровень знания языка она не отражает. Причем для JS — эта задача нетипичная, язык заточен под другие вещи.

    Имх., для поиска специалистов именно на JS — не совсем удачная постановка.


    1. dottedmag
      27.04.2016 20:16
      +8

      Эта задача – для поиска программистов, а не «специалистов на JS».


      1. dkukushkin
        28.04.2016 00:04
        -2

        Тогда зачем привязали к конкретному языку? Если иметь алгоритм — то его можно легко воплотить на любом языке, даже если ты с этим языком ранее не работал. Это касается именно этой задачи.

        На практике для большинства проектов нужны кодеры. И нечего стесняться. Кодер — этот тот человек, который сможет качественно написать код по имеющемуся алгоритму. На самом деле кодерство — не такая уж простая задача, как некоторые думают.


        1. feldgendler
          28.04.2016 00:18
          +6

          К конкретному языку привязали затем, чтобы тестировать всё одной тестовой системой с одним API.


  1. expolit
    27.04.2016 20:17
    +1

    Есть ли какие то ограничения по памяти? по времени исполнения?

    Т.е. если я напишу магический алгоритм, который генерирует этот словарь в переменную, но в итоге он скушает 1GB и займет 100 секунд. Это будет противоречить правилам?


    1. dottedmag
      27.04.2016 20:22
      +5

      Гигабайт и 100 секунд – не противоречит. 10 гигабайт и 1000 секунд – тоже не противоречит. Терабайт и неделя – отказать.


      1. thewizardplusplus
        27.04.2016 21:14

        Вроде бы в правилах данные ограничения не указаны. Стоило бы указать, чисто для проформы. Чтобы как в прошлый раз никто не придрался к вам с претензиями, что его решение несправедливо дисквалифицированно.


        Ведь можно, например, найти весь словарь в числе пи, в программе указать лишь смещение, затем в init() рассчитать пи с нужной тончностью и получить 100% надёжность теста. А потом возмущаться, что вы недождались завершения работы init() и отдали приз другому.


        1. Imp5
          27.04.2016 21:19
          +9

          Смещение займёт больше, чем словарь.


          1. Arhont375
            28.04.2016 11:30

            Можно рассчитать смещение смещения и так до тех пор, пока не уложится в ограничения


            1. feldgendler
              28.04.2016 11:30
              +1

              Смещение смещения займёт больше, чем смещение, и так далее.


              1. napa3um
                28.04.2016 11:53
                +1

                К тому же велика вероятность, что при переборе смещений наступит тепловая смерть вселенной.


      1. feldgendler
        27.04.2016 22:10
        +1

        Десять гигабайт тоже нельзя, настройки V8 по умолчанию — куча 2 GB.


  1. OLS
    27.04.2016 21:48
    +3

    Как участник предыдущего конкурса, большинство из нововведений решительно одобряю. Появился и определенный детерминизм и возможность предварительно тестировать решение. Единственное, мне кажется, что размер блока в 100 слов несколько маловат — в ходе разработки похоже придется запрашивать десятки блоков для реальной оценки незначительных улучшений в коде.


    1. feldgendler
      27.04.2016 22:10

      Запросите себе один раз достаточно много блоков и используйте их для тестирования всех своих вариантов.


  1. Zavtramen
    27.04.2016 21:56
    +1

    Что есть 64 КиБ? Первый раз вижу такую аббревиатуру. Вики подсказывает, что это кибибайты и на деле это означает 64000 байт, мне кажется проще именно так и указать в задаче.


    1. napa3um
      27.04.2016 22:07
      +6

      Кило — множитель 1000, киби — множитель 1024.


      1. Zavtramen
        27.04.2016 22:11

        Ох, совсем старый стал, даже в википедию не могу посмотреть нормально )
        Тем более стоило просто указать просто кол-во байт.


      1. SkyHunter
        28.04.2016 15:56

        Однако, здравствуйте. Всю жизнь «килобайт» означал 1024 байта. А кто полагал иначе — считался ламером.


        1. napa3um
          28.04.2016 15:59
          +3

          Приставки были введены Международной электротехнической комиссией (МЭК) в марте 1999 года. После 1999 года ламеры и эксперты по приставкам поменялись местами.

          https://ru.wikipedia.org/wiki/Двоичные_приставки
          https://habrahabr.ru/post/193256/


    1. feldgendler
      27.04.2016 22:11
      +1

      1 кибибайт = 1024 байта. Дурацкое сокращение КиБ использовано только по той причине, что отличие от десятичного килобайта здесь важно.


      1. Zavtramen
        27.04.2016 22:18
        +3

        Мне кажется лучше указать конкретное число, в данном случае 65536 байт. Оно вполне узнаваемо программистами.


  1. OLS
    27.04.2016 22:08

    А членство точно регистронезависимое? Непонятно, зачем тогда словарь подается на вход в регистрах…


    1. feldgendler
      27.04.2016 22:18

      Просто это словарь из стороннего источника. Вот он у них такой.


  1. Spiritschaser
    27.04.2016 22:12
    -1

    > Едва ли возможно написать программу, которая укладывалась бы в ограничение и всегда давала бы верные ответы.
    Ну на JavaScript да.


    1. feldgendler
      27.04.2016 22:12
      +4

      Скорее всего, ни на чём нельзя.


      1. Zavtramen
        27.04.2016 22:19

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


        1. feldgendler
          27.04.2016 22:20
          +5

          Или там будет команда «решить эту задачу».


      1. Spiritschaser
        27.04.2016 23:35
        -1

        Для этих целей был придуман Perl. Не факт, что получится, но код будет существенно компактнее.


        1. pro_co_ru
          29.04.2016 11:11
          +2

          Факт, что не получится.
          Исходный файл со словами занимает 6906809 Байт, а требуется ужать всё вместе с кодом до 65535, т.е. чуть более чем в 100 раз.
          Что-то мне не верится что из менее чем 1% знаний о исходном наборе данных можно восстановить гарантированно все 100%, какой бы при этом язык не был использован.


          1. Spiritschaser
            29.04.2016 11:16
            -6

            Задача конкурса — выработать алгоритм классификации выборки приложенного словаря с последующим отнесением слов к словарю или не-словарю. Ещё раз повторю, что для таких вещей статистические либы на C и перл подходят больше.
            Не, если упиться смузи, можно мокап на JS сразу лепить, потом отладить.


  1. zhaparoff
    27.04.2016 22:12
    +4

    Допускается ли использование каких-либо open-source библиотек при условии что их код будет включен в файл решения и общий размер будет удовлетворять ограничению в 64КиБ?


    1. feldgendler
      27.04.2016 22:12
      +2

      Да, если это позволяет их лицензия.


  1. pallada92
    27.04.2016 22:12
    +2

    На данный момент ни в словаре, ни в тестах, символ "-" не встречается. Может так случится, что данные потом поменяются?


    1. feldgendler
      27.04.2016 22:14

      Спасибо, Вы нашли ошибку в условии задачи! Убрал упоминание символа -.


      1. OLS
        27.04.2016 23:03
        +1

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


        1. feldgendler
          27.04.2016 23:10

          Правильно.


  1. Temtaime
    27.04.2016 22:16
    +1

    Можно ли отправить несколько решений?


    1. feldgendler
      27.04.2016 22:17

      Учитывается только последнее решение, отправленное каждым участником. Если у Вас есть несколько вариантов, Вы сами можете протестировать их с помощью генератора тестов и определить, какой лучше.


      1. Temtaime
        27.04.2016 22:37

        А что насчёт символа "-"? Я не нашёл его в words.txt — можно ли все слова с ним считать неправильными?
        UPD — надо обновлять страницу :(


        1. feldgendler
          27.04.2016 23:09

          Это была ошибка в условии. Убрали из условия упоминание этого символа, в тестах его не будет.


  1. abyss101
    27.04.2016 22:17

    Решения типа прошерстить все доступные ресурсы (файловая систем, интернет, итд) на предмет слов/текстов в принципе могут быть приняты? Или это гарантированная дисквалификация?


    1. feldgendler
      27.04.2016 22:18

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


  1. vird
    27.04.2016 23:30
    +1

    отличает слова английского языка


    tsktsk
    stddmp
    bkbndr
    Очень замечательные слова.

    weltschmerzes
    Очень английское


    1. vird
      27.04.2016 23:35
      +1

      Еще перлы
      llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch
      llanfairpwllgwyngyll


      1. orgkhnargh
        28.04.2016 00:40
        +2

        Это названия деревни в Британии.


      1. feldgendler
        28.04.2016 01:01
        +5


    1. feldgendler
      28.04.2016 00:59
      +1

      Да, в этом словаре много дикостей, в том числе аббревиатуры. Тем не менее, по определению в этой задаче английское слово — это слово из этого списка.


      1. valanchik
        29.04.2016 14:06

        Тогда тот кто первый обучит нейронную сеть на этом словаре и умудрится поместить результат её обучения в 64Кб(gzip) — тот и молодца!


  1. vintage
    27.04.2016 23:49
    +1

    Как генерируются тестовые примеры? Поровну и тех и тех? Для каждого пункта с равной вероятностью выбирается взять слово из словаря или сгенерировать рандом? Или как ещё?


    1. feldgendler
      28.04.2016 00:16

      Слов и не-слов примерно поровну, но среди не-слов бывают разные. Есть целый диапазон похожести на английские.


      1. expolit
        28.04.2016 10:49

        Т.е. return false даст 50% успеха?


        1. feldgendler
          28.04.2016 11:05
          +1

          Да.


  1. datacompboy
    28.04.2016 00:39

    А словарь в 64k не упаковывается, случаем?


    1. feldgendler
      28.04.2016 00:50
      +4

      Я не думаю, что это возможно, но если окажется возможно, то тот, кому это удастся, достоин награды.


    1. 4orever
      28.04.2016 05:34

      Ну мне удалось его в 100КиБ впихнуть. Еще есть, куда оптимизировать, но не уверен, что до 64 ужать получится :)
      К тому же это после gzip, а его реализация тоже потребует памяти.


      1. vk2
        28.04.2016 09:04
        +3

        «Вы также можете указать, что Ваш файл данных сжат с помощью gzip. Если Вы отметите соответствующую опцию в форме отправки решения, то содержимое файла данных будет обработано функцией zlib.gunzipSync перед тем, как попасть в функцию init. Этот вариант удобен тем, что Вам не нужно ни внедрять в код на JS двоичные данные, ни писать самостоятельно стандартный алгоритм распаковки. При этом, конечно, ограничение по размеру касается сжатых данных; после распаковки их размер вполне может превысить 64 КиБ»


        1. sslobodyanyuk
          28.04.2016 15:00

          > … дающая наибольший процент правильных ответов

          ну, в таком случае, можно упаковать часть словаря :)


          1. OLS
            28.04.2016 20:48

            И это было бы замечательно (и более того — в реальном мире даже сработает !), если бы генерация тестовых выборок у организаторов конкурса использовала частотный словарь, т.е. генерировала реальные слова пропорционально их появлению в реальном мире. А при равномерном использовании шанс получить на входе теста «Hello» и «Actinomycetaceae» равен, что делает Вашу идею не очень перспективной.


      1. wizzard0
        02.05.2016 15:59

        100 это сурово. а сколько процентов success rate выходит, если выкинуть часть словаря?


      1. Spiceman
        05.05.2016 13:15
        +1

        Ну мне удалось его в 100КиБ впихнуть.

        Как? У меня 820КиБ, хоть ты тресни.
        Хотя, есть идея как сжать сильнее, но время распаковки O(n!) и будет длиться до конца жизни вселенной.


        1. haldagan
          05.05.2016 15:45
          +1

          Судя по всему товарищ просто ошибся — либо у него выходит 1МБ с копейками (ошибся на порядок), либо он имеет в виду размер фильтра блума (это для ~50% false-positive), либо он упаковывал с потерями. А так — да, с gzip'ом 100% утрамбовываются примерно в 820-860 КиБ.

          Тут ниже есть комментарий о возможности упаковки «где-то в 300 Кб-1 Мб смотря как упаковывать.» — но я постеснялся спрашивать, как была получена первая цифра.


          1. haldagan
            05.05.2016 16:27

            Зря я, наверное, так категорично усомнился в способностях незнакомого человека. Посему заранее прошу прощения и вопрошаю 4orever: А действительно ли Вы упаковали словарь в 100 КиБ без потерь И требует ли алгоритм распаковки существенного количество байт на реализацию? Если требуется более одного-двух кибибайт в обфусцированном виде, то, думаю, стоит включить эту цифру в общий размер словаря.


            1. 4orever
              06.05.2016 01:00

              Как написал чуть ниже — ошибся конечно. Я экспериментировал с префиксным деревом (тогда я еще не знал о том, как оно называется) + свой наскоро состряпанный формат сохранения в текст, а дальше gzip. Современные архиваторы достаточно умны, чтобы абстрагировавшись от содержимого выдать наилучший результат. Попробовал кое-что нагородить дополнительно, но особой экономии это не дало.


          1. Spiceman
            05.05.2016 18:20
            +2

            А так — да, с gzip'ом 100% утрамбовываются примерно в 820-860 КиБ.

            Какая-то фантастика. Почитаешь комментарии и думаешь, что я тут вообще делаю. Мне чтоб в 820 упаковать пришлось еще некоторую предобработку словаря сделать. И то сжимал winrar-ом. gzip-ом только 920 получается. Как вы это делаете? И что я тут делаю?


            1. haldagan
              05.05.2016 19:35
              -1

              >пришлось еще некоторую предобработку словаря сделать

              Разумеется я указал размер после «предобработки» и gzip'a, а не просто ужатого gzip'ом словаря. Имелось в виду, что словарь и после обработки содержит 100% информации о словах (т.е. не укорочен/не испорчен блумом/машинным обучением / etc).


            1. quverty
              06.05.2016 18:26

              WinRAR-ом? У меня после предобработки и gz тоже что-то похожее получилось по размеру, но я ещё и 7z попробовал — получилась типа 730 КиБ. Правда непонятно как это может помочь.


        1. 4orever
          06.05.2016 00:54

          Да-да, расслабьтесь :) Как написали выше — ошибся, нечего по ночам такими вещами заниматься :)
          100Кб было частичное префиксное дерево.
          P.S. ДУмал, что удалил тот коммент.


    1. datacompboy
      28.04.2016 22:27

      $ ./test.coffee
      97193/97193 (100.00%)
      fn = 0
      fp = 0

      вот только нет, не упаковывается.


      1. dottedmag
        01.05.2016 00:32

        А какого размера-то test.coffee?


        1. vird
          01.05.2016 03:07

          См. выше по комментариям.
          https://gist.github.com/vird/453a86cf16903c017b060cdd457baf86
          Это просто верификатор. 100% выходит где-то в 300 Кб-1 Мб смотря как упаковывать.


        1. datacompboy
          01.05.2016 12:28

          vird правильно говорит. мне пока удалось в чуть-чуть меньше метра утрамбовать, есть еще возможности ужаться раза в два, но не больше.
          в 64к не влезает даже арифметическим кодированием.


  1. Turbo
    28.04.2016 02:03
    +1

    А вы имеете отношение к организаторам конкурса? У меня предложение. В файле words.txt чуть больше 660К слов. А вы можете сгенерировать файлик схожего размера «words_fail.txt» с неправильными словами? Что бы не насиловать онлайн генератор зазря. )


    1. feldgendler
      28.04.2016 03:15
      +3

      Я и есть ответственный за проведение конкурса.

      Насилуйте генератор на здоровье.


      1. Turbo
        28.04.2016 10:44

        А зачем? То есть какой в этом смысл? Сейчас придется писать доп. код, который будет получать слова, потом выкидывать оттуда правильные, а ещё судя по тексту и забанить за нагрузку могут…


        1. degorov
          28.04.2016 10:51
          +1

          Я 100К слов выкачал в 1 поток минут за 15 и всё. Я не думаю, что мои действия хоть сколько-нибудь нагрузили сервер :)


        1. feldgendler
          28.04.2016 11:08

          За нагрузку не забаним. Просто можем иногда отвечать «Rate limit exceeded» вместо результата, тогда надо чуть подождать и повторить запрос.


    1. maxceem
      28.04.2016 04:20

      Мне тоже было бы интересно получить такой файлик.


      1. feldgendler
        28.04.2016 11:11

        Уважаемые участники, мы предоставили Вам достаточно информации. Чтобы получить её в других форматах, которые вам удобнее, — преобразуйте, пожалуйста, сами.


    1. vird
      28.04.2016 15:16
      +1

      Используйте на здоровье

      for (i = _i = 0; _i < 1000; i = _i += 1) {
        console.log("https://hola.org/challenges/word_classifier/testcase/" + i);
      }
      

      node script.js > list
      mkdir solution_list
      cd solution_list
      wget -i ../list

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


  1. 4orever
    28.04.2016 04:11

    При первом подходе 68%. Еще есть идеи, как улучшить :)


    1. vird
      28.04.2016 08:14

      Gratz.
      Мое на 100k sample'ов только 62.67%.


      1. vird
        28.04.2016 09:30
        +3

        70.37% 51200 байт

        Очень жаль, что нету live leaderboard'а.


        1. xytop
          28.04.2016 19:53

          У меня 76.3%, но я еще не оптимизировал толком…


          1. Don_Eric
            01.05.2016 10:46

            84%


            1. Imp5
              01.05.2016 12:28
              +3

              Это на какой по размеру выборке?


  1. Don_Eric
    28.04.2016 09:20
    +3

    задача кажется чисто математической. Просто подобрать параметры к bloom filter


    1. Imp5
      28.04.2016 11:04

      Ну вот, оказалось, что я только что изобрёл bloom filter.


      1. vintage
        28.04.2016 11:18
        +2

        1. SabMakc
          03.05.2016 17:18

          Всем хороша статья. Ей бы еще реализацию корректную…
          Возможно, отрицательные результаты хеш-функции — не очень большая проблема.
          То, что JS прекрасно работает с отрицательными индексами — тоже не проблема (как известно, JS и правду умножит и ложь поделит).
          А вот то, что в результате фильтр Блума использует в два раза больший объем памяти — уже проблема…

          P.S. эх, а только 85% правильных ответов достиг…


          1. vintage
            03.05.2016 17:50
            +1

            В 2 раза больший по сравнению с чем?


            На какой выборке? У меня всего 78 на миллионе. С починенным блюмом и парой эвристик.


            1. SabMakc
              03.05.2016 18:32

              Реализация из статьи использует удвоенный объем памяти относительно того, что было задано при инициализации. С этой реализацией у меня 85% было на миллионе тестовых слов. И да, есть дополнительная обработка слов.


              1. vintage
                03.05.2016 18:41
                +1

                Речь об отрицательных хеш-суммах? Ну так они и сохранение в файл не переживают :-) Так что по любому надо заменять на сложение по модулю.


                Чувствую вся разница реализаций будет именно в предобработке слов :-)


                1. SabMakc
                  03.05.2016 19:02

                  Вот я и предупреждаю о некорректной реализации ;) Может кому времени и/или нервов сэкономлю…

                  В принципе, исправляется достаточно легко — берем по модулю или меняем 0xFFFFFFFF на 0x7FFFFFFF (меньше кода).
                  И да, разница в основном будет в доп. обработке слов и в эвристиках.

                  Ну и в подходах к решению — те же нейронные сети не думаю, что стоит сбрасывать со счетов.


          1. Don_Eric
            03.05.2016 18:03

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


    1. yarulan
      28.04.2016 11:31

      Не влезает (если я правильно посчитал). При вероятности ложноположительного срабытывани в 1% размер фильтра составляет (-(661000 * ln(0.01)) / (ln(2) ** 2)) / 8 / 1024 == 773КиБ, 10% — 387КиБ, 50% — 116КиБ.


      1. vintage
        28.04.2016 11:45

        50% ложноположительных даёт 75% правильных ответов, что уже не плохо.


      1. Don_Eric
        28.04.2016 11:46

        да, вы правы
        http://hur.st/bloomfilter?n=660000&p=0.01


    1. Turbo
      28.04.2016 11:58

      Из Вики и статьи:
      https://en.wikipedia.org/wiki/Bloom_filter
      https://habrahabr.ru/post/112069/

      Вероятность ложного срабатывания:


      Оптимальное значение k:


      Что для этой задачи равно:
      k = 65536/660000*ln(2) = 0,09929697*0,69314718 = 0,068827414. То есть оптимум 1.
      p = 1 — e^(-n/m) = 1 — e^10,07080078125 = 1 — 4,2296729941409029988465653752585e-5 = 0,9999577

      То есть вероятность ложного срабатывания 0,9999577. Что в общем очень-очень плохо.

      Поправьте меня если я где-то ошибся в расчетах.



      1. Turbo
        28.04.2016 12:05

        Забыл перевести байты в биты.
        p = 1 — e^(-660000/524288) = 1 — e^(-1,25885009765625) = 1 — 0,28398039 = 0,7160196

        Результат лучше, но все равно не очень хороший.


        1. Don_Eric
          28.04.2016 12:13

          да, получается что общий результат будет 50% + 0.28*50% = 64%
          можно его увеличить если добавить юристику — заранее отсеивать шум по грамматическим правилам (типа 5 согласных подряд)


          1. dottedmag
            28.04.2016 12:16
            +1

            Эвристики начнут отъедать место, оставшееся для блум-фильтра :)


          1. Turbo
            28.04.2016 12:17

            Каждое правило уменьшает длину фильтра.

            Но вообще там в правилах написано что текстовый файл с дополнительными данными можно архивировать. Дальше все зависит от того насколько хорошо сожмется файлик с фильтром. )


      1. Don_Eric
        28.04.2016 12:08

        .


  1. vitalybogryashov
    28.04.2016 10:56
    +1

    Откуда будут браться неправильные слова? специально искривляться или генерироваться или из другого справочника, например другого языка? Больше вопрос такого плана — не будут ли специально подбираться максимально похожие слова для снижения эффективности скрипта?


    1. feldgendler
      28.04.2016 10:58

      Алгоритм генерации не-слов мы раскроем только при подведении итогов конкурса. Как нетрудно видеть сейчас из генерируемых тестов, не-слова генерируются с различной степенью сходства с настоящими, от шума до слов, которые выглядят настолько «родными», что даже понятны носителю языка.


      1. ainoneko
        28.04.2016 13:10

        Некоторые даже настолько понятны, что уже используются (как упоминаемое в условии «sonicative»). ^_^


        1. feldgendler
          28.04.2016 13:10

          Я видел среди генерированных не-слов «defenestrationalism».


  1. vistoyn
    28.04.2016 10:58

    Я правильно понял?
    вес файла архива с помощью gzip + js файла должен быть не больше 64 КиБ.
    а файл в распакованном виде может быть больше чем 64 КиБ.


    1. feldgendler
      28.04.2016 10:58

      Верно.


  1. slnpacifist
    28.04.2016 10:59
    +1

    feldgendler, Добавьте, пожалуйста, форму для проверки решения, чтобы можно было убедиться, что решение точно удовлетворяет требованияем. Например, чтобы проверятор запускал решение на 1 блоке и рапортовал ошибки, возникшие при этом (слишком большой размер файлов, не удалось разжать приложенный файл и т.п.)


    1. feldgendler
      28.04.2016 11:00

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


      1. slnpacifist
        29.04.2016 15:10

        К сожалению, меня не так поняли.
        Я прошу не интерфейс для тестирования, а доступ к тестирующему серверу. Например, в спортивном программировании перед соревнованием проводится пробный тур. На нем участники проверяют, что тестирующая среда ведет себя так, как они предполагают. А в соревнованиях topcoder есть возможность проверить свое решение на тестах из условия задачи.
        Возможность проверить свое решение в реальной тестирующей среде, пусть и с дикими ограничениями, помогла бы избежать самой главной ошибки прошлого hola challenge.


        1. feldgendler
          29.04.2016 15:31
          +1

          Что такое «доступ к тестирующему серверу»? Вы шелл туда хотите, что ли?


          1. Imp5
            29.04.2016 15:44

            Думаю, достаточно простого запуска выполнения на двух тестовых словах, одно есть в списке, второго нет (хотя бы «a» и «zzzz»).
            Для того, чтобы убедиться, что файл нормально распаковался и модуль загрузился без ошибок.


            1. feldgendler
              29.04.2016 15:49
              +2

              var mod = require('your-program.js');
              var data = fs.readFileSync('your-data.gz'); // optional
              data = zlib.gunzipSync(data); // optional
              if (mod.init)
                  mod.init(data);
              console.log('a:', mod.test('a'));
              console.log('zzz:', mod.test('zzzz'));
              


              1. Antelle
                29.04.2016 22:31
                +4

                Скорее всего, говорят о возможности попробовать запустить в окружении. Например new Int32Array(buffer) будет вести себя по-разному в зависимости от endianness операционки. Или кодировка регекспов. В принципе это надо знать и так и при написании модуля учитывать, но тем не менее такие ошибки весьма досадные, поэтому идея загрузить, автоматически попробовать и добавить в табличку результатов — идея здравая, так часто делают.


                1. feldgendler
                  29.04.2016 22:57

                  Linux, x86-64.


    1. vird
      28.04.2016 15:23
      +7

      https://gist.github.com/vird/453a86cf16903c017b060cdd457baf86
      Пользуйтесь.
      Решение должно лежать в solution.js
      Проверочные данные в validation.json
      Сжатый словарь в serialize.gz


      1. feldgendler
        28.04.2016 15:34

        Примерно так и будет работать наша тестовая система, в общих чертах.


  1. ivan19631224
    28.04.2016 11:00

    > Мы ожидаем, что многие решения будут содержать генерированный, минифицированый, сжатый код или данные, и поэтому просим отправить нам также и исходники решения
    Вопрос: это пожелание или требование? Иными словами, будут ли рассматриваться решения, которые минифицированы/обфусцированы (или, например, скомпилированны из другого языка в javascript) без предоставления исходников? Если это требование, то, я считаю, это следует прописать в правилах более чётко.
    Если это требование, то вот ещё более тонкий момент: если я, например, сделал и обучил нейронную сеть, которая решает задачу, обязан ли я описывать топологию сети, а так же предоставлять алгоритм обучения и наборы данных, которые я использовал?


    1. feldgendler
      28.04.2016 11:05
      +3

      По поводу нейронной сети: именно этого мы и ожидаем, да. Это самое интересное. Словами описывать не обязательно, но надо приложить обучающую программу и данные.

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


  1. Lonsdaleite
    28.04.2016 11:54
    +1

    Я считаю, что мой английский не очень плох (фильмы-книги понимаю в основном). Но вот дайте мне сотню рандомных слов из этого words.txt, и я этот тест завалю, потому что мой словарный запас ограничен. А тут надо программу научить…

    Вопрос: вдвоем можно участвовать? Приз потом пополам поделить.


    1. feldgendler
      28.04.2016 11:55
      +2

      Я Вас уверяю, носители английского языка сказали бы то же самое.

      Можно.


  1. haldagan
    28.04.2016 12:01
    +1

    >Если Вы отправите кому-то ссылку на этот конкурс, поставив наш адрес в CC, и этот человек займёт призовое место, Вы получите половину суммы приза (разумеется, не в ущерб награде победителя)

    Уж простите за вопрос, но правильно ли я понимаю, что существует возможность «перекрестного» приглашения? Обычно в таких случаях «приглашающего» заставляют сначала зарегистрироваться самому, а уж потом приглашать друзей с реферальным кодом.


    1. feldgendler
      28.04.2016 12:04

      Мы хотели сделать так, чтобы приглашать могли люди, не собирающиеся участвовать сами. Злоупотребления отфильтруем вручную.


      1. haldagan
        28.04.2016 12:16
        +1

        Не сочтите за занудство, но подобное обычно в правилах прописывается изначально, именно для того, чтобы действия наподобие

        > Злоупотребления отфильтруем вручную.

        Не вызывали негатива и вопросов в духе «а как вы фильтровали?», «а я все по правилам делал, за что?» и т.д.


        1. feldgendler
          28.04.2016 12:19
          +1

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


  1. FlashManiac
    28.04.2016 12:30

    Всем добрый день!

    Как я понимаю метод init(data) запускается один раз и дальше запускается только test(word) много много раз? Или же на каждую сотню-блок — все по новой? Сколько будет минимально блоков?


    1. dottedmag
      28.04.2016 12:33
      +1

      init запускается один раз, test запускается много раз.

      Зачем вам знать, сколько будет блоков? Производительность в этой задаче неважна.


      1. FlashManiac
        28.04.2016 12:38

        Спасибо! Пока просто изучаю данные )


  1. Don_Eric
    28.04.2016 12:31

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

    а если построить структуру типа trie tree, где каждый узел это буквы алфавита и бит, если это слово в словаре. Вероятность принадлежности слова определять как глубину в этом дереве


    1. dottedmag
      28.04.2016 12:34

      А сколько места займёт сериализованное trie?


      1. Don_Eric
        28.04.2016 12:39

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


      1. Don_Eric
        05.05.2016 19:46
        +1

        Trie дерево, которое вместит в себя 75% слов, содержит 1 миллион дуг. В 64Кб вряд ли влезет :/


        1. 4orever
          06.05.2016 01:24

          Остается заставить программу по тестовой выборке подобрать оптимальное дерево на 64К, которое даст наибольший процент :)


        1. 4orever
          06.05.2016 01:27
          +1

          Только сдается мне, что мы решим не практическую задачу «отсекать несловарные слова», а просто подберем алгоритм, который лучше обманет другой алгоритм, генерирующий псевдослучайные слова.


          1. OLS
            06.05.2016 08:11

            Мне тоже эта задача именно так видится…
            Но это же весьма занимательно!


    1. Don_Eric
      28.04.2016 12:39
      +1

      image


      1. napa3um
        28.04.2016 13:39

        Я начал с префиксного дерева как раз. При прогоне тестов можно в узлах подсчитывать частоту, а потом просто отпилить самые «редкие». Но, судя по всему, вариант не самый оригинальный :).


    1. Don_Eric
      28.04.2016 13:09

      из-за того, что есть очень много повторений в суффиксах и префиксах, то можно создать 2 дерева, одно проверяет слово сначала, другое с конца


      1. napa3um
        28.04.2016 13:53

        Избыточность суффиксов и префиксов эффективно нивелируется gzip-ом (он словарный) без дополнительных телодвижений.


      1. vird
        28.04.2016 16:35

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


    1. Don_Eric
      03.05.2016 19:23

      хм, узнал что это очень похоже на Huffman code


  1. Shedar
    28.04.2016 13:07
    +1

    1. Есть ли ограничения по географии участников?
    2. С учетом того, что проверки после сабмита нет, будет ли дана возможность исправиться, если засабмиченная версия не запустилась или сразу на выход?


    1. feldgendler
      28.04.2016 13:15

      Ограничений нет.

      Мы описали API настолько подробно, что считаем, что каждый, кто умеет читать условие задачи, вполне может его выполнить.


  1. molnij
    28.04.2016 13:11

    Зависит ли от чего-то вес ошибки в итоговой оценке? Ошибочно распознанное как английское и ошибочно распознанное как не-английское будут равноценны? Влияет ли длина слова на это?


    1. feldgendler
      28.04.2016 13:12

      Никаких весов. Ложноположительные и ложноотрицательные результаты имеют одинаковый вес, не зависящий от длины слова.


  1. Rogaven
    28.04.2016 13:14

    Не нашёл информации в условиях конкурса – под какими лицензиями выкладываются присланные работы на ваш гитxаб в конце (например здесь https://github.com/hola/challenge_linked_list/tree/master/submissions). А так же как будут рассматриваться работы, если в них лицензия указана явно?


    1. feldgendler
      28.04.2016 13:17

      Вы можете указывать лицензию сами (включите её в архив исходников), но она не должна препятствовать публикации Вашей работы по окончанию конкурса.


    1. dottedmag
      28.04.2016 13:19

      Мы ничего не делаем с лицензиями. http://choosealicense.com/no-license/


  1. Temirkhan
    28.04.2016 13:59
    -3

    Каждый раз смотрю на конкурсы на python/js и не понимаю(очевидно, виной мой ограниченный кругозор и(ли) непонимание задачи), в чем их сложность? Ради интереса набросал небольшой массив «основополагающих» частей для англоязычных слов и прошелся им в цикле с использованием регулярных выражений. Если это не совсем уж странные слова(например xbybonyjkettjtjzbuqreff), то, вроде, отрабатывает довольно сносно.


    1. dottedmag
      28.04.2016 14:03
      +1

      Насколько сносно, если не секрет?


      1. Temirkhan
        28.04.2016 15:07
        -1

        Скормил проверке весь словарь и обнаружил, что сносно — понятие очень относительное)

        Array
        (
        [0] => 320969 //false
        [1] => 340717 //true
        )

        И все же, для интереса открыл список неопределившихся слов. Он буквально напичкан абракадаброй(xbybonyjkettjtjzbuqreff) именами(Abdullah), латинскими словами и аббревиатурами. Если с латынью и именами можно поступить так же, как с остальным алфавитом, то с аббревиатурами все очень плохо — я понятия не имею, как их систематизировать(разве только регулярку задать с чередующимися согласными)


        1. dottedmag
          28.04.2016 15:22
          +5

          Это только половина задачи. Вторая половина — отсеивать неслова.

          На словаре ваше решение даёт 51.5% правильных ответов, что на 1.5% лучше, чем function(word){ return Math.random()>0.5; }


          1. Temirkhan
            28.04.2016 16:13
            -1

            Не понял… Если из словаря я определил «слова», а остальная часть в подавляющем большинстве является кракозябрами, именами, аббревиатурами, то что остается? «Вычислить погрешность»...?

            На словаре ваше решение даёт 51.5% правильных ответов, что на 1.5% лучше, чем function(word){ return Math.random()>0.5; }


            Некорректно проводить такое сравнение. Хотя бы потому что оставшиеся 48.5% — это не не определившиеся слова, а «не слова» в своем большинстве.


            1. dottedmag
              28.04.2016 16:43

              Тогда какое количество false positives и false negatives?


            1. DrReiz
              28.04.2016 17:44

              Для слов вида overzazazing, что выдаёт?


              1. Temirkhan
                28.04.2016 18:40
                +1

                Там весьма простой прогон. Очевидно, таких ситуаций, он не ожидает)

                http://pastebin.com/atSk6RyH


    1. napa3um
      28.04.2016 14:19
      +1

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


  1. apro
    28.04.2016 14:59

    а может и третью функцию добавите, типа `right_answer(word, answer)`
    будет вызываться после test(word) и давать обратную связь алгоритму, чтобы он доплнительно обучался во время теста?


    1. ComradeAndrew
      28.04.2016 15:04

      Обучите сами. У вас есть все слова которые считаются правильными. И генератор неправильных.


    1. dottedmag
      28.04.2016 15:22
      +2

      Это будет совсем другая задача.


  1. vermilion1
    28.04.2016 16:23

    Мы будем использовать в тестах только ASCII-строки, содержащие латинские буквы нижнего регистра, а также символ ' (апостроф).

    Значит ли это, что из словаря будут исключены аббревиатуры? Аббревиатура в нижнем регистре это уже слово (валидное или нет).


    1. napa3um
      28.04.2016 16:53
      +3

      Это значит, что весь словарь можно привести к нижнему регистру перед обучением своей модели.


      1. n0isy
        28.04.2016 17:35

        Более того, передаётся на проверку слово в нижнем регистре, а не как изначально. Из-за этого трётся доп. информация — является ли это слово «аббревиатурой», либо именем собственным, либо просто «словом».


        1. Temtaime
          28.04.2016 18:05

          Какая разница что это? Просто набор символов. Задание поставлено довольно чётко: проверить вхождение строки в заданный файл.


          1. Don_Eric
            29.04.2016 23:55

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


    1. feldgendler
      28.04.2016 17:35

      Аббревиатуры могут попасться, но они будут приведены к нижнему регистру.


  1. sarytchev
    28.04.2016 17:55
    +2

    1. mwizard
      28.04.2016 18:09
      +1

      «Random English Word Generator using JQuery» — куда прикатился мир…


      1. sarytchev
        28.04.2016 18:42

        никто не мешает убрать его )


  1. sarytchev
    28.04.2016 18:44
    -2

    Что взять за основу для генерации слов?


    1. feldgendler
      28.04.2016 18:45
      +1

      Не понимаю вопрос.


      1. sarytchev
        28.04.2016 18:47
        -2

        на чем логику построить?
        приставка +корень+суф.+окончание или просто наиболее встречаемые в словаре слова(корни) из них генерить.
        Или все это рандомом
        Или как?


        1. feldgendler
          28.04.2016 18:53
          +2

          Вы спрашиваете меня, как решать задачу?


          1. sarytchev
            28.04.2016 18:56
            -4

            подсказку ищу


            1. feldgendler
              28.04.2016 19:01
              +3

              Оставлю без комментариев.


            1. datacompboy
              28.04.2016 19:23
              -2

              Советую попробовать 7мислойный ромбовидный персептрон.


              1. mwizard
                28.04.2016 21:23
                +1

                Да чо уж там, выкладывайте сразу решение.


                1. sarytchev
                  28.04.2016 22:14

                  подарки в студию )


              1. sarytchev
                28.04.2016 22:20

                спасибо меня наверное этому лет 10 учить надо


      1. sarytchev
        28.04.2016 18:51

        https://github.com/sebpearce/gleath/blob/master/main.js


  1. vird
    28.04.2016 21:39
    +4

    Всё-таки очень нужно чтобы можно было проверить рабочий ли submission на конечной машине. Я уже 2 решения отослал с переоптимизацией от closure compiler. Только сейчас заметил когда ужимал мини-решение.

    BTW. Тем временем 60,11% в 683 байта и 82.82% в 62464 байт.
    Теоретически существует решение в как минимум 90%. Возможно, даже есть 95%.


    1. vird
      28.04.2016 23:30

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

      У меня получилось решение, которое на диапазоне сидов 0-1000 работало хорошо, расширил диапазон, упало ниже 65%. Тестовый dataset странный предмет, вроде он есть, но на самом деле он бесконечный.

      Решение откатил. Качаю dataset по-больше.


      1. mwizard
        29.04.2016 00:06
        +3

        А что мешает вам самостоятельно разделить данные на обучающую и тестовую выборки? На сидах 0-1000 учите, на 1000-1500 проверяете.


        1. vird
          29.04.2016 02:14

          Получается немного нечестная ситуация. Я имею одну выборку, а другие участники — другую выборку. И тут смотря как кому повезло. А если есть одна выборка на всех, то тут ни у кого нет особых преимуществ.


          1. feldgendler
            29.04.2016 05:03
            +3

            Все решения мы будем тестировать на одном и том же наборе тестов. Номера блоков мы пока не скажем, кончено.


      1. oleg_chornyi
        29.04.2016 05:01
        +5

        Никто ж не говорит, что это строго задача машинного обучения. Это один из возможных подходов к ее решению.


  1. Joshua
    29.04.2016 11:27
    +1

    Генератор иногда отдает настолько похожие слова что у меня вопрос: вы потом проверяете, что генератор сгенерировал ТОЧНО слово ВНЕ словаря?


    1. feldgendler
      29.04.2016 11:55

      Да, проверяем.


  1. pro_co_ru
    29.04.2016 11:31
    +1

    Странно, что про генетическое программирование народ молчит.
    А ведь в самом топе будет жесточайшая битва, где победит тот кто лучше сбалансирует все свои словари, фичи и прочие признаки, и ужмёт их в 64 КиБ, вместе с исходником.


    1. mwizard
      29.04.2016 11:49
      +8

      Все молчат, чтобы не давать подсказок конкурентам.


      1. sarytchev
        29.04.2016 22:27
        -1

        кришнаиты )


    1. waterlaz
      29.04.2016 20:47
      +6

      Вангую, что в первой тройке не будет ни генетического программирования, ни нейронных сетей с, прости Господи, deep learning.


      1. Don_Eric
        29.04.2016 23:57
        +3

        будут массивы регулярок

        а жаль


        1. dottedmag
          01.05.2016 00:34
          +3

          Массивы регулярок — результат применения нейросети с deep learning (т.н. головного мозга примата homo sapiens, возможно, не одного экземпляра) к задаче :)


    1. Zifix
      29.04.2016 20:55

      Мне казалось, что генетическое программирование это обходной путь для полного перебора, вы уверены что этот подход вообще принципиально применим к задаче?


      1. pro_co_ru
        30.04.2016 09:05
        +2

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


        1. pro_co_ru
          30.04.2016 09:32
          +1

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


          1. arusakov
            30.04.2016 11:38
            +1

            Попробуйте написать пару unit тестов :)


            1. pro_co_ru
              01.05.2016 16:17
              +4

              Да уж, с первой попытки дало 57% на 10000 слов из тесткейсов. Что-то даже страшно стало представить себе, чем там занимаются те, у кого уже за 80% перевалило :)


              1. pro_co_ru
                04.05.2016 08:58
                +1

                Уже 73.6%, после того как проанализировал те слова в которых ошибаюсь, отсеял наиболее часто встречающиеся паттерны.


  1. inker
    29.04.2016 22:06
    +4

    А как можно верифицировать отправляемые файлы? Код написан и отправлен, однако боюсь, что ввиду своей рассеяности где-то сглупил (например, опечатался в названиях методов или перепутал файлы при отправке), из-за чего всё труды пойдут насмарку.


  1. OlegMax
    29.04.2016 23:49

    Слова английского языка?! Мне прямо стихи попались:

    xv
    xvi
    xvii
    xviii
    xw
    xx
    xxi
    xxii
    xxiii
    xxiv
    xxix
    xxv
    xxvi
    xxvii
    xxviii


    1. zBit
      29.04.2016 23:54

      Я чисто случайно Зюганова нашёл в исходном файле (words.txt). Он там почти в самом конце файла.


  1. caveeagle
    30.04.2016 11:23
    +2

    Если кому-то нужен файл false-set, размером примерно с true-set, можете брать: false-words


    1. vintage
      30.04.2016 12:05

      Он каким образом получен-то?


      1. caveeagle
        30.04.2016 12:27

        Самым тривиальным — через ихний генератор testcase. Это для тех, кому лениво самому парсить json, и ждать пару часов, пока наберётся достаточная выборка.


        1. vintage
          30.04.2016 12:53

          Заодно таких ленивых можно слить, выдав им неправильные данные ;-)


          1. mwizard
            30.04.2016 13:13
            +1

            Я вообще не понимаю мотивации доброхотов, которые подсказывают решения — «а давайте нейронными сетями, а давайте генетическим алгоритмом, а давайте префиксным деревом». Этим людям не нужны 1000-3000$? Зачем вы помогаете прямым конкурентам? -_-


            1. webmasterx
              30.04.2016 13:22
              +1

              затем, что для программиста деньги — вторичное


              1. mwizard
                30.04.2016 13:24
                +1

                Лихо вы за всех расписались, я аж программировать разучился от такого заявления.


            1. caveeagle
              30.04.2016 13:31
              +5

              Может, потому что мировой опыт (и теория игр) подсказывает — кооперация эффективнее соперничества =) Кому-то подскажу я, а кто-то подскажет мне — получаются более эффективные решения.

              И да, не всё меряется деньгами и первыми местами в конкурсах.


              1. napa3um
                30.04.2016 13:37
                +2

                Кооперация — это компромиссы, на которые готовы пойти конкуренты :).


              1. Demanoidos
                30.04.2016 16:11
                +1

                Поддержу. Я вот про фильтр блума из этой ветки узнал, но до сих пор никак не допру, как он работает :)


                1. haldagan
                  02.05.2016 17:00
                  +5

                  Попытаюсь «на пальцах» объяснить. Не бейте ногами — аналогия заведомо некорректная, но может помочь понять принцип работы.

                  В природе существует туча разных молекул.
                  Перед нами стоит задача перебирать пролетающие мимо молекулы и отбирать только молекулы кислорода (O2) и воды (H2O).
                  Для этого мы будем использовать фильтр блума:
                  За первую хэш-функцию возьмем процедуру «получить названия атомов», которая возвращает список атомов, из которых состоит молекула.
                  Применим эту хэш-функцию к необходимым нам молекулам, и получим результат в виде «О» для первой молекулы и «Н, О» — для второй.

                  Минимальный фильтр блума с максимальным количеством false-positive в нашем случае будет выглядеть так:
                  H О
                  1 1

                  То есть ловя каждую молекулу и применяя к ней хэш-функцию «получить названия атомов», а затем сверяясь с нашим фильтром, мы ни за что не пропустим ни кислород, ни воду, однако мы «нахватаем» false-positive на таких молекулах как H2SO4, С2H5OH, HCl и т.д. Т.к. в этих молекулах тоже содержится H и/или O.

                  Для уменьшения количества false-positive, мы увеличим размер фильтра. Для максимального уменьшения false-positive на нашей хэш-функции, расширим фильтр до полной таблицы Менделеева.
                  В итоге мы получим подобный фильтр для наших O2 и H2O:
                  H He Li Be… O F Ne… Nb Mo…
                  1_0__0_0_..._1 0 0__… 0__0…

                  Теперь наш фильтр не пропустит молекулы С2H5OH и HCl, поскольку при применении к этим молекулам хэш-функции «получить названия атомов» мы получим результаты «C,H,O» и «H,Cl».
                  Пытаясь сверить «C,H,O» с нашим фильтром мы увидим, что, в нем хоть и установлены биты на местах H и O, но также не установлен бит на месте «С», Что говорит нам о том, что в списке того, что нам нужно, этой молекулы точно нет.

                  Однако у текущего нашего фильтра все еще будут случаться false-positive на таких молекулах как O3 и H.

                  Для решения этой проблемы мы введем вторую хэш-функцию вида «получить количество атомов в молекуле», которая будет возвращать количество указанных атомов в тестируемой молекуле.
                  Она будет применятся после сразу основной на каждом атоме из списка, возвращенного первой хэш-функцией. Наш фильтр тоже увеличится и будет теперь выглядеть примерно так:

                  H1 H2 H3 H4 H5… He1 He2 He3… O1 O2 O3 O4 O5…
                  0__1__0__0__0_..._0___0___0__..._1__1__0__0__0…

                  Этот фильтр уже не пропустит H, потому что после применения обеих наших хэш-функций к этой молекуле мы получим позицию «H1», для которой в нашем фильтре бит не установлен.

                  Стало хоть сколько-то понятней?
                  П.С.: Шрифт не моноширинный, парсер жрет пробелы, простите за извращения с "_"


                  1. Demanoidos
                    03.05.2016 18:58

                    Благодарю, аналогия прекрасная, моноширинный шрифт не проблема :)

                    Стало быть, фильтр Блума в чистом виде совершенно неприменим к решению данной задачи с приемлемой точностью, потому что для построения ряда битов надо слишком большое число. Накладных расходов больше, чем профит.

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


                    1. vintage
                      03.05.2016 19:37
                      +1

                      900 килобайт — это более 7 мегабит, что даёт крайне высокую точность в фильтре блюма для 600 килослов.


                    1. Don_Eric
                      03.05.2016 20:50

                      смотря что называть «приемлимой точностью»

                      300Кб для блюма дает точность больше 90%
                      60Kb — около 70%


            1. napa3um
              30.04.2016 13:31
              +6

              Кто говорит — не знает, кто знает — не говорит.


            1. chersanya
              30.04.2016 15:04
              +2

              Скорее всего далеко не все, кто пишет, участвуют — так что просто высказывают свои мысли по этому поводу.


            1. Don_Eric
              30.04.2016 18:08
              +2

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


          1. vird
            30.04.2016 22:09
            +1

            Проверил. В списке нету слов из words.txt.
            Совпадения с моим списком 55012
            Различия 614277 (т.е. в 11 раз больше)
            Список претендует на то, что он был получен честным способом.

            Я уже организаторам говорил «а давайте всё-таки один общий false dataset». Ну вот. Теперь есть как минимум 2 dataset'а, которые отличаются друг от друга.


            1. vird
              30.04.2016 22:17

              Только одно замечание. Наличие дубликатов.
              626919 — без дубликатов
              669289 — с дубликатами
              Некоторые по несколько раз, например, overwort


        1. SabMakc
          01.05.2016 00:20

          Какие тесты качались? Брались подряд или с помощью редиректа на случайный тест?


          1. vird
            01.05.2016 03:08

            По ходу тупо рандом, т.к. у меня первые 100k и набор другой.


  1. Kookle
    30.04.2016 16:12

    У меня вопрос к организаторам: сколько всего «не-слов» у вас сгенерено?
    Хочу скачать их все, но надо же знать когда остановиться.


    1. feldgendler
      30.04.2016 16:12

      Они реально генерируются в момент запроса. У нас не хранится какого-то запаса не-слов.


      1. Kookle
        30.04.2016 16:20

        Выходит что на «не словах» тренировать программу бесмысленно?


        1. feldgendler
          30.04.2016 16:25
          +1

          Я этого не говорил.


          1. Kookle
            30.04.2016 16:31
            -4

            Я знаю что не говорили. Спрошу немного по другому — ваш алгоритм генерации не-слов может генерить бесконечное количество не-слов, или есть какой-то предел?


            1. feldgendler
              30.04.2016 16:42

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


  1. mwizard
    01.05.2016 10:57
    +6

    Немного забавной, хоть и бесполезной статистики.

    Сумарно с сида 1 по 254200 всего встречается 10'041'446 уникальных не-слов, и 630'403 словарных слов. В словаре всего 630'404 слова, и единственное, которое до сих пор не встретилось — «constructor». С момента обнаружения последнего уникального слова в сиде 175475 прошло уже 78725 сидов. Для сравнения, чтобы найти предпоследнее слово, потребовалось всего 4475 сидов, в 17.6 раз меньше.

    Так что есть хорошая вероятность, что слово «constructor» не встретится в выдаче вообще никогда.


    1. KlonKaktusa
      01.05.2016 23:35

      It probably has something to do with a «constructor» property of javasctipt objects. Looks like a bug.


      1. mwizard
        01.05.2016 23:38

        Я выполняю парсинг Python-овским json.loads(), а ему глубоко пофиг на специальные свойства JavaScript-а. Так что если баг и есть, то не на моей стороне.

        Проверил на node.js для очистки совести:

        > s = JSON.stringify({constructor: "foobar"})
        '{"constructor":"foobar"}'
        
        > JSON.parse(s)
        { constructor: 'foobar' }
        


        1. KlonKaktusa
          02.05.2016 00:25

          Возможно, для набора с «constructor» генератор вернет 99 слов, а не 100.


  1. kroshanin
    02.05.2016 15:38
    -3

    В исходном файле words.txt есть слова, которые отличаются лишь регистром (например, ABEL, Accra).
    Их не так уж и мало — приблизительно 31 000, привожу скрипт (mysql) для их выборки:

    	SELECT word, COUNT(*) AS quality
    	FROM words_good
    	GROUP BY LOWER(word)
    	HAVING quality > 1
    

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


    1. mwizard
      02.05.2016 15:49

      Об этом уже писали. Словарь дается «как есть», проверяться все слова будут в lowercase безотносительно того, в каком регистре они были в словаре.


    1. zBit
      02.05.2016 15:50
      +2

      Самому сделать не судьба?
      Вы предлагаете организатору конкурса сделать работу за конкурсантов?


    1. degorov
      02.05.2016 15:55
      +2

      cat words.txt | tr A-Z a-z | sort | uniq > words_dedup.txt


      1. mwizard
        02.05.2016 16:24
        -2

        Теперь это codegolf-тред.

        cat words.txt | sort -fu | tr A-Z a-z > words_dedup.txt
        У меня на два непробельных символа короче :)


        1. dottedmag
          02.05.2016 16:55
          -3

          Useless use of cat

          sort -fu words.txt | tr A-Z a-z > words_dedup.txt


          1. vintage
            02.05.2016 17:30
            -2

            cat words.txt | sort -unique > words_dedup.txt


            1. dottedmag
              02.05.2016 23:58
              -3

              Тогда уж sort -unique < words.txt > words_dedup.txt, но мой sort не знает -q.


              1. vintage
                03.05.2016 01:19
                -2

                А мой шелл не знает < :-)


                строка:1 знак:14
                + sort -unique < words.txt > words_dedup.txt
                +              ~
                Оператор "<" зарезервирован для использования в будущем.
                    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
                    + FullyQualifiedErrorId : RedirectionNotSupported


          1. vird
            02.05.2016 18:10
            +1

            (оффтоп) Иногда использование cat оправдано.
            https://habrahabr.ru/post/267697/#comment_8591149


  1. 4orever
    06.05.2016 01:20
    +2

    Я немного подостыл к задаче и особо нет времени дальше биться за проценты. Поэтому выкладываю свои дилетантские, далекие от всяких Блюмов и нейросетей, размышления. Может кого-то натолкнут на свежие мысли.
    1. Собираем статистику по длине слов на выборке в 1 млн. и выясняем, что простейшее if(strlen > 20 (или около того)) return false; else return true; дает что-то порядка 60% (точную цифру не сохранил).
    2. Если тупо проанализировать словарь на отсутствующие 3-х буквенные комбинации с привязкой к длине слова и позиции относительно начала слова, то без всякого ИИ можно получить порядка 72%. С помощью перфиксного дерева можно много комбинаций запихнуть в 50+К, на код останется порядка 14К, вполне достаточно.
    3. Любопытно, хотя и ожидаемо — анализ из п.2, но по контрольным суммам дает 50% :) Алгоритм расчета контрольных сумм дает равномерность распределения.

    Не имел опыта работы с нейросетями, но общий смысл представляю так: Есть некий набор входных параметров, влияющих на выходные. При этом у каждого входного параметра есть некий весовой коэффициент, от которого зависит, насколько он влияет на результат. Весовые коэффициенты подбираются эмпирически в процессе обучения. Многослойность и т.п. — это уже детали, можно разобраться при желании. Но встает вопрос. Выходной параметр в текущей задаче это есть/нет в словаре. А что можно взять за входные параметры? Длину слова? Префиксы/постфиксы? Ну т.е. буквально на пальцах какие такие признаки будет искать этот пресловутый ИИ в мешанине слов и недослов?


    1. napa3um
      06.05.2016 01:32
      +1

      Вопрос про «буквально на пальцах» (о том, как моделировать задачу и как представлять фичи) как раз и является основной сложностью применения машинного обучения (в любой задаче). Ответ на него будет достоин написания отдельной статьи (после конкурса).


      1. 4orever
        06.05.2016 02:48

        Я подозревал, что в этом месте подвох :)


    1. Don_Eric
      06.05.2016 08:33

      я начал с самого простого — задал каждую букву как параметр. Получилось 67%

      Интересно попробовать adversarial networks


    1. Gromo
      06.05.2016 21:52
      +5

      Добавлю немного своих размышлений и результатов исследований:
      1. Используя префиксное дерево, дающего 100% результат удалось добиться размера 845Кб
      2. То же префиксное дерево, но с результатом 98% весит уже 784Кб
      3. 89% — 474Кб
      4. 85% — 356Кб
      и т.д…

      Данная статистика наглядно показывает зависимость размера от результата.

      Использование фильтрации по неиспользуемым сочетаниям букв даёт нулевой результат — 3-х буквенные неиспользуемые сочетания занимают 12Кб места, а толку от них 0, т.к. в выборке сгенерированных «неправильных» слов размером в 500тыс слов (ссылка в комментах выше) ни одно из этих сочетаний не используется.

      Попытки найти какой-либо шаблон в словах, который бы использовался в словаре, но не использовался бы в сгенерированных словах, не удались. Сгенерированные слова слишком похожи на слова из словаря, а слова из словаря слишком разные. Например, слова с 5 согласными буквами подряд встречаются в словаре 1053 раза, а слова с одной и той же буквой 3 раза подряд встречаются 109 раз. При этом данная статистика бесполезна.

      Следующим шагом была попытка использования масок для слов, например, 010101100 — где 0 — гласные, 1 — согласные, либо маски, сгруппированные по буквам, например, проверка одного и того же слова сразу по нескольким маскам, использующим различные группировки букв. Толку от подобного подхода слишком мало — опять же из-за сильной схожести сгенерированных слов со словами из словаря.

      Наибольший результат достигается использованием фильтрации по первым буквам слов — для 3 букв при размере 17.5Кб результат — 57%, для 4 букв — 89Кб и 64%, для 5 букв — 73% (размер не смотрел). Использование префиксного дерева позволяет уменьшить размер — 3.5Кб для 3 букв, 24Кб — для 4 букв, 89Кб — для 5. Отсекая малоиспользуемые префиксы для 5 букв можно добиться результата в 71% при размере 60Кб (мой лучший результат). Попытка дополнительно учитывать длину слова и/или конечные буквы значительно увеличивает размер, при этом мало влияя на результат. Например, попытка использовать 2 префиксных дерева по 4 буквы для отсечения слов и с начала и с конца, даёт 66% при размере 58Кб, 5 с начала и 3 с конца — 71% при размере 67Кб. Выводы можете сделать сами.

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

      P.S. когда я увидел возможность упаковки 6.3Мб словаря в 100Кб, я был очень удивлён, но у меня появился стимул. Очень жаль, что это оказалось усечённое префиксное дерево :(.


      1. Suntechnic
        06.05.2016 23:51

        Прошел через все описанное, более-менее. Кроме фильтрации по первым трем (4-5) буквам (делал прямо сейчас) — спасибо за стат по этому подходу. Теперь не стану.
        Осталось добавить что попытка использовать описанные алгоритмы совместно, не дает хороших результатов, так как множества слов по которым алгоритмы отрабатывают имеют мощные пересечения и если каждый алгоритм дает скажем 57% то совместное применение разве что 58%.
        Что до упаковки… как только мы пытаемся применить какую-то допобработку к словарю, степень сжатия результата сильно уменьшается. Мне например удалось ужать словарь что-то до 4,8Мб без потерь, но в итоге упаковался он в те же условные 100Кб.
        Что в общем логично, так как любая уменьшающая словарь допобработка уменьшает его избыточность, а меньше избыточность == меншь степень сжатия.

        : (


      1. ArtemS
        07.05.2016 10:50

        Например, слова с 5 согласными буквами подряд встречаются в словаре 1053 раза, а слова с одной и той же буквой 3 раза подряд встречаются 109 раз. При этом данная статистика бесполезна.

        Не скажите. А сколько раз слова с 5 согласными встречаются среди «не слов»? Если их в разы больше, это вполне можно использовать.


        1. Gromo
          07.05.2016 14:43

          Добавление подобной проверки не дало ощутимой разницы при тестировании на 12К случайных слов, но ради интереса я проверил в словаре «неверных» слов и результаты интересны:

          Total words: 598216
          Words with 5 consonants: 68502 or 11.45%
          Words with 3 same letters: 2835 or 0.47%

          Против статистики «верных» слов:

          Total words: 630404
          Words with 5 consonants: 1053 or 0.17%
          Words with 3 same letters: 109 or 0.02%

          Так что я ошибался — проверка на 5 согласных подряд должна добавить несколько процентов.

          Добавлю сюда результат проверки для 4 гласных подряд:

          Correct words with 4 vowels: 2447 or 0.39%
          Incorrect words with 4 vowels: 6467 or 1.08%


          1. napa3um
            07.05.2016 14:51

            Всего лишь нужно эти правила научиться подбирать автоматизировано, и ваша программа превратится в machine learning.