Apakah itu kata benda atau bukan?

22

Diberikan string sebagai input, tentukan apakah itu kata benda atau bukan.

Anda akan dinilai berdasarkan 1000 kata bahasa Inggris yang paling umum, dengan berapa banyak Anda benar label sebagai kata benda atau tidak.

Program atau fungsi yang dengan benar mengklasifikasikan sebagian besar kata-kata itu dalam 50 byte atau kurang akan menang.

Kata benda

Kata benda adalah kata yang mewakili sesuatu, biasanya. Itu menjadi lebih kompleks, tapi itu ide dasarnya.

Dalam kasus di mana sebuah kata bisa menjadi kata benda atau bagian lain dari pidato, saya mengklasifikasikannya sebagai kata benda, meskipun itu jarang digunakan. Atau sebenarnya, saya membiarkan situs ini melakukannya untuk saya.

Kata-kata yang akan Anda beri nilai adalah 1000 kata umum ini , yang berasal dari Wikipedia sederhana , dengan "dua" dan "sekali" ditambahkan. Dari mereka, ini adalah 586 kata benda , dan ini adalah 414 kata benda . Anda dapat menemukan ketiga daftar di sini . Perhatikan bahwa semua input ini dalam huruf kecil. Daftar ini adalah final - jangan mencoba untuk memperdebatkan tata bahasa.

Program Anda akan dianggap benar jika output truthy hasil pada input yang merupakan kata benda, dan hasil falsy pada input yang tidak kata benda.

Kehalusan:

Program harus memiliki keluaran deterministik. Jika Anda ingin menggunakan keacakan, bibit itu. Program tidak diizinkan untuk menggunakan daftar kata benda bawaan atau fungsi bagian-suara bawaan lainnya.

Contoh:

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

Harap tunjukkan berapa tingkat keberhasilan program Anda dalam jawaban Anda. Program atau fungsi paling banyak 50 byte dengan kemenangan tingkat keberhasilan tertinggi. Dalam kasus seri, jumlah byte terendah akan menentukan pemenang. Semoga berhasil!

isaacg
sumber

Jawaban:

13

JavaScript (ES6), 43 byte, 622 630 633

Hanya untuk membuat bola bergulir. Pengembalian 1untuk kata benda, 0untuk non-kata benda.

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

Bagaimana?

Kami bertaruh pada kata benda jika kedua kondisi berikut dipenuhi:

  1. Panjang kata adalah 3, 4, 5, 6, 7, 8 atau 11. Ini dilakukan dengan menggeser-kanan angka biner 100111111000 (2552 sebagai desimal).
  2. Kata itu dimulai dengan salah satu dari surat-surat ini: bcdfghijklmpqrstvwy
Arnauld
sumber
Sama seperti saya akan berkomentar, dengan JS khusus dalam pikiran, bahwa batas byte terlalu ketat, Anda memposting ini! Saya berpikir, tanpa melihat daftar itu, bahwa skor yang lebih baik daripada 586 hanya mungkin dengan menguji huruf pertama atau kedua di setiap kata. Bagus sekali :)
Shaggy
Penjelasan akan menyenangkan, untuk orang yang kurang terbiasa dengan Javascript. Sejauh yang saya tahu, ini memeriksa apakah panjang kata adalah 3, 4, 5, 6, 7, 8 atau 11, dan kata itu juga dimulai dengan satu set huruf?
isaacg
@isaacg Benar. Penjelasan ditambahkan.
Arnauld
4
Perhatikan bahwa kelas karakter [bcdf-mp-tvwy]setara dengan kelas [^aenouxz]. Perubahan akan menghemat 4 byte, yang dapat dikapitalisasi.
fireflame241
@ fireflame241 Sangat benar. Dan itu bahkan dapat disingkat menjadi [^aenouz]karena kita tidak memiliki kata yang dimulai dengan a x.
Arnauld
11

Jelly , 48 byte, skor 731

Ini adalah jawaban pertama saya di Jelly dan saya mengalami banyak kesulitan untuk menyatukan ini. Ah well ... itu tadi menyenangkan. :-)

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

