名詞ですか?


22

入力として文字列を指定し、それが名詞かどうかを判断します。

名詞として正しくラベル付けするかどうかで、最も一般的な1000の英単語でスコアが付けられます。

これらの単語のほとんどを50バイト以下に正しく分類するプログラムまたは関数が勝ちます。

名詞

名詞は、通常、物を表す言葉です。より複雑になりますが、それが基本的な考え方です。

単語が名詞または他の品詞のいずれかである可能性がある場合、それがまれな用法であっても、それを名詞として分類しました。または、実際に、このサイトに私のためにそれをさせました。

あなたが採点される単語は、これらの1000の一般的な単語です。これは単純なWikipediaからのもので、「2」と「1回」が追加されています。それらのうち、これらは586名詞であり、これらは414非名詞です。ここで 3つのリストをすべて見つけることができます。これらの入力はすべて小文字であることに注意してください。これらのリストは最終的なものです-文法を主張しようとしないでください。

名詞である入力で真実の結果を出力し、名詞ではない入力で偽の結果を出力する場合、プログラムは正しいと見なされます。

微妙:

プログラムには確定的な出力が必要です。ランダム性を使用する場合は、シードします。プログラムでは、組み込みの名詞リストまたはその他の組み込みの品詞機能を使用できません。

例:

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です。これは、2進数100111111000(10進数で2552)を右シフトすることによって行われます。
  2. 単語は次の文字のいずれかで始まります。 bcdfghijklmpqrstvwy

私がコメントしようとしていたところで、特にJSを念頭に置いて、バイト制限が非常に制限的であったとあなたはこれを投稿します!リストを見ずに、各単語の最初の文字または2をテストするだけで、586よりも良いスコアが得られる可能性があると考えていました。うまくやった:)
シャギー

Javascriptに慣れていない人には説明がいいでしょう。私が知る限り、これは単語の長さが3、4、5、6、7、8または11であるかどうかをチェックし、単語も文字のセットの1つで始まりますか?
isaacg

@isaacgそうですね。説明を追加しました。
アーナルド

4
文字クラス[bcdf-mp-tvwy]はclass と同等であることに注意してください[^aenouxz]。変更により4バイト節約され、大文字を使用できます。
fireflame241

@ fireflame241非常に本当です。そして[^aenouz]x。で始まる単語がないため、それを短縮することさえできます。
アーナルド

11

ゼリー、48バイト、スコア731

これはゼリーでの私の初めての回答であり、これをまとめるのに苦労しました。まあ...それは楽しかったです。:-)

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

@JonathanAllanのおかげで1バイト節約

オンラインでお試しください!

内訳とテストスイート

  • 非名詞が非名詞として正しく識別される: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あなたの2つのテストスイートのため。
ジョナサン・アラン

@JonathanAllanヒントをありがとう!
アーナルド

10

JavaScript(ES6)、50バイト、スコア693

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

名詞にはない、名詞にはないパターンを探しているだけです。

多くの場合、非名詞には次のものが含まれます。

  1. 最初の文字としてa、o、u、またはz
  2. 最初の2つの文字として。
  3. 2文字のみ。[代名詞(私、私たち、私たち、彼、それ)と前置詞(of、to、in、on、by、at、up、...)を考えてください。]
  4. e、その後に1つ以上の文字、eまたはyが続きます。
  5. f、l、またはoの後に任意の文字が続き、その後にrが続きます。
  6. a、その後に任意の文字、pが続きます。

スニペット:


最初の正規表現をに変更することで/h|n/(または実行することで/^.[hn]/.test(s))バイトを節約できs[2]>''!!s[2]またはに変更することで別のバイトを節約できると思います2 in s
ETHproductions

ありがとう、@ ETHproductions。あなたの提案使用し、2つのテストを組み合わせて大量のバイトを節約できます。これにより、スコアを改善するためのコードを追加できました。
リックヒッチコック

a.pあなたはすでに持っているので、冗長ではありません[aouz]か?
AdmBorkBork

@ AdmBorkBork、a in [aouz]は文字列の先頭でのみ一致します。何らかの理由で、文字列のa.p 任意の場所をテストするとスコアが向上します。
リックヒッチコック

10

ゼリー、50 バイト、スコア763

