Nó có phải là danh từ hay không?


22

Cho một chuỗi làm đầu vào, xác định xem đó có phải là danh từ hay không.

Bạn sẽ được chấm điểm trên 1000 từ tiếng Anh phổ biến nhất, bằng bao nhiêu bạn gắn nhãn chính xác là danh từ hay không.

Chương trình hoặc chức năng phân loại chính xác hầu hết các từ đó trong 50 byte trở xuống sẽ giành chiến thắng.

Danh từ

Một danh từ là một từ đại diện cho một sự vật, điển hình. Nó phức tạp hơn, nhưng đó là ý tưởng cơ bản.

Trong trường hợp một từ có thể là danh từ hoặc một phần khác của lời nói, tôi đã phân loại nó thành danh từ, ngay cả khi đó là cách sử dụng hiếm. Hoặc thực sự, tôi để trang web này làm điều đó cho tôi.

Những từ bạn sẽ ghi được là 1000 từ phổ biến , từ Wikipedia đơn giản , với "hai" và "một lần" được thêm vào. Trong số đó, đây là 586 danh từ và đây là 414 danh từ không . Bạn có thể tìm thấy cả ba danh sách ở đây . Lưu ý rằng tất cả các đầu vào này là trong trường hợp thấp hơn. Những danh sách này là cuối cùng - đừng cố tranh luận ngữ pháp.

Chương trình của bạn sẽ được coi là chính xác nếu nó đưa ra kết quả trung thực trên đầu vào là danh từ và kết quả sai lệch trên đầu vào không phải là danh từ.

Tiểu phần:

Các chương trình phải có đầu ra xác định. Nếu bạn muốn sử dụng ngẫu nhiên, hãy gieo nó. Các chương trình không được phép sử dụng danh sách danh từ tích hợp hoặc chức năng một phần của lời nói tích hợp khác.

Ví dụ:

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

Vui lòng cho biết tỷ lệ thành công của chương trình trong câu trả lời của bạn. Chương trình hoặc chức năng của tối đa 50 byte với tỷ lệ thành công cao nhất sẽ giành chiến thắng. Trong trường hợp hòa, số byte thấp nhất sẽ xác định người chiến thắng. Chúc may mắn!

Câu trả lời:


13

JavaScript (ES6), 43 byte, 622 630 633

Chỉ để có được quả bóng lăn. Trả về 1danh từ, 0cho danh từ không.

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

Làm sao?

Chúng tôi đặt cược vào danh từ nếu cả hai điều kiện sau được đáp ứng:

  1. Độ dài từ là 3, 4, 5, 6, 7, 8 hoặc 11. Điều này được thực hiện bằng cách dịch chuyển sang phải số nhị phân 100111111000 (2552 dưới dạng thập phân).
  2. Từ bắt đầu bằng một trong những chữ cái sau: bcdfghijklmpqrstvwy

Ngay khi tôi chuẩn bị bình luận, với suy nghĩ cụ thể của JS, rằng giới hạn byte quá hạn chế, bạn đăng bài này! Tôi đã suy nghĩ, mà không cần nhìn vào danh sách, rằng điểm cao hơn 586 có thể chỉ có thể bằng cách kiểm tra chữ cái đầu tiên hoặc 2 trong mỗi từ. Hoàn thành tốt :)
Shaggy

Một lời giải thích sẽ rất hay, cho những người ít quen thuộc với Javascript. Theo như tôi có thể nói, điều này kiểm tra xem độ dài của từ là 3, 4, 5, 6, 7, 8 hay 11, và từ này cũng bắt đầu bằng một trong các chữ cái?
isaacg

@isaacg Đúng vậy. Giải thích thêm.
Arnauld

4
Lưu ý rằng lớp nhân vật [bcdf-mp-tvwy]tương đương với lớp [^aenouxz]. Một thay đổi sẽ tiết kiệm 4 byte, có thể được viết hoa.
fireflame241

@ fireflame241 Rất đúng. Và điều đó thậm chí có thể được rút ngắn [^aenouz]bởi vì chúng ta không có từ nào bắt đầu bằng a x.
Arnauld

11

Jelly , 48 byte, điểm 731

Đây là câu trả lời đầu tiên của tôi trong Jelly và tôi đã gặp rất nhiều rắc rối khi đặt nó cùng nhau. À ... thật là vui. :-)

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

Lưu 1 byte nhờ @Jonathan ALLan

Hãy thử trực tuyến!

Sự cố và bộ thử nghiệm

  • Các danh từ không được xác định chính xác là các danh từ không: 265/414 (64%)
  • Danh từ được xác định chính xác là danh từ: 466/586 (79,5%)

Làm sao?

Trước tiên, chúng tôi tính toán một hàm băm của chuỗi đầu vào bằng cách:

  • chuyển đổi nó thành một số nguyên bằng cách giải thích từng điểm mã dưới dạng một chữ số cơ sở 256
  • áp dụng modulo 4080 (được chọn là giá trị hiệu quả nhất không quá 12 bit)
  • giữ 8 bit quan trọng nhất của kết quả

Điều này để lại cho chúng tôi một chỉ mục trong [0 ... 255] và do đó chia tất cả các từ thành 256 nhóm.

Đối với mỗi nhóm từ, chúng tôi tính toán trước một cờ nhị phân, 1nếu nhóm chứa nhiều danh từ hơn các danh từ không, và 0nếu không. Điều này dẫn đến số N gồm 256 bit mà chúng ta sẽ sử dụng làm bảng tra cứu. Chúng tôi lưu trữ nó dưới dạng một chuỗi được mã hóa cơ sở 250.

Dưới đây là biểu diễn nhị phân của N .

1000011000001011000101111011111001001101110010101101110010001101
0000010001101010010111110001110010010101110110110010111111010000
0001111010011110000110101011111000011110111011010011011110101100
1010010110101111000010101000101100000001110110100011111000101010

Mà có thể được lưu trữ như “Ạ$ⱮẊḲḲLÑMṆụ⁻ẉṂ`ŻvḤæɠ5ṭȯƁU*×TdƲḥ`’trong Jelly.

Do đó mã:

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

Công việc tốt! Lưu một byte để khởi động với O‘ḅ⁹%⁽€Oæ»4“Ạ$ⱮẊḲḲLÑMṆụ⁻ẉṂ`ŻvḤæɠ5ṭȯƁU*×TdƲḥ`’æ»Ḃ(cũng lưu ý bạn có thể sử dụng chân trang trên TIO, tôi sẽ đi cùng Ç€¬S,LÇ€S,Lcho hai bộ thử nghiệm của bạn.
Jonathan Allan

@Jonathan ALLan Cảm ơn những lời khuyên!
Arnauld

10

JavaScript (ES6), 50 byte, điểm 693

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

Chỉ cần tìm bất kỳ mẫu nào có thể mà các danh từ không có danh từ đó không có.

Các danh từ không thường xuyên hơn chứa:

  1. a, o, u hoặc z là chữ cái đầu tiên.
  2. th là hai chữ cái đầu tiên.
  3. Hai chữ cái thôi. [Hãy nghĩ đại từ (tôi, chúng tôi, chúng tôi, anh ấy, nó) và giới từ (của, đến, trong, trên, bởi, tại, lên, ...).]
  4. e , theo sau là một hoặc nhiều chữ cái, theo sau là e hoặc y .
  5. f, l hoặc o , theo sau là bất kỳ chữ cái nào, theo sau là r .
  6. a , tiếp theo là bất kỳ chữ cái nào, tiếp theo là p .

Đoạn trích:


Tôi tin rằng bạn có thể lưu một byte bằng cách thay đổi regex đầu tiên thành /h|n/(hoặc bằng cách thực hiện /^.[hn]/.test(s)) và một byte khác bằng cách thay đổi s[2]>''thành !!s[2]hoặc 2 in s.
Sản xuất ETH

Cảm ơn, @ETHproductions. Tôi có thể sử dụng các đề xuất của bạn kết hợp hai bài kiểm tra để lưu một loạt byte, cho phép tôi thêm mã để cải thiện điểm số của mình.
Rick Hitchcock

Không a.pdư thừa vì bạn đã có [aouz]?
admBorkBork

@AdmBorkBork, a in chỉ [aouz]được khớp khi ở đầu chuỗi. Vì lý do nào, kiểm tra cho a.p bất cứ nơi nào trong chuỗi cải thiện điểm số.
Rick Hitchcock

10

Jelly , 50 byte , điểm 763

Sử dụng hàm băm ngay bây giờ (giống như câu trả lời Jelly của Arnauld )

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

Dùng thử trực tuyến!

250/414 cho Danh từ không
513/586 cho Danh từ
Tổng số = 250 + 513 = 763.

Làm sao?

Xây dựng một bảng với 308 mục, 1 (xác định danh từ) hoặc 0 (xác định danh từ không) và lập chỉ mục vào đó bằng khóa được cung cấp bởi hàm băm sử dụng sản phẩm của các thứ tự của từ đầu vào:

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)

Trước:  50  47 byte , điểm 684

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

Một liên kết đơn âm lấy một từ và trả về danh sách một ký tự (trung thực) nếu từ đó được xác định là danh từ hoặc danh sách trống hoặc số không (cả falsey) nếu không.

Hãy thử trực tuyến! (chân trang thực hiện nếu có kết quả khác để inNounhoặcNon-Noun)
... hoặc xem chương trình tính điểm (đếm các chỉ số trung thực trên hai danh sách và sau đó tính điểm).

Phân tích điểm: 462/586 danh từ được xác định chính xác (124 không chính xác), 222/414 danh từ không xác định chính xác (192 không chính xác) - tổng số chính xác = 684/1000.

Làm sao?

Đoán nó không phải là một danh từ nếu ...

  • ký tự cuối cùng và ký tự hai trước đó bằng nhau (với lập chỉ mục dựa trên mô-đun và 1)
  • một trong hai chuỗi con 2 chiều dài đầu tiên nằm trong:
    'be', 'th', 'le', 'he', 'm ', 'ev', 'et', 's ', 'fl', 'ax', 'en', 'fo', 'am', 'az' (lưu ý: 'm ''s 'chỉ ở đây để dễ nén, nhưng chúng không bao giờ xuất hiện)
  • Các -299 thứ index (với mô-đun và 1 dựa trên indexing) là bất kỳ:
    aenouyz(mặc dù điều này được thực hiện nghịch và với chữ in hoa dư thừa)
    ... từ những lời tất cả đều có chiều dài từ 1 đến 11 -299 ngày chỉ số này tương đương để sử dụng độ dài để ánh xạ chỉ mục:{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, điểm: 638

Bash nhanh đầu tiên (mở rộng ở trên)

ØY⁾niyṖf⁽ż2ị$

0,-2điều đó không có pair zero with -2nghĩaliteral [0, -2]
Erik the Outgolfer 13/08/17

Nhưng đó là hiệu ứng rất giống nhau: p
Jonathan Allan

không, nó không phải 0,-2là một con số không, không tách rời (0)(,)(-2)... tất nhiên nó cũng có tác dụng tương tự trong trường hợp này nhưng không phải lúc nào cũng vậy. Tôi đã học được rằng cách khó khăn ... và bất kể trường hợp nào tôi cũng muốn giải thích những gì thực sự xảy ra thay vì một cái gì đó có cùng tác dụng hoặc một cái gì đó.
Erik the Outgolfer

Nếu tôi viết "tham gia" thay vì "cặp", bạn có nhận xét "không tham gia là j" không?
Jonathan Allan

Tôi có thể là một chút mô phạm, nhưng pairhoặc joinrõ ràng là những cách sai để diễn đạt nó, 0,-2,-6ví dụ như vì nó không có nghĩa pair 0 with -2 and then pair that with -6 = [[0, -2], -6]nhưng nó có nghĩa là literal [0, -2, -6]. Tôi hiểu rồi, , nguyên tử...,...(,...(...)) nghĩa đen thật khó hiểu ... nhưng stilll 0,-2,-6không hoàn toàn giống như 0,-2;-6vì cái trước là 1 liên kết và cái sau là 3 liên kết.
Erik the Outgolfer

2

Julia 34byte, 609

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

Tôi muốn lưu vào các ký tự bằng cách sử dụng hàm băm dựng sẵn. Tôi cảm thấy như phải có một cách để làm điều này tốt hơn. Julia chỉ không đủ thân thiện với các hoạt động đập mà tôi muốn sử dụng để làm cho điều này tốt hơn tôi nghĩ.

Tìm bitmasks phù hợp cho hàm băm để tách chúng, là một trò chơi thú vị.


Giải pháp tốt nhất;)
tamasgal

2

Python 2 , 50 byte, độ chính xác: 596

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

Hãy thử trực tuyến!

Đơn giản chỉ cần kiểm tra chữ cái đầu tiên, độ dài và liệu "st" có trong từ Mã giả định rằng từ đó được định nghĩa là x (Chỉnh sửa: Nhờ cóacacg để sửa mã từ đoạn trích thành chức năng)


Xin chào, chào mừng đến với trang web. Trong khi điều này là thú vị, các bài nộp được yêu cầu hoặc là chương trình hoặc chương trình đầy đủ. Đây là một đoạn, không được phép. Xem này Hãy thử trực tuyến! liên kết để tìm cách chuyển đoạn mã này thành hàm trong khi vẫn thực thi cùng mã.
isaacg

2

Haskell, 36 byte, 626 631

f x=length x>2&&x!!0`notElem`"aenou"

643 nếu bất cứ ai có ngôn ngữ ngắn hơn:length x>2&&(x!!0`notElem`"aenou"||x!!1`elem`"acqrsty")
BlackCap

2

Thực hiện cổng logic 2 cấp, không phải 50 byte, điểm 1000

  1. Chỉ cần cắm biểu diễn nhị phân của từ đã cho vào 88 đầu vào

    1. hoàn thành từ đầu vào theo khoảng trắng ở bên phải nếu độ dài của từ nhỏ hơn 11
    2. Mã ASCII 8 bit cho mỗi chữ cái của từ đầu vào
  2. Mạch trả về 1 nếu từ là danh từ và trả về 0 nếu không

  3. Các đường đứt nét màu xanh là dành cho đầu vào không bao giờ được sử dụng

Việc thực hiện này cần

  1. 48 bóng bán dẫn để mã hóa tất cả các cổng biến tần
  2. 1100 bóng bán dẫn để mã hóa tất cả các cổng AND
  3. 154 bóng bán dẫn để mã hóa cổng OR
  4. Tổng cộng 1302 bóng bán dẫn đại diện cho ít hơn 28 byte.

Một số phép đo

  1. Một cổng biến tần cần 1 bóng bán dẫn
  2. Một cổng OR đơn giản 2 đầu vào cần 2 bóng bán dẫn
  3. Một cổng AND đơn giản 2 đầu vào cần 2 bóng bán dẫn
  4. Một bit cần 6 bóng bán dẫn

nhập mô tả hình ảnh ở đây

Độ phân giải đầy đủ Circuit.pdf tại đây

Độ phân giải đầy đủ Circuit.png tại đây


2
Bạn có thể giải thích chính xác hệ thống của bạn để mã hóa mạch này thành byte là gì không? Tôi rất bối rối về cách bạn yêu cầu sử dụng 28 * 8/162 = 0,17 bit cho mỗi bóng bán dẫn.
isaacg

Vì giải pháp của tôi là một giải pháp máy tính cấp thấp (phần cứng chứ không phải phần mềm), tôi dựa vào việc đếm byte của mình trên các bóng bán dẫn. Theo quan điểm phần cứng của Fro, BIT được mã hóa bởi 6 bóng bán dẫn, vì vậy chúng ta có thể giả sử rằng một bóng bán dẫn đại diện cho 1/6 bit (khoảng 0,17).
mdahmoune

1
Tôi hiểu quan điểm của bạn, tuy nhiên nguồn mã 50 byte cần tồn tại ở đâu đó trên một phần cứng cụ thể (nói chung là bóng bán dẫn)
mdahmoune

1
Đó không chỉ là một quan điểm - đó là một yêu cầu của thách thức. Vui lòng đánh dấu câu trả lời của bạn là không cạnh tranh, vì nó không đáp ứng các yêu cầu để cạnh tranh trong thử thách này.
isaacg

2
Mã hóa nhị phân đơn giản, không nén của thông tin cần thiết để tạo lại giải pháp này có thể sử dụng 2 bit cho loại của mỗi cổng logic (3 cổng khác nhau) và 10 bit cho mỗi địa chỉ của mỗi đầu vào và đầu ra của cổng logic (675 cổng cộng đầu vào và đầu ra). 2 * (48 + 550 + 77) + 10 * (2 * 48 + 3 * (550 + 77)) = 21120 bit = 2640 byte.
Nnnes

1

Python 3, 50 byte, điểm 602

Python không phải là ngôn ngữ dài dòng nhất, nhưng 50 byte là khó khăn.

lambda x:all(x.count(y)<1for y in["ful","y","er"])
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.