Це іменник чи ні?


22

Подавши рядок як вхід, визначте, чи це іменник чи ні.

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

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

Іменники

Іменник - це слово, яке зазвичай представляє річ. Він стає складнішим, але це основна ідея.

У випадках, коли слово може бути або іменником, або якоюсь іншою частиною мови, я класифікував це як іменник, навіть якщо це рідкісне вживання. Або власне, я дозволяю цьому сайту зробити це за мене.

Слова, на які ви будете набрані, - це 1000 поширених слів із простої Вікіпедії , додані "два" та "один раз". З них 586 іменників , а це 414 неіменників . Усі три списки ви можете знайти тут . Зауважте, що всі ці входи знаходяться в малому регістрі. Ці списки остаточні - не намагайтеся сперечатися з граматикою.

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

Тонкощі:

Програми повинні мати детермінований вихід. Якщо ви хочете використовувати випадковість, посійте її. У програмах заборонено використовувати вбудовані списки іменників чи інші вбудовані функції часткової мови.

Приклади:

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

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

Відповіді:


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

Так само, як я збирався прокоментувати, спеціально на увазі JS, що обмеження в байті було занадто обмежуючим, ви розміщуєте це! Я думав, не дивлячись на список, що кращий бал, ніж 586, може бути просто можливим, перевіривши першу букву або 2 у кожному слові. Чудово зроблено :)
Shaggy

Пояснення було б приємно для людей, які менш знайомі з Javascript. Наскільки я можу сказати, це перевіряє, чи є довжина слова 3, 4, 5, 6, 7, 8 чи 11, і слово також починається з однієї з наборів літер?
isaacg

@isaacg Це правильно. Пояснення додано.
Арнольд

4
Зауважте, що клас символів [bcdf-mp-tvwy]еквівалентний класу [^aenouxz]. Зміна дозволить заощадити 4 байти, на яких можна використовувати великі літери.
fireflame241

@ fireflame241 Дуже вірно. І це навіть можна скоротити, [^aenouz]оскільки у нас немає жодного слова, що починається з а x.
Арнольд

11

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

Це моя перша в історії відповідь в Jelly, і я зіткнувся з багатьма проблемами, збираючи це. Ну добре ... це було весело. :-)

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

1 байт збережено завдяки @JonathanAllan

Спробуйте в Інтернеті!

Набори для розбивки та тестування

  • Неіменники, правильно ідентифіковані як іменники: 265/414 (64%)
  • Іменники правильно ідентифіковані як іменники: 466/586 (79,5%)

Як?

Спочатку обчислимо хеш вхідного рядка:

  • перетворення його в ціле число, інтерпретуючи кожну кодову точку як цифру бази-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

Хороша робота! Зберегти байт в черевику з O‘ḅ⁹%⁽€Oæ»4“Ạ$ⱮẊḲḲLÑMṆụ⁻ẉṂ`ŻvḤæɠ5ṭȯƁU*×TdƲḥ`’æ»Ḃ(також відзначити , ви можете використовувати колонтитул на TIO, я б з Ç€¬S,Lі Ç€S,Lдля двох тестових наборів.
Джонатан Allan

@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. a , за яким будь-який лист, а за ним p .

Фрагмент:


Я вважаю, що ви можете зберегти байт, змінивши перший регекс на /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¬ȧÇ

Монадійне посилання, яке бере слово і повертає список одного символу (truthy), якщо слово ототожнено як іменник, або порожній список або нуль (обидва фальси), якщо це не так.

Спробуйте в Інтернеті! (нижній колонтитул виконує, якщо інший результат буде надрукувати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]
Ерік Аутгольфер

Але це той самий ефект: p
Джонатан Аллан

ні, це не 0,-2нілад, не окремий (0)(,)(-2)... звичайно, в цьому випадку це однаковий ефект, але не завжди. Я дізнався, що важкий шлях ... і в будь-якому випадку я б вважав за краще пояснити, що відбувається насправді, а не щось з тим самим ефектом або щось таке.
Erik the Outgolfer

Якби я написав "приєднатися", а не "пара", ви б прокоментували "не приєднуйтесь 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 ланкою.
Erik the Outgolfer

2

Джулія 34байт, 609

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

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

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


Найкраще рішення;)
tamasgal

2

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

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

Спробуйте в Інтернеті!

Просто перевіряє першу літеру, довжину та чи є "слово" у слові Код передбачає, що слово визначено як x (Редагувати: Завдяки issacg за фіксацію коду з фрагмента до функції)


Привіт, ласкаво просимо на сайт. Незважаючи на те, що це цікаво, подання заявок повинно бути або fuctions, або повними програмами. Це фрагмент, який заборонено. Дивіться це спробувати його в Інтернеті! посилання для способу перетворення цього фрагмента у функцію, виконуючи все той же код.
isaacg

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

Реалізація дворівневих логічних воріт, не 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-вхідний простий І ворота потребує 2 транзисторів
  4. На один біт потрібно 6 транзисторів

enter image description here

Повна роздільна здатність Circuit.pdf тут

Повна роздільна здатність Circuit.png тут


2
Не могли б ви пояснити, що саме означає ваша система кодування цієї схеми в байти? Я дуже розгублений, як ви стверджуєте, що використовуєте 28 * 8/1302 = 0,17 біта на транзистор.
isaacg

Оскільки моє рішення - це комп’ютерне рішення дуже низького рівня (апаратне, а не програмне забезпечення), я базував свій байт на транзисторах. Щодо апаратної точки зору, BIT кодується 6 транзисторами, тож можна припустити, що один транзистор являє собою 1/6 біт (приблизно 0,17).
mdahmoune

1
Я розумію вашу точку зору, проте джерело коду на 50 байтів має існувати десь на конкретному апаратному забезпеченні (як правило, транзистори)
mdahmoune

1
Це не просто точка зору - це вимога виклику. Будь ласка, позначте свою відповідь як неконкурентоспроможну, оскільки вона не відповідає вимогам, які потрібно змагатись із цим викликом.
isaacg

2
Просте, нестиснене двійкове кодування інформації, необхідної для відтворення цього рішення, може використовувати 2 біти для типу кожного логічного ворота (3 різні ворота) і 10 біт для кожної адреси входів (ів) і висновку кожного логічного ворота (675 воріт плюс входи та вихід). 2 * (48 + 550 + 77) + 10 * (2 * 48 + 3 * (550 + 77)) = 21120 біт = 2640 байт.
Nnnes

1

Пітон 3, 50 байт, оцінка 602

Python не є найбільш багатослівною мовою, але 50 байт важко.

lambda x:all(x.count(y)<1for y in["ful","y","er"])
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.