是名词吗?


22

给定一个字符串作为输入,请确定它是否为名词。

您会在1000个最常用的英语单词中获得打分,具体取决于是否正确将其标记为名词。

正确地将大多数单词(不超过50个字节)分类的程序或函数将获胜。

名词

名词是通常代表事物的单词。它变得更加复杂,但这是基本思想。

在一个单词可能是名词或其他词性的情况下,我将其归类为名词,即使这种用法很少见。或实际上,我让这个网站替我做。

您将获得评分的单词是这1000个常见单词,它们来自简单的Wikipedia,其中添加了“两个”和“一次”。其中,有586个名词,有414个非名词。您可以在此处找到所有三个列表。请注意,所有这些输入均为小写。这些清单是最终清单-请勿尝试争论语法。

如果您的程序输出真实信息,则将其视为正确在作为名词的输入中结果,而在非名词的输入中结果,。

细微之处:

程序必须具有确定性的输出。如果您想使用随机性,则将其作为种子。程序不得使用内置名词列表或其他内置词性功能。

例子:

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

请在回答中指出程序的成功率。以成功率最高的最多50个字节的程序或功能为准。如果出现平局,则最低字节数将确定获胜者。祝好运!

Answers:


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高的分数。做得很好:)
Shaggy

对于不熟悉Javascript的人来说,做一个解释会很好。据我所知,这将检查单词长度是否为3、4、5、6、7、8或11,并且单词是否也以一组字母中的一个开头?
isaacg

@isaacg是的。添加说明。
Arnauld

4
请注意,字符类[bcdf-mp-tvwy]等效于class [^aenouxz]。更改将节省4个字节,可以利用。
fireflame241

@ fireflame241非常正确。甚至可以缩短为,[^aenouz]因为我们没有任何以x。开头的单词。
Arnauld

11

果冻,48个字节,得分731

这是我在Jelly上的第一个答案,我在将其组合在一起时遇到了很多麻烦。嗯...很好玩。:-)

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

@JonathanAllan节省了1个字节

在线尝试!

故障和测试套件

  • 非名词正确地识别为非名词:414分之265(64%)
  • 名词正确地识别为名词:586分之466(79.5%)

怎么样?

我们首先通过以下方式计算输入字符串的哈希值:

  • 通过将每个代码点解释为以256为基数的数字将其转换为整数
  • 应用4080模(选择不超过12位的最有效值)
  • 保留结果的8个最高有效位

这使我们在[0 ... 255]中有一个索引,从而将所有单词分为256个组。

对于每组单词,我们预先计算一个二进制标志,即1该组包含的名词多于非名词的名词,0否则。这导致我们将使用256位数字N作为查找表。我们将其存储为以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两个测试套件。)
Jonathan Allan

@JonathanAllan感谢您的提示!
Arnauld

10

JavaScript(ES6),50个字节,得分693

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

只是寻找非名词具有名词所没有的任何可能模式。

非名词通常包含:

  1. a,o,uz作为第一个字母。
  2. th作为前两个字母。
  3. 仅两个字母。[思考代词(我,我们,我们,他,它)和介词(在,在,在,在,由,在,上,...)。]
  4. e,然后是一个或多个字母,然后是ey
  5. f,lo,后跟任意字母,再后跟r
  6. a,后接任意字母,后接p

片段:


我相信你可以节省通过改变第一正则表达式一个字节/h|n/(或做/^.[hn]/.test(s)改变),另一个s[2]>''要么!!s[2]2 in s
ETHproductions '17

谢谢@ETHproductions。我可以使用您的建议,结合两个测试来节省大量字节,这使我可以添加代码来提高得分。
瑞克·希区柯克

a.p既然已经有了,那不是多余的[aouz]吗?
AdmBorkBork

@AdmBorkBork,将一个[aouz]匹配,只有当在字符串的开头。无论出于何种原因,对字符串中的a.p 任何位置进行测试都会提高得分。
里克·希区柯克,

10

果冻,50 个字节,得分763