ハッシュを使用する(ArnouldのJelly answerによく似ています

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

オンラインでお試しください!

250用/ 414 非名詞
のための586分の513 名詞
合計= + 513 = 763 250。

どうやって?

1(名詞を識別する)または0(非名詞を識別する)の308エントリを持つテーブルを構築し、入力語の序数の積を利用するハッシュ関数によって提供されるキーを使用してインデックスを作成します。

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

単語を取り、その単語が名詞として識別される場合は1文字(真)のリストを返し、そうでない場合は空のリストまたはゼロ(両方とも偽)を返すモナドリンク。

オンラインでお試しください!(フッターは、結果に対してif elseを実行して印刷NounまたはNon-Noun
...またはスコアリングプログラムを確認します(2つのリストで真のインデックスをカウントし、スコアを計算します)。

スコアの内訳:462/586名詞が正しく識別(124が正しくない)、222/414名詞以外が正しく識別(192が正しくない)-合計正解= 684/1000

どうやって?

次の場合は名詞ではないと思います...

  • 最後の文字とその前の2文字が等しい(モジュラーおよび1ベースのインデックス付けを使用)
  • 最初の2つの長さ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)...もちろん、この場合は同じ効果ですが、常にではありません。私は難しい方法を学びました...そして、とにかく同じ効果や何かを持つものの代わりに実際に何が起こるかを説明したい場合はどうでもいいです。
エリックアウトゴルファー

「ペア」ではなく「結合」と書いた場合、「結合なし」とコメントしjますか?
ジョナサンアラン

私は少し教訓的かもしれませんが、pairまたはそれを言い表すのjoinは明らかに間違った方法0,-2,-6です。例えば、という意味pair 0 with -2 and then pair that with -6 = [[0, -2], -6]ではなく、むしろという意味literal [0, -2, -6]です。私はそれを理解します、, アトム...,...(,...(...)) リテラルは混乱しています...しかし、まだ前者は1リンクであり、後者は3リンクであるため、0,-2,-6まだ同じではありません0,-2;-6
エリックアウトゴルファー

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

オンラインでお試しください!

最初の文字、長さ、および単語に「st」が含まれているかどうかを単純にチェックします。コードは、単語がxとして定義されていることを前提としています。


こんにちは、サイトへようこそ。これは興味深いものですが、提出は機能または完全なプログラムである必要があります。これはスニペットであり、許可されていません。こちらをご覧くださいオンラインでお試しください!同じコードを実行しながらこのスニペットを関数に変換する方法のリンク。
isaacg


2

50バイトではなく、2レベルの論理ゲートの実装、スコア1000

  1. 与えられた単語のバイナリ表現を88個の入力に接続するだけです

    1. 単語の長さが11未満の場合、入力単語の右側にスペースを入れます
    2. 入力ワードの各文字の8ビットASCIIコード
  2. 単語が名詞の場合、回路は1を返し、そうでない場合は0を返します

  3. 青い破線は使用されていない入力用です

この実装には

  1. すべてのインバーターゲートをエンコードする48個のトランジスター
  2. すべてのANDゲートをエンコードする1100個のトランジスタ
  3. ORゲートをエンコードする154個のトランジスタ
  4. 28バイト未満を表す合計1302個のトランジスタ。

いくつかの測定

  1. インバータゲートは、1トランジスタを必要とします
  2. 2入力の単純なOR ゲートには2つのトランジスタが必要
  3. 2入力の単純なANDゲートには2つのトランジスタが必要
  4. 1 ビットに 6個のトランジスタが必要

ここに画像の説明を入力してください

完全な解像度のCircuit.pdfはこちら

フル解像度Circuit.pngはこちら


2
この回路をバイトにエンコードするシステムを正確に説明していただけますか?トランジスタあたり28 * 8/1302 = 0.17ビットを使用すると主張する方法が非常に混乱しています。
isaacg

私のソリューションは非常に低レベルのコンピューターソリューション(ソフトウェアではなくハードウェア)なので、バイトカウントはトランジスタに基づいています。ハードウェアの観点では、BITは6個のトランジスタでエンコードされているため、1個のトランジスタが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

Python 3、50バイト、スコア602

Pythonは最も冗長な言語ではありませんが、50バイトは厳しいです。

lambda x:all(x.count(y)<1for y in["ful","y","er"])
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.