명사인가?


22

문자열을 입력으로 지정하여 명사인지 여부를 판별하십시오.

1000 개의 가장 일반적인 영어 단어에서 명사로 올바르게 레이블을 붙인 수에 따라 점수가 매겨집니다.

대부분의 단어를 50 바이트 이하로 올바르게 분류하는 프로그램 또는 함수가 우선합니다.

명사

명사는 일반적으로 사물을 나타내는 단어입니다. 더 복잡해 지지만 이것이 기본 아이디어입니다.

단어가 명사 또는 어휘의 일부일 수있는 경우에는 드물게 사용 되더라도 명사로 분류했습니다. 또는 실제로, 나는 이 사이트 가 나를 위해 그것을하게했다.

점수를받을 단어는 1000 개의 일반적인 단어로 , 간단한 위키 백과 에서 온 단어 이며 "2"와 "한 번"이 추가되었습니다. 이 중 586 명은 414 명 , 비명 사는 414 명 입니다. 여기에서 세 가지 목록을 모두 찾을 수 있습니다 . 이 모든 입력은 소문자입니다. 이 목록은 최종적입니다. 문법을 주장하려고하지 마십시오.

명사 인 입력에 대해 정확한 결과를 출력 하고 명사가 아닌 입력에 대해 잘못된 결과를 출력하면 프로그램이 올바른 것으로 간주됩니다 .

미묘함 :

프로그램은 결정적인 결과를 가져야합니다. 임의성을 사용하려면 파종하십시오. 프로그램은 내장 명사 목록 또는 기타 내장 품사 기능을 사용할 수 없습니다.

예 :

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

귀하의 프로그램 성공률을 귀하의 답변에 기재하십시오. 성공률이 가장 높은 최대 50 바이트의 프로그램 또는 기능이 승리합니다. 동점 인 경우 가장 낮은 바이트 수로 승자가 결정됩니다. 행운을 빕니다!

답변:


13

자바 스크립트 (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 (10 진수로 2552)을 오른쪽으로 이동하여 수행됩니다.
  2. 단어는 다음 문자 중 하나로 시작합니다. bcdfghijklmpqrstvwy

특히 JS를 염두에두고 바이트 제한이 너무 제한적이라는 것을 언급하려고하는 것처럼 이것을 게시하십시오! 나는 목록을 보지 않고 586보다 높은 점수가 각 단어의 첫 글자 또는 2를 테스트함으로써 가능할 것이라고 생각했습니다. 멋지게 완료 :)
얽히고 설킨

Javascript에 익숙하지 않은 사람들에게는 설명이 좋을 것입니다. 내가 알 수있는 한, 단어 길이가 3, 4, 5, 6, 7, 8 또는 11인지 확인하고 단어도 문자 세트 중 하나로 시작합니까?
isaacg

@isaacg 맞습니다. 설명이 추가되었습니다.
Arnauld

4
문자 클래스 [bcdf-mp-tvwy]는 클래스 와 동일합니다 [^aenouxz]. 변경하면 4 바이트를 절약 할 수 있으며 이는 대문자로 표시 될 수 있습니다.
fireflame241 '

@ fireflame241 매우 그렇습니다. 그리고 [^aenouz]로 시작하는 단어가 없기 때문에 단축 될 수도 있습니다 x.
Arnauld

11

젤리 , 48 바이트, 731 점

이것은 젤리의 첫 번째 대답이며 이것을 결합시키는 데 많은 어려움을 겪었습니다. 아 잘 ... 그것은 재미 있었다. :-)

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

@JonathanAllan 덕분에 1 바이트 절약

온라인으로 사용해보십시오!

고장 및 테스트 스위트

방법?

먼저 다음을 통해 입력 문자열의 해시를 계산합니다.

  • 각 코드 포인트를 기본 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당신이 개 테스트 스위트에 대한.
조나단 앨런에게

@JonathanAllan 팁 주셔서 감사합니다!
Arnauld

10

자바 스크립트 (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. 난 당신의 제안을 사용할 수 있습니다 내 점수를 개선하기 위해 코드를 추가 할 수 바이트의 무리 저장하려면이 개 테스트를 결합합니다.
Rick Hitchcock

a.p이미 가지고 있기 때문에 중복 되지 [aouz]않습니까?
AdmBorkBork

@AdmBorkBork, a in [aouz]은 문자열의 시작 부분에서만 일치합니다. 어떤 이유로 든 문자열의 a.p 아무 곳 이나 테스트 하면 점수가 향상됩니다.
Rick Hitchcock

10

젤리 , 50 바이트 , 점수 763

해시 사용하기 ( Arnauld의 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¬ȧÇ

단어가 명사로 식별되면 단어를 가져 와서 하나의 문자 목록 (거짓)을 반환하거나 그렇지 않으면 빈 목록 또는 0 (거짓)을 반환하는 모나드 링크입니다.

온라인으로 사용해보십시오! (바닥 글은 결과에 대해 ifNoun또는if를 수행하여 인쇄또는Non-Noun)
... 또는 스코어링 프로그램 을 봅니다 (두 목록에서 정확한 인덱스를 계산 한 다음 점수를 계산합니다).

점수 분석 : 462/586 명사가 올바르게 식별 됨 (124 개 부정확 함), 222/414 비명 사가 올바르게 식별 됨 (192 개 부정확 함)-총 정확한 = 684/1000.

방법?

명사가 아니라면 ...

  • 마지막 문자와 그 앞의 문자 2가 같음 (모듈 식 및 1 기반 색인 작성)
  • 중 처음 두 길이 두 문자열은에 있습니다
    '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,-2pair zero with -2그것이 의미하는 것은 아닙니다literal [0, -2]
Erik the Outgolfer

그러나 그것은 같은 효과입니다 : p
Jonathan Allan

아니, 그것은 0,-2nilad가 아니며 분리 되지 는 않습니다 (0)(,)(-2)... 물론이 경우에는 동일한 효과이지만 항상 그런 것은 아닙니다. 나는 어려운 방법을 배웠습니다 ... 어쨌든 나는 어쨌든 동일한 효과 또는 무언가 대신 실제로 일어나는 일을 설명하는 것을 선호합니다.
Outgolfer Erik

"pair"가 아닌 "join"이라고 쓰면 "no join is j" 라고 댓글을 달았 습니까?
Jonathan Allan

I는 약간 현학적 수 있지만 수 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.
Outgolfer Erik

2

줄리아 34 바이트, 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

하스켈, 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 바이트가 아닌 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/6 비트 (약 0.17)를 나타내는 것으로 가정 할 수 있습니다.
mdahmoune

1
귀하의 관점을 이해하지만 50 바이트 코드 소스는 구체적인 하드웨어 (일반적으로 트랜지스터)에
있어야합니다.

1
단순한 관점이 아니라 도전의 요구 사항입니다. 이 도전에 대한 경쟁 요건을 충족하지 않으므로 답을 비경쟁으로 표시하십시오.
isaacg

2
이 솔루션을 재생성하는 데 필요한 정보의 단순하고 압축되지 않은 이진 인코딩은 각 논리 게이트의 유형에 2 비트 (3 개의 다른 게이트) 및 각 논리 게이트의 입력 및 출력의 각 주소에 10 비트 (675 게이트 + 입력 및 출력). 2 * (48 + 550 + 77) + 10 * (2 * 48 + 3 * (550 + 77)) = 21120 비트 = 2640 바이트
Nnnes

1

파이썬 3, 50 바이트, 602 점

파이썬은 가장 장황한 언어는 아니지만 50 바이트는 어렵습니다.

lambda x:all(x.count(y)<1for y in["ful","y","er"])
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.