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!
[bcdf-mp-tvwy]
jest równoważna klasie[^aenouxz]
. Zmiana pozwoliłaby zaoszczędzić 4 bajty, które można by wykorzystać.[^aenouz]
ponieważ nie mamy żadnego słowa zaczynającego się odx
.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. :-)
1 bajt zapisany dzięki @JonathanAllan
Wypróbuj online!
Podziały i zestawy testowe
W jaki sposób?
Najpierw obliczamy skrót ciągu wejściowego przez:
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,
1
jeśli grupa zawiera więcej rzeczowników niż nie-rzeczowników, i w0
przeciwnym 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 .
Które można przechowywać jak
“Ạ$ⱮẊḲḲLÑMṆụ⁻ẉṂ`ŻvḤæɠ5ṭȯƁU*×TdƲḥ`’
w galarecie.Stąd kod:
źródło
O‘ḅ⁹%⁽€Oæ»4“Ạ$ⱮẊḲḲLÑMṆụ⁻ẉṂ`ŻvḤæɠ5ṭȯƁU*×TdƲḥ`’æ»Ḃ
(pamiętaj, że możesz użyć stopki na TIO, poszedłbym zÇ€¬S,L
iǀS,L
dla twoich dwóch zestawów testowych.JavaScript (ES6), 50 bajtów, wynik 693
Po prostu szukam możliwych wzorów, które nie mają rzeczowników, których nie mają.
Rzeczowniki inne zawierają częściej:
Skrawek:
Pokaż fragment kodu
źródło
/h|n/
(lub wykonując/^.[hn]/.test(s)
), a drugi, zmieniającs[2]>''
na jeden!!s[2]
lub2 in s
.a.p
zbędny, skoro już go masz[aouz]
?[aouz]
a.p
Galaretka , 50 bajtów , wynik 763
Używanie skrótu teraz (podobnie jak odpowiedź galaretki Arnaulda )
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:
Poprzednio:
5047 bajtów , wynik 684Monadyczny 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ć
Noun
lubNon-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 ...
'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)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}
13 bajtów, wynik: 638
Pierwsze szybkie uderzenie (rozszerzone powyżej)
źródło
0,-2
nie znaczy,pair zero with -2
że oznaczaliteral [0, -2]
0,-2
jest 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.j
”?pair
lub wjoin
oczywisty sposób niewłaściwy sposób to sformułować, ponieważ0,-2,-6
na przykład nie znaczy,pair 0 with -2 and then pair that with -6 = [[0, -2], -6]
ale raczej znaczyliteral [0, -2, -6]
. Rozumiem,,
atom i...,...(,...(...))
literał są mylące ... ale0,-2,-6
wciąż nie jest taki sam,0,-2;-6
ponieważ pierwszy z nich to 1 link, a drugi to 3 linki.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ą.
źródło
Python 2 , 50 bajtów, dokładność: 596
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)
źródło
Haskell, 36 bajtów,
626631źródło
length x>2&&(x!!0`notElem`"aenou"||x!!1`elem`"acqrsty")
2-poziomowa implementacja bramki logicznej, nie 50 bajtów, wynik 1000
Wystarczy podłączyć binarną reprezentację danego słowa do 88 wejść
Obwód zwraca 1, jeśli słowo jest rzeczownikiem, i zwraca 0, jeśli nie
To wdrożenie wymaga
Niektóre pomiary
Pełna rozdzielczość Circuit.pdf tutaj
Pełna rozdzielczość Circuit.png tutaj
źródło
Python 3, 50 bajtów, wynik 602
Python nie jest najbardziej gadatliwym językiem, ale 50 bajtów jest trudne.
źródło