现在使用哈希(很像Arnauld的Jelly答案

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¬ȧÇ

单字链接,获取一个单词,如果该单词被识别为名词,则返回一个字符的列表(真实);如果不是,则返回一个空列表或零(均为假)。

在线尝试!(页脚执行其他的结果,如果要打印NounNon-Noun
......还是看评分程序(计数了横跨两个列表truthy指标,然后计算分数)。

分数细分:正确识别了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]
暴民埃里克(Erik the Outgolfer)'17年

但这是完全一样的效果:p
乔纳森·艾伦

不,这不是0,-2一件好事,不是分开的(0)(,)(-2)……当然,在这种情况下,效果是一样的,但并非总是如此。我了解到这很困难……无论如何我都更愿意解释实际发生的事情,而不是解释具有相同效果或结果的事情。
暴民埃里克(Erik the Outgolfer)'17年

如果我写的是“ 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]。我明白了,, 原子...,...(,...(...)) 文字令人困惑……但是stilll 0,-2,-6并不完全一样,0,-2;-6因为前者是1个链接,后者是3个链接。
暴民埃里克(Erik the Outgolfer)'17年

2

朱莉娅34bytes,609

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

我想通过使用内置哈希来节省字符。我觉得一定有办法更好地做到这一点。朱莉娅(Julia)对我想使用的更好的操作还不够友好,我想。

为散列找到合适的位掩码以将它们分开是一个有趣的游戏。


最佳解决方案;)
tamasgal

2

Python 2,50个字节,准确性:596

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

在线尝试!

只需检查单词的首字母,长度和是否包含“ st”,代码就会假定该单词已定义为x(编辑:感谢issacg,用于将代码段固定为功能)


您好,欢迎来到该网站。尽管这很有趣,但是提交的内容必须是功能性的或完整的程序。这是一个摘要,不允许使用。查看此在线尝试!链接,以便在仍执行相同代码的同时将该代码段转换为函数。
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

2级逻辑门实现,不是50字节,得分1000

  1. 只需将给定单词的二进制表示形式插入88个输入

    1. 如果单词的长度小于11,请在右边用空格完成输入单词
    2. 输入字的每个字母8位ASCII码
  2. 如果单词是名词,则电路返回1,否则返回0。

  3. 蓝色虚线表示从未使用过的输入

此实现需要

  1. 48个晶体管对所有逆变器门进行编码
  2. 1100个晶体管可对所有AND门进行编码
  3. 154个晶体管编码或门
  4. 总共1302个晶体管,不足28个字节。

一些测量

  1. 一个反相器门需要1个晶体管
  2. 2输入简单 门需要2个晶体管
  3. 2输入简单AND门需要2个晶体管
  4. 一个需要6个晶体管

在此处输入图片说明

全分辨率Circuit.pdf此处

全分辨率Circuit.png在这里


2
您能否确切说明将这个电路编码为字节的系统是什么?我很困惑您如何声称每个晶体管使用28 * 8/1302 = 0.17位。
isaacg

因为我的解决方案是一种非常低级的计算机解决方案(硬件而不是软件),所以我的字节计数基于晶体管。从硬件的角度来看,BIT由6个晶体管编码,因此我们可以假设一个晶体管代表1/6位(约0.17)。
mdahmoune

1
我理解您的观点,但是50字节代码源必须存在于具体硬件上的某个位置(通常是晶体管)
mdahmoune

1
这不仅是一种观点,也是挑战的要求。请将您的答案标记为非竞争性,因为它不符合竞争挑战的要求。
isaacg

2
重新创建此解决方案所需的信息的简单,未经压缩的二进制编码可以为每个逻辑门的类型(3个不同的门)使用2位,为每个逻辑门的输入和输出的每个地址使用10位(675个门加上输入和输出)。2 *(48 + 550 + 77)+ 10 *(2 * 48 + 3 *(550 + 77))= 21120位= 2640字节。
Nnnes

1

Python 3,50个字节,得分602

Python不是最冗长的语言,但50字节很难。

lambda x:all(x.count(y)<1for y in["ful","y","er"])
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.