1 byte disimpan berkat @JonathanAllan

Cobalah online!

Suite pemecahan dan uji

  • Non-kata benda diidentifikasi dengan benar sebagai non-kata benda: 265/414 (64%)
  • Kata benda diidentifikasi dengan benar sebagai kata benda: 466/586 (79,5%)

Bagaimana?

Kami pertama menghitung hash dari string input dengan:

  • mengubahnya menjadi integer dengan menginterpretasikan setiap titik kode sebagai basis-256 digit
  • menerapkan modulo 4080 (dipilih sebagai nilai paling efisien tanpa lebih dari 12 bit)
  • menjaga 8 bit paling signifikan dari hasilnya

Ini membuat kita memiliki indeks dalam [0 ... 255] dan dengan demikian membagi semua kata menjadi 256 grup.

Untuk setiap grup kata, kami menghitung sebelumnya bendera biner yang 1jika grup tersebut berisi lebih banyak kata benda daripada bukan kata benda, dan 0sebaliknya. Ini mengarah ke angka 256-bit N yang akan kita gunakan sebagai tabel pencarian. Kami menyimpannya sebagai string dasar-250 yang dikodekan.

Di bawah ini adalah representasi biner dari N .

1000011000001011000101111011111001001101110010101101110010001101
0000010001101010010111110001110010010101110110110010111111010000
0001111010011110000110101011111000011110111011010011011110101100
1010010110101111000010101000101100000001110110100011111000101010

Yang bisa disimpan seperti “Ạ$ⱮẊḲḲLÑMṆụ⁻ẉṂ`ŻvḤæɠ5ṭȯƁU*×TdƲḥ`’di Jelly.

Karena itu kodenya:

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
sumber
Pekerjaan yang baik! Simpan byte untuk mem-boot dengan O‘ḅ⁹%⁽€Oæ»4“Ạ$ⱮẊḲḲLÑMṆụ⁻ẉṂ`ŻvḤæɠ5ṭȯƁU*×TdƲḥ`’æ»Ḃ(perhatikan juga Anda dapat menggunakan footer di TIO, saya akan pergi dengan Ç€¬S,Ldan Ç€S,Luntuk dua suite pengujian Anda.
Jonathan Allan
@ Jonathan Allan Terima kasih atas tipsnya!
Arnauld
10

JavaScript (ES6), 50 byte, skor 693

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

Hanya mencari kemungkinan pola yang tidak dimiliki oleh kata benda yang tidak dimiliki oleh kata benda.

Non-kata benda lebih sering mengandung:

  1. a, o, u, atau z sebagai huruf pertama.
  2. th sebagai dua huruf pertama.
  3. Hanya dua huruf. [Pikirkan kata ganti (saya, kami, kami, dia, itu) dan preposisi (dari, untuk, di, pada, oleh, di, atas, ...).]
  4. e , diikuti oleh satu atau lebih huruf, diikuti oleh e atau y .
  5. f, l, atau o , diikuti oleh huruf apa saja, diikuti oleh r .
  6. a , diikuti oleh huruf apa saja, diikuti oleh h .

Potongan:

Rick Hitchcock
sumber
Saya percaya Anda dapat menyimpan byte dengan mengubah regex pertama menjadi /h|n/(atau dengan melakukan /^.[hn]/.test(s)), dan yang lain dengan mengubah s[2]>''salah satu !!s[2]atau 2 in s.
ETHproduksi
Terima kasih, @ETHproductions. Saya dapat menggunakan saran Anda dan menggabungkan dua tes untuk menyimpan banyak byte, yang memungkinkan saya untuk menambahkan kode untuk meningkatkan skor saya.
Rick Hitchcock
Tidak a.pberlebihan karena Anda sudah memilikinya [aouz]?
AdmBorkBork
@AdmBorkBork, yang seorang di [aouz]cocok hanya ketika pada awal string. Untuk alasan apa pun, pengujian di a.p mana saja di string meningkatkan skor.
Rick Hitchcock
10

Jelly , 50 byte , skor 763

Menggunakan hash sekarang (seperti jawaban Jelly Arnauld )

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

Cobalah secara Online!

250/414 untuk Non-Nouns
513/586 untuk Nouns
Total = 250 + 513 = 763.

Bagaimana?

Buat tabel dengan 308 entri, baik 1 (mengidentifikasi kata benda) atau 0 (mengidentifikasi bukan kata benda) dan indeks ke dalamnya menggunakan kunci yang disediakan oleh fungsi hash yang memanfaatkan produk dari tata cara kata input:

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)

Sebelumnya:  50  47 byte , skor 684

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

Tautan monadik mengambil kata dan mengembalikan daftar satu karakter (kebenaran) jika kata itu diidentifikasi sebagai kata benda, atau daftar kosong atau nol (keduanya falsey) jika tidak.

Cobalah online! (footer melakukan if if pada hasil untuk mencetakNounatauNon-Noun)
... atau lihat program penilaian (menghitung indeks kebenaran di kedua daftar dan kemudian menghitung skor).

Rincian skor: 462/586 kata benda diidentifikasi dengan benar (124 salah), 222/414 kata benda diidentifikasi dengan benar (192 salah) - total benar = 684/1000.

Bagaimana?

Kira itu bukan kata benda jika ...

  • karakter terakhir dan karakter dua sebelum yang sama (dengan pengindeksan modular dan berbasis 1)
  • salah satu dari dua panjang pertama 2 substring ada di:
    'be', 'th', 'le', 'he', 'm ', 'ev', 'et', 's ', 'fl', 'ax', 'en', 'fo', 'am', 'az' (catatan: 'm 'dan's ' hanya ada di sini untuk memudahkan kompresi, tetapi keduanya tidak pernah muncul)
  • The -299 th Indeks (dengan modular dan 1 berbasis pengindeksan) adalah salah satu dari:
    aenouyz(meskipun hal ini dilaksanakan terbalik dan dengan huruf kapital berlebih)
    ... karena kata-kata semua memiliki panjang antara 1 dan 11 yang -299 th Indeks setara untuk menggunakan panjang untuk pemetaan indeks:{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 byte, skor: 638

Pesta cepat pertama (diperpanjang di atas)

ØY⁾niyṖf⁽ż2ị$
Jonathan Allan
sumber
0,-2tidak berarti pair zero with -2itu berartiliteral [0, -2]
Erik the Outgolfer
Tapi itu efek yang sama: p
Jonathan Allan
tidak itu bukan 0,-2nilad, tidak terpisah (0)(,)(-2)... tentu saja itu efek yang sama dalam kasus ini tetapi tidak selalu. Saya belajar bahwa dengan cara yang sulit ... dan apa pun masalahnya saya lebih suka menjelaskan apa yang sebenarnya terjadi daripada sesuatu dengan efek yang sama atau sesuatu.
Erik the Outgolfer
Jika saya menulis "gabung" daripada "pasangan" apakah Anda akan berkomentar "tidak bergabung adalah j"?
Jonathan Allan
Saya mungkin agak sedikit berlebihan, tetapi pairatau joinjelas cara yang salah untuk mengatakannya, karena 0,-2,-6misalnya tidak berarti pair 0 with -2 and then pair that with -6 = [[0, -2], -6]tetapi lebih berarti literal [0, -2, -6]. Saya mengerti, , atom dan ...,...(,...(...)) literalnya membingungkan ... tapi 0,-2,-6tetap saja tidak sama dengan 0,-2;-6karena yang pertama adalah 1 tautan dan yang terakhir adalah 3 tautan.
Erik the Outgolfer
2

Julia 34bytes, 609

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

Saya ingin menghemat karakter dengan menggunakan hash bawaan. Saya merasa harus ada cara untuk melakukan ini dengan lebih baik. Julia tidak cukup ramah dengan operasi bit-banging yang ingin saya gunakan untuk membuat ini lebih baik menurut saya.

Menemukan bitmask yang cocok untuk hash untuk memisahkan mereka, adalah permainan yang menarik.

Lyndon White
sumber
Solusi terbaik;)
tamasgal
2

Python 2 , 50 byte, akurasi: 596

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

Cobalah online!

Cukup periksa huruf pertama, panjang, dan apakah "st" ada dalam kata Code mengasumsikan bahwa kata didefinisikan sebagai x (Edit: Terima kasih kepada issacg untuk memperbaiki kode dari snippet ke fungsi)

Husnain Raza
sumber
Hai, selamat datang di situs ini. Meskipun ini menarik, pengiriman diperlukan untuk menjadi program penuh atau penuh. Ini cuplikan, yang tidak diizinkan. Lihat ini, Coba online! tautan cara mengonversi cuplikan ini ke suatu fungsi sambil tetap menjalankan kode yang sama.
isaacg
2

Haskell, 36 byte, 626 631

f x=length x>2&&x!!0`notElem`"aenou"
BlackCap
sumber
643 kalau ada yang punya bahasa lebih pendek:length x>2&&(x!!0`notElem`"aenou"||x!!1`elem`"acqrsty")
BlackCap
2

Implementasi gerbang logika 2 tingkat, bukan 50 byte, skor 1000

  1. Cukup tancapkan representasi biner dari kata yang diberikan ke 88 input

    1. lengkapi kata input dengan spasi di kanan jika panjang kata kurang dari 11
    2. Kode ASCII 8-bit untuk setiap huruf dari kata yang dimasukkan
  2. Rangkaian mengembalikan 1 jika kata adalah kata benda, dan mengembalikan 0 jika tidak

  3. Garis putus-putus biru adalah untuk input yang tidak pernah digunakan

Kebutuhan implementasi ini

  1. 48 transistor untuk menyandikan semua gerbang inverter
  2. 1100 transistor untuk mengkodekan semua gerbang AND
  3. 154 transistor untuk menyandikan gerbang OR
  4. Total 1302 transistor yang mewakili kurang dari 28 byte.

Beberapa pengukuran

  1. Sebuah inverter gerbang membutuhkan 1 transistor
  2. A 2-input sederhana ATAU Gerbang membutuhkan 2 transistor
  3. Gerbang AND 2-input sederhana membutuhkan 2 transistor
  4. Satu bit membutuhkan 6 transistor

masukkan deskripsi gambar di sini

Resolusi penuh Circuit.pdf di sini

Resolusi penuh Circuit.png di sini

mdahmoune
sumber
2
Bisakah Anda menjelaskan dengan tepat apa sistem Anda untuk pengkodean sirkuit ini menjadi byte? Saya sangat bingung bagaimana Anda mengklaim menggunakan 28 * 8/1302 = 0,17 bit per transistor.
isaacg
Karena solusi saya adalah solusi komputer tingkat sangat rendah (perangkat keras daripada perangkat lunak), saya mendasarkan penghitungan byte pada transistor. Dari sudut pandang hardware, BIT dikodekan oleh 6 transistor, sehingga kita dapat mengasumsikan bahwa satu transistor mewakili 1/6 bit (sekitar 0,17).
mdahmoune
1
Saya mengerti sudut pandang Anda, namun sumber kode 50 byte perlu ada di suatu tempat pada perangkat keras beton (umumnya transistor)
mdahmoune
1
Ini bukan hanya sudut pandang - ini merupakan persyaratan tantangan. Harap tandai jawaban Anda sebagai tidak bersaing, karena tidak memenuhi persyaratan untuk bersaing dalam tantangan ini.
isaacg
2
Pengkodean biner sederhana dan terkompresi dari informasi yang diperlukan untuk membuat ulang solusi ini dapat menggunakan 2 bit untuk jenis setiap gerbang logika (3 gerbang berbeda) dan 10 bit untuk setiap alamat dari setiap input gerbang logika dan output (675 gerbang plus input dan output). 2 * (48 + 550 + 77) + 10 * (2 * 48 + 3 * (550 + 77)) = 21120 bit = 2640 byte.
Nnnes
1

Python 3, 50 byte, skor 602

Python bukan bahasa yang paling verbose, tetapi 50 byte sulit.

lambda x:all(x.count(y)<1for y in["ful","y","er"])
L3viathan
sumber