Czy to rzeczownik, czy nie?

22

Biorąc pod uwagę ciąg znaków, określ, czy jest to rzeczownik, czy nie.

Zostaniesz oceniony na 1000 najczęściej używanych angielskich słów według liczby, którą poprawnie oznaczysz jako rzeczownik, czy nie.

Wygra program lub funkcja, która poprawnie klasyfikuje większość tych słów w 50 bajtach lub mniej.

Rzeczowniki

Rzeczownik to słowo, które zazwyczaj reprezentuje rzecz. Robi się coraz bardziej skomplikowane, ale to podstawowa idea.

W przypadkach, gdy słowo może być rzeczownikiem lub inną częścią mowy, sklasyfikowałem je jako rzeczownik, nawet jeśli jest to rzadkie użycie. A właściwie pozwalam tej stronie to dla mnie zrobić.

Słowa, na które będziesz punktowany, to 1000 zwykłych słów , które pochodzą z prostej Wikipedii , z dodanymi „dwa” i „raz”. Spośród nich są to 586 rzeczowników , a są to 414 rzeczowników . Wszystkie trzy listy można znaleźć tutaj . Zauważ, że wszystkie te dane wejściowe są pisane małymi literami. Te listy są ostateczne - nie próbuj argumentować gramatyki.

Twój program zostanie uznany za poprawny, jeśli wygeneruje prawdziwy wynik na wejściu, które jest rzeczownikiem, i wynik fałszowania na wejściu, które nie jest rzeczownikiem.

Subtelności:

Programy muszą mieć deterministyczny wynik. Jeśli chcesz użyć losowości, zaszczep ją. Programy nie mogą używać wbudowanych list rzeczowników ani innych wbudowanych funkcji mowy.

Przykłady:

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

Wskaż w swojej odpowiedzi wskaźnik powodzenia programu. Wygrywa program lub funkcja o maksymalnej długości 50 bajtów o najwyższym wskaźniku powodzenia. W przypadku remisu, najniższa liczba bajtów określi zwycięzcę. Powodzenia!

isaacg
źródło

Odpowiedzi:

13

JavaScript (ES6), 43 bajty, 622 630 633

Tylko po to, żeby piłka się toczyła. Zwraca 1dla rzeczowników, 0dla rzeczowników niebędących rzeczownikami.

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

W jaki sposób?

Stawiamy na rzeczownik, jeśli oba następujące warunki są spełnione:

  1. Długość słowa wynosi 3, 4, 5, 6, 7, 8 lub 11. Odbywa się to poprzez przesunięcie w prawo liczby binarnej 100111111000 (2552 w postaci dziesiętnej).
  2. Słowo zaczyna się od jednej z następujących liter: bcdfghijklmpqrstvwy
Arnauld
źródło
Właśnie miałem komentować, mając na uwadze JS, że limit bajtów był zbyt restrykcyjny, więc opublikuj to! Pomyślałem, nie patrząc na listę, że lepszy wynik niż 586 może być możliwy tylko przez przetestowanie pierwszej litery lub 2 w każdym słowie. Ładnie zrobione :)
Kudłaty,
Wyjaśnienie byłoby fajne dla osób mniej znających Javascript. O ile mi wiadomo, sprawdza to, czy długość słowa wynosi 3, 4, 5, 6, 7, 8 lub 11, a słowo zaczyna się również od jednego z zestawu liter?
isaacg,
@isaacg To prawda. Dodano objaśnienie.
Arnauld,
4
Zauważ, że klasa znaków [bcdf-mp-tvwy]jest równoważna klasie [^aenouxz]. Zmiana pozwoliłaby zaoszczędzić 4 bajty, które można by wykorzystać.
fireflame241
@ fireflame241 Bardzo prawda. Można to nawet skrócić, [^aenouz]ponieważ nie mamy żadnego słowa zaczynającego się od x.
Arnauld,
11

Galaretka , 48 bajtów, wynik 731

To jest moja pierwsza odpowiedź w Jelly. Zadałam sobie wiele trudu, żeby to ułożyć. Ach cóż ... było fajnie. :-)

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

1 bajt zapisany dzięki @JonathanAllan

Wypróbuj online!

Podziały i zestawy testowe

  • Nie-rzeczowniki poprawnie zidentyfikowane jako nie-rzeczowniki: 265/414 (64%)
  • Rzeczowniki poprawnie zidentyfikowane jako rzeczowniki: 466/586 (79,5%)

W jaki sposób?

Najpierw obliczamy skrót ciągu wejściowego przez:

  • konwertując go na liczbę całkowitą, interpretując każdy punkt kodowy jako podstawową cyfrę 256
  • zastosowanie modulo 4080 (wybrany jako najbardziej efektywna wartość z nie więcej niż 12 bitami)
  • zachowując 8 najbardziej znaczących bitów wyniku

To pozostawia nam indeks w [0 ... 255], a zatem dzieli wszystkie słowa na 256 grup.

Dla każdej grupy słów wstępnie obliczamy flagę binarną, która występuje, 1jeśli grupa zawiera więcej rzeczowników niż nie-rzeczowników, i w 0przeciwnym razie. Prowadzi to do 256-bitowej liczby N , której będziemy używać jako tabeli przeglądowej. Przechowujemy go jako ciąg zakodowany w bazie-250.

Poniżej jest binarna reprezentacja N .

1000011000001011000101111011111001001101110010101101110010001101
0000010001101010010111110001110010010101110110110010111111010000
0001111010011110000110101011111000011110111011010011011110101100
1010010110101111000010101000101100000001110110100011111000101010

Które można przechowywać jak “Ạ$ⱮẊḲḲLÑMṆụ⁻ẉṂ`ŻvḤæɠ5ṭȯƁU*×TdƲḥ`’w galarecie.

Stąd kod:

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
źródło
Dobra robota! Zaoszczędź bajt, aby uruchomić O‘ḅ⁹%⁽€Oæ»4“Ạ$ⱮẊḲḲLÑMṆụ⁻ẉṂ`ŻvḤæɠ5ṭȯƁU*×TdƲḥ`’æ»Ḃ(pamiętaj, że możesz użyć stopki na TIO, poszedłbym z Ç€¬S,Li Ç€S,Ldla twoich dwóch zestawów testowych.
Jonathan Allan
@JonathanAllan Dzięki za wskazówki!
Arnauld
10

JavaScript (ES6), 50 bajtów, wynik 693

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

Po prostu szukam możliwych wzorów, które nie mają rzeczowników, których nie mają.

Rzeczowniki inne zawierają częściej:

  1. a, o, u lub z jako pierwsza litera.
  2. ty jako pierwszych dwóch liter.
  3. Tylko dwie litery. [Pomyśl zaimki (ja, my, my, on, on) i przyimki (od, do, w, w, przez, w, w górę, ...).]
  4. e , po którym następuje jedna lub więcej liter, a następnie e lub y .
  5. f, l lub o , po której następuje dowolna litera, po której następuje r .
  6. a , po której następuje dowolna litera, po której następuje p .

Skrawek:

Rick Hitchcock
źródło
Wierzę, że możesz zaoszczędzić bajt, zmieniając pierwszy regex na /h|n/(lub wykonując /^.[hn]/.test(s)), a drugi, zmieniając s[2]>''na jeden !!s[2]lub 2 in s.
ETHproductions
Dzięki, @ETHproductions. Mogę skorzystać z twoich sugestii i połączyć dwa testy, aby zapisać kilka bajtów, co pozwoliło mi dodać kod, aby poprawić mój wynik.
Rick Hitchcock,
Nie jest a.pzbędny, skoro już go masz [aouz]?
AdmBorkBork
@AdmBorkBork The w dorównuje tylko gdy na początku łańcucha. Z jakiegokolwiek powodu testowanie dowolnego miejsca w łańcuchu poprawia wynik. [aouz]a.p
Rick Hitchcock
10

Galaretka , 50 bajtów , wynik 763

Używanie skrótu teraz (podobnie jak odpowiedź galaretki Arnaulda )

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

Wypróbuj online!

250/414 dla rzeczowników niebędących rzeczownikami
513/586 dla rzeczowników
Razem = 250 + 513 = 763.

W jaki sposób?

Tworzy tabelę z 308 wpisami, 1 (identyfikacja rzeczownika) lub 0 (identyfikacja rzeczownika) i indeksuje do niej za pomocą klucza udostępnionego przez funkcję skrótu, która wykorzystuje iloczyn porządkowy słowa wejściowego:

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)

Poprzednio:  50  47 bajtów , wynik 684

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

Monadyczny link pobierający słowo i zwracający listę jednego znaku (prawda), jeśli słowo jest identyfikowane jako rzeczownik, lub pusta lista lub zero (oba falsey), jeśli tak nie jest.

Wypróbuj online! (stopka wykonuje wynik if, aby wydrukowaćNounlubNon-Noun)
... lub zobaczyć program oceniania (zlicza prawdziwe indeksy na obu listach, a następnie oblicza wynik).

Podział punktacji: 462/586 rzeczowników poprawnie zidentyfikowanych (124 niepoprawne), 222/414 nie-rzeczowników poprawnie zidentyfikowanych (192 niepoprawnych) - całkowita poprawna = 684/1000.

W jaki sposób?

Zgadnij, to nie jest rzeczownik, jeśli ...

  • ostatni znak i dwa poprzednie przed nim są równe (z indeksowaniem modułowym i opartym na 1)
  • jeden z pierwszych dwóch długości 2 podciągi są:
    'be', 'th', 'le', 'he', 'm ', 'ev', 'et', 's ', 'fl', 'ax', 'en', 'fo', 'am', 'az' (uwaga: 'm 'i 's 'to tylko, żeby ułatwić kompresję, ale nigdy nie pojawiają się w każdym razie)
  • -299 th indeksu (z 1-modułowe i oparte indeksowania) jest jedną z:
    aenouyz(chociaż ten realizowany jest odwrotnie iz nadmiaru literami)
    ... od słowa mają długość pomiędzy 1 a 11 -299 th indeks jest równoważny do korzystania z mapowania długości do indeksu:{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 bajtów, wynik: 638

Pierwsze szybkie uderzenie (rozszerzone powyżej)

ØY⁾niyṖf⁽ż2ị$
Jonathan Allan
źródło
0,-2nie znaczy, pair zero with -2że oznaczaliteral [0, -2]
Erik the Outgolfer
Ale to ten sam efekt: p
Jonathan Allan
nie, to nie 0,-2jest nilad, nie osobno (0)(,)(-2)... oczywiście to ten sam efekt w tym przypadku, ale nie zawsze. Nauczyłem się tego na własnej skórze ... i tak czy inaczej wolałbym wyjaśnić, co się właściwie dzieje, zamiast czegoś z tym samym skutkiem lub czegoś takiego.
Erik the Outgolfer,
Gdybym napisał „dołącz” zamiast „parować”, czy skomentowałbyś „brak dołączenia j”?
Jonathan Allan,
Mogę być trochę pedantyczny, ale pairlub w joinoczywisty sposób niewłaściwy sposób to sformułować, ponieważ 0,-2,-6na przykład nie znaczy, pair 0 with -2 and then pair that with -6 = [[0, -2], -6]ale raczej znaczy literal [0, -2, -6]. Rozumiem, , atom i ...,...(,...(...)) literał są mylące ... ale 0,-2,-6wciąż nie jest taki sam, 0,-2;-6ponieważ pierwszy z nich to 1 link, a drugi to 3 linki.
Erik the Outgolfer,
2

Julia 34bytes, 609

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

Chciałem zaoszczędzić na postaciach, korzystając z wbudowanego skrótu. Czuję, że musi istnieć sposób, aby to zrobić lepiej. Julia po prostu nie jest wystarczająco przyjazna, jeśli chodzi o operacje bitowe, których chcę użyć, aby poprawić to, jak sądzę.

Znalezienie odpowiednich bitmasek dla skrótu, aby je rozdzielić, jest interesującą grą.

Lyndon White
źródło
Najlepsze rozwiązanie;)
tamasgal
2

Python 2 , 50 bajtów, dokładność: 596

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

Wypróbuj online!

Po prostu sprawdza pierwszą literę, długość i to, czy w słowie znajduje się „st” Kod zakłada, że ​​słowo jest zdefiniowane jako x (Edytuj: Dzięki issacg za poprawienie kodu z fragmentu kodu do funkcji)

Husnain Raza
źródło
Cześć, witam na stronie. Chociaż jest to interesujące, zgłoszenia muszą być fukcjami lub pełnymi programami. To jest fragment kodu, który jest niedozwolony. Zobacz to Wypróbuj online! link umożliwiający konwersję tego fragmentu kodu do funkcji przy jednoczesnym wykonywaniu tego samego kodu.
isaacg
2

Haskell, 36 bajtów, 626 631

f x=length x>2&&x!!0`notElem`"aenou"
Gajówka
źródło
643, jeśli ktoś ma krótszy język:length x>2&&(x!!0`notElem`"aenou"||x!!1`elem`"acqrsty")
BlackCap
2

2-poziomowa implementacja bramki logicznej, nie 50 bajtów, wynik 1000

  1. Wystarczy podłączyć binarną reprezentację danego słowa do 88 wejść

    1. uzupełnij słowo wejściowe spacjami po prawej stronie, jeśli długość słowa jest mniejsza niż 11
    2. 8-bitowy kod ASCII dla każdej litery słowa wejściowego
  2. Obwód zwraca 1, jeśli słowo jest rzeczownikiem, i zwraca 0, jeśli nie

  3. Niebieskie przerywane linie służą do nigdy nieużywanych danych wejściowych

To wdrożenie wymaga

  1. 48 tranzystorów do kodowania wszystkich bram falowników
  2. 1100 tranzystorów do kodowania wszystkich bramek AND
  3. 154 tranzystory do kodowania bramki OR
  4. Łącznie 1302 tranzystorów, które reprezentują mniej niż 28 bajtów.

Niektóre pomiary

  1. Falownik brama potrzebuje 1 tranzystor
  2. Prosta bramka OR z 2 wejściami wymaga 2 tranzystorów
  3. Prosta bramka AND z 2 wejściami potrzebuje 2 tranzystorów
  4. Jeden bit potrzebuje 6 tranzystorów

wprowadź opis zdjęcia tutaj

Pełna rozdzielczość Circuit.pdf tutaj

Pełna rozdzielczość Circuit.png tutaj

mdahmoune
źródło
2
Czy mógłbyś dokładnie wyjaśnić, jaki jest twój system kodowania tego obwodu w bajty? Jestem bardzo zdezorientowany, jak twierdzisz, że używasz 28 * 8/1302 = 0,17 bitów na tranzystor.
isaacg
Ponieważ moje rozwiązanie jest rozwiązaniem komputerowym na bardzo niskim poziomie (raczej sprzętowym niż programowym), liczyłem bajty na tranzystorach. Z punktu widzenia sprzętu BIT jest kodowany przez 6 tranzystorów, więc możemy założyć, że jeden tranzystor reprezentuje 1/6 bitu (około 0,17).
mdahmoune,
1
Rozumiem twój punkt widzenia, jednak 50-bajtowe źródło kodu musi istnieć gdzieś na konkretnym sprzęcie (ogólnie tranzystory)
mdahmoune
1
To nie tylko punkt widzenia - to wymaganie. Oznacz swoją odpowiedź jako niekonkurującą, ponieważ nie spełnia ona wymagań, aby konkurować w tym wyzwaniu.
isaacg
2
Proste, nieskompresowane binarne kodowanie informacji wymaganych do odtworzenia tego rozwiązania mogłoby użyć 2 bitów dla typu każdej bramki logicznej (3 różnych bramek) i 10 bitów dla każdego adresu wejścia i wyjścia każdej bramki logicznej (675 bramek plus wejścia i wyjścia). 2 * (48 + 550 + 77) + 10 * (2 * 48 + 3 * (550 + 77)) = 21120 bitów = 2640 bajtów.
Nnnes,
1

Python 3, 50 bajtów, wynik 602

Python nie jest najbardziej gadatliwym językiem, ale 50 bajtów jest trudne.

lambda x:all(x.count(y)<1for y in["ful","y","er"])
L3viathan
źródło