Это существительное или нет?

22

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

Вы будете оцениваться по 1000 наиболее распространенных английских слов, по тому, сколько вы правильно назвали как существительное или нет.

Программа или функция, которая правильно классифицирует большинство этих слов в 50 байтах или меньше, победит.

Существительные

Существительное - это слово, которое представляет вещь, как правило. Это становится более сложным, но это основная идея.

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

Слова, по которым вы получите оценку, - это 1000 общих слов из простой Википедии с добавлением «два» и «один раз». Из них это 586 существительных и 414 не существительных . Вы можете найти все три списка здесь . Обратите внимание, что все эти входы в нижнем регистре. Эти списки являются окончательными - не пытайтесь спорить по грамматике.

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

Тонкости:

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

Примеры:

a: noun
act: noun
active: noun
about: non-noun
above: non-noun
across: non-noun

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

isaacg
источник

Ответы:

13

JavaScript (ES6), 43 байта, 622 630 633

Просто чтобы мяч катился. Возвращает 1для существительных, 0для не существительных.

s=>2552>>s.length&/^[bcdf-mp-tvwy]/.test(s)

Как?

Мы делаем ставку на существительное, если выполняются оба следующих условия:

  1. Длина слова составляет 3, 4, 5, 6, 7, 8 или 11. Это делается путем сдвига вправо двоичного числа 100111111000 (2552 как десятичное число).
  2. Слово начинается с одной из следующих букв: bcdfghijklmpqrstvwy
Arnauld
источник
Так же, как я собирался прокомментировать, особенно с учетом JS, что ограничение в байтах было слишком ограничительным, вы публикуете это! Я не думал о списке и думал, что лучший результат, чем 586, можно было бы получить, проверив первую букву или 2 в каждом слове. Отлично сделано :)
Shaggy
Объяснение было бы неплохо для людей, менее знакомых с Javascript. Насколько я могу сказать, это проверяет, является ли длина слова 3, 4, 5, 6, 7, 8 или 11, и слово также начинается с одной из набора букв?
Исаак
@isaacg Это правильно. Объяснение добавлено.
Арно
4
Обратите внимание, что класс символов [bcdf-mp-tvwy]эквивалентен классу [^aenouxz]. Изменение сэкономило бы 4 байта, которые можно было бы использовать.
fireflame241
@ fireflame241 Очень верно. И это даже можно сократить, [^aenouz]потому что у нас нет слова, начинающегося с a x.
Арно
11

Желе , 48 байт, оценка 731

Это мой первый ответ в Jelly, и я приложил немало усилий, чтобы собрать это воедино. Ах, хорошо ... это было весело. :-)

O‘ḅ⁹%⁽€Oæ»4“Ạ$ⱮẊḲḲLÑMṆụ⁻ẉṂ`ŻvḤæɠ5ṭȯƁU*×TdƲḥ`’æ»Ḃ

1 байт сохранен благодаря @JonathanAllan

Попробуйте онлайн!

Разбивка и тестирование

Как?

Сначала мы вычисляем хеш входной строки:

  • преобразуя его в целое число, интерпретируя каждую кодовую точку как основную 256 цифру
  • применение по модулю 4080 (выбрано как наиболее эффективное значение с длиной не более 12 бит)
  • сохраняя 8 самых значимых битов результата

Это оставляет нам индекс в [0 ... 255] и, таким образом, делит все слова на 256 групп.

Для каждой группы слов мы предварительно вычисляем двоичный флаг, который заключается в 1том, что в группе содержится больше существительных, чем не существительных, и в 0противном случае. Это приводит к 256-битному числу N, которое мы собираемся использовать в качестве справочной таблицы. Мы храним его как строку в кодировке base-250.

Ниже двоичное представление N .

1000011000001011000101111011111001001101110010101101110010001101
0000010001101010010111110001110010010101110110110010111111010000
0001111010011110000110101011111000011110111011010011011110101100
1010010110101111000010101000101100000001110110100011111000101010

Который можно хранить как “Ạ$ⱮẊḲḲLÑMṆụ⁻ẉṂ`ŻvḤæɠ5ṭȯƁU*×TdƲḥ`’в желе.

Отсюда и код:

O‘ḅ⁹%⁽€Oæ»4“Ạ$ⱮẊḲḲLÑMṆụ⁻ẉṂ`ŻvḤæɠ5ṭȯƁU*×TdƲḥ`’æ»Ḃ    main link

O                                                   convert the input string to a list of
                                                    code points
 ‘                                                  increment each of them
  ḅ⁹                                                convert from base 256 to an integer
    %⁽€O                                            modulo 4080
        æ»4                                         drop the 4 least significant bits
           “Ạ$ⱮẊḲḲLÑMṆụ⁻ẉṂ`ŻvḤæɠ5ṭȯƁU*×TdƲḥ`’æ»     right shift N by this amount
                                               Ḃ    test the least significant bit
Arnauld
источник
Хорошая работа! Сохраните байт для загрузки O‘ḅ⁹%⁽€Oæ»4“Ạ$ⱮẊḲḲLÑMṆụ⁻ẉṂ`ŻvḤæɠ5ṭȯƁU*×TdƲḥ`’æ»Ḃ(также обратите внимание, что вы можете использовать нижний колонтитул на TIO, я бы пошел Ç€¬S,Lи Ç€S,Lдля двух ваших тестовых пакетов.
Джонатан Аллан
@JonathanAllan Спасибо за советы!
Арно
10

JavaScript (ES6), 50 байт, оценка 693

s=>!/^([aouz]|th|..$)|e.+[ey]|[flo].r|a.p/.test(s)

Просто ищите возможные шаблоны, которые есть у не-существительных, а не у существительных.

Не существительные чаще содержат:

  1. a, o, u или z в качестве первой буквы.
  2. го , как первые две буквы.
  3. Только две буквы. [Подумайте местоимения (я, мы, мы, он, оно) и предлоги (о, о, о, о, о, о, ...).]
  4. e , за которым следуют одна или несколько букв, за которыми следует e или y .
  5. f, l или o , за которыми следует любая буква, за которой следует r .
  6. а , за которым следует любая буква, за которой следует р .

Отрывок:

Рик Хичкок
источник
Я полагаю, что вы можете сохранить байт, изменив первое регулярное выражение на /h|n/(или выполнив /^.[hn]/.test(s)), а другой - s[2]>''на либо либо, !!s[2]либо 2 in s.
ETHproductions
Спасибо, @ETHproductions. Я могу использовать ваши предложения и объединить два теста, чтобы сохранить кучу байтов, что позволило мне добавить код, чтобы улучшить мой результат.
Рик Хичкок
Разве не является a.pлишним, так как у вас уже есть [aouz]?
AdmBorkBork
@AdmBorkBork, a in [aouz]сопоставляется только в начале строки. По какой-то причине тестирование в a.p любом месте строки улучшает результат.
Рик Хичкок
10

Желе , 50 байт , оценка 763

Использование хэша сейчас (очень похоже на ответ Арнольда на желе )

OP%⁽Wpị“!ḋGẠ⁻Ṭȥʋt|Ḥ\⁾°½İ@G2ḂƑ½ịʂ¶ɦḲ⁷³Hz~⁵p9)⁹ƙ¿’B¤

Попробуйте онлайн!

250/414 для не-существительных
513/586 для существительных
Всего = 250 + 513 = 763.

Как?

Создает таблицу с 308 записями: 1 (идентифицирует существительное) или 0 (идентифицирует не существительное) и индексирует в нее ключ, предоставленный хеш-функцией, которая использует произведение порядковых чисел входного слова:

OP%⁽Wpị“!ḋGẠ⁻Ṭȥʋt|Ḥ\⁾°½İ@G2ḂƑ½ịʂ¶ɦḲ⁷³Hz~⁵p9)⁹ƙ¿’B¤ - Link: list of characters, word
O                                                  - convert to ordinals
 P                                                 - product
   ⁽Wp                                             - base 250 number = 22863
  %                                                - modulo (by 22863)
                                                 ¤ - nilad plus link(s) as a nilad:
       “!ḋGẠ⁻Ṭȥʋt|Ḥ\⁾°½İ@G2ḂƑ½ịʂ¶ɦḲ⁷³Hz~⁵p9)⁹ƙ¿’   -   base 250 number
                                                B  -   as a binary list (308 bits)
      ị                                            - index into (1-indexed and modular,
                                                  -   so adds another modulo by 308)

Предыдущая:  50  47 байтов , оценка 684

ḣ3Ẇf“QṘ°ḂżÐŒ#ḍæ09»s2¤Ȧ¬ȧØY⁾niyṖf⁽ż2ị$
0,-2ịE¬ȧÇ

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

Попробуйте онлайн! (нижний колонтитул выполняет if if для результата, чтобы напечататьNounилиNon-Noun)
... или посмотреть программу оценки (подсчитывает истинные индексы по двум спискам, а затем вычисляет оценку).

Распределение баллов: 462/586 существительных, правильно определенных (124 неверных), 222/414 не-существительных, правильно определенных (192 неверных) - итого правильно = 684/1000.

Как?

Думаю, это не существительное, если ...

  • последний символ и символ перед ним равны (с модульным индексированием и индексированием на основе 1)
  • любая из первых двух подстрок длины 2 находится в:
    'be', 'th', 'le', 'he', 'm ', 'ev', 'et', 's ', 'fl', 'ax', 'en', 'fo', 'am', 'az' (примечание: 'm 'и 's 'предназначена только для упрощения сжатия, но в любом случае они никогда не появляются)
  • -299- й индекс (с модульным индексированием и индексированием на основе 1) является любым из:
    aenouyz(хотя это реализовано обратно и с использованием избыточных заглавных букв)
    ... поскольку все слова имеют длину от 1 до 11, -299- й индекс эквивалентен чтобы использовать длину для индексации отображения:{7:2; 8:5; 9:7; 11:9; else 1}

ḣ3Ẇf“QṘ°ḂżÐŒ#ḍæ09»s2¤Ȧ¬ȧØY⁾niyṖf⁽ż2ị$ - Link 1: list of characters, word
ḣ3                                    - head to index 3 (1st 3 characters, like 'abc')
  Ẇ                                   - all sublists (['a','b','c','ab','bc','abc']
                    ¤                 - nilad followed by link(s) as a nilad:
    “QṘ°ḂżÐŒ#ḍæ09»                    - compression of "bethlehem evets flaxenfoamaz"
                  s2                  - split into chunks of 2:
                                      -   be,th,le,he,m ,ev,et,s ,fl,ax,en,fo,am,az
   f                                  - filter keep (can only match 'ab' or 'bc')
                     Ȧ                - any and all (0 if empty, 1 if not)
                      ¬               - logical not
                        ØY            - consonant -y yield = "BCD...WXZbcd...wxz"
                          ⁾ni         - character pair = "ni" (no shrubbery for you!)
                             y        - translate (exchange the n for an i)
                              Ṗ       - pop (remove the z)
                       ȧ              - logical and
                                    $ - last two links as a monad:
                                ⁽ż2   -   base 250 literal = -299
                                   ị  -   index into the word
                               f      - filter keep

0,-2ịE¬ȧÇ - Main link: list of characters, word
0,-2      - pair zero with -2 = [0,-2]
    ị     - index into the word (last character and the one before the one before that)
     E    - all (both) equal?
      ¬   - logical not
        Ç - call the last link (1) as a monad
       ȧ  - logical and

13 байт, оценка: 638

Первый быстрый удар (расширенный выше)

ØY⁾niyṖf⁽ż2ị$
Джонатан Аллан
источник
0,-2не значит, что pair zero with -2это значитliteral [0, -2]
Эрик Outgolfer
Но это тот же самый эффект: р
Джонатан Аллан
нет, это не 0,-2нилад, не отдельный (0)(,)(-2)... конечно, это тот же эффект в этом случае, но не всегда. Я узнал, что это нелегкий путь ... и в любом случае я бы предпочел объяснить, что на самом деле происходит, а не что-то с тем же эффектом или чем-то.
Эрик Outgolfer
Если бы я написал «join», а не «pair», вы бы прокомментировали «no join is j»?
Джонатан Аллан
Возможно, я немного педантичен, но pairили join, очевидно, неправильно формулирую это, поскольку, 0,-2,-6например, это не значит, pair 0 with -2 and then pair that with -6 = [[0, -2], -6]а скорее означает literal [0, -2, -6]. Я понял , что , атом и ...,...(,...(...)) литерал сбивают с толку ... но все же 0,-2,-6это не совсем то же самое, что и то, 0,-2;-6что первое - 1 ссылка, а второе - 3 ссылки.
Эрик Outgolfer
2

Юлия 34 байта, 609

f(w)=hash(w)&0x0800000000004808>0

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

Поиск подходящих битовых масок для хеша для их разделения - интересная игра.

Линдон Уайт
источник
Лучшее решение;)
Тамасгал
2

Python 2 , 50 байт, точность: 596

lambda x:2<len(x)<7 or x[0]in"abcgmprs"or"st" in x

Попробуйте онлайн!

Просто проверяет первую букву, длину и указывает, что слово «st» в слове «Код» предполагает, что слово определено как x (Правка: благодаря issacg за исправление кода из фрагмента в функцию)

Хуснайн Раза
источник
Привет, добро пожаловать на сайт. Хотя это интересно, представления должны быть либо функциями, либо полными программами. Это фрагмент, который не допускается. Посмотреть это Попробуйте онлайн! ссылка для способа преобразования этого фрагмента в функцию при выполнении того же кода.
Исаак
2

Haskell, 36 байтов, 626 631

f x=length x>2&&x!!0`notElem`"aenou"
судейская шапочка
источник
643, если у кого есть более короткий язык:length x>2&&(x!!0`notElem`"aenou"||x!!1`elem`"acqrsty")
BlackCap
2

2-х уровневая реализация логического вентиля, не 50 байтов, оценка 1000

  1. Просто подключите двоичное представление данного слова к 88 входам

    1. завершить ввод слова пробелами справа, если длина слова меньше 11
    2. 8-битный код ASCII для каждой буквы входного слова
  2. Схема возвращает 1, если слово является существительным, и возвращает 0, если нет

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

Эта реализация нуждается

  1. 48 транзисторов для кодирования всех вентилей инверторов
  2. 1100 транзисторов для кодирования всех вентилей И
  3. 154 транзистора для кодирования логического элемента ИЛИ
  4. Всего 1302 транзистора, что составляет менее 28 байтов.

Некоторые измерения

  1. Для затвора инвертора требуется 1 транзистор
  2. Для простого ИЛИ вентиля с 2 входами требуется 2 транзистора
  3. Для простого входа И с двумя входами требуется 2 транзистора
  4. На один бит нужно 6 транзисторов

введите описание изображения здесь

Полное разрешение Circuit.pdf здесь

Полное разрешение Circuit.png здесь

mdahmoune
источник
2
Не могли бы вы объяснить, какова ваша система для кодирования этой схемы в байтах? Я очень смущен тем, как вы утверждаете, что используете 28 * 8/1302 = 0,17 бит на транзистор.
Исаак
Поскольку мое решение является компьютерным решением очень низкого уровня (аппаратным, а не программным), я основывал свой байт на транзисторах. С аппаратной точки зрения, BIT кодируется 6 транзисторами, поэтому мы можем предположить, что один транзистор представляет 1/6 бит (около 0,17).
mdahmoune
1
Я понимаю вашу точку зрения, однако 50-байтовый источник кода должен существовать где-то на конкретном оборудовании (транзисторы вообще)
mdahmoune
1
Это не просто точка зрения - это требование задачи. Пожалуйста, пометьте ваш ответ как не конкурирующий, так как он не соответствует требованиям для участия в этой задаче.
Исаак
2
Простое несжатое двоичное кодирование информации, необходимой для воссоздания этого решения, может использовать 2 бита для типа каждого логического вентиля (3 различных вентиля) и 10 бит для каждого адреса каждого входа и выхода логического вентиля (675 вентилей плюс входы и выход). 2 * (48 + 550 + 77) + 10 * (2 * 48 + 3 * (550 + 77)) = 21120 бит = 2640 байтов.
17
1

Python 3, 50 байт, оценка 602

Python не самый многословный язык, но 50 байтов жесткие.

lambda x:all(x.count(y)<1for y in["ful","y","er"])
L3viathan
источник