Powinieneś napisać program lub funkcję, która pobiera 4-znakowy ciąg jako dane wejściowe i wyświetla wartość wskazującą, czy ciąg jest słowem angielskim, czy nie. Możesz popełniać błędy w 15% podanych przypadków testowych.
Dane wejściowe:
Dane wejściowe to ciąg 4 znaków zawierający tylko małe litery angielskie (az).
Dane wyjściowe:
Jeśli wejście jest słowem angielskim, powinieneś wypisać wartość logiczną true
lub liczbę całkowitą 1
.
Jeśli dane wejściowe nie są słowem angielskim, należy wypisać wartość logiczną false
lub liczbę całkowitą 0
.
Listy słów
lista 4-literowych angielskich słów (2236 słów)
lista 4-literowych ciągów niepisanych (2236 ciągów)
Lista nie zawierająca słów zawiera jednolicie losowo generowane sekwencje liter z usuniętymi prawdziwymi słowami.
Testowanie
Twój program lub funkcja nie powinny razem popełniać więcej niż 15% błędów na podanych listach słów. Oznacza to, że możesz podać nieprawidłowy wynik dla 670 z 4472 dostarczonych danych wejściowych.
Powinieneś opublikować program testowy lub funkcję, aby inni mogli sprawdzić twoją odpowiedź. Długość twojego programu testowego nie wlicza się do wyniku twojego zgłoszenia.
Standardowe luki są niedozwolone.
Twój program nie powinien używać żadnych zewnętrznych źródeł, np. Dostępu do sieci lub czytania z pliku.
To jest golf golfowy, więc wygrywa najkrótszy program lub funkcja.
źródło
Odpowiedzi:
Rubinowy, 29 bajtów
Mam nadzieję, że mam rację - to mój pierwszy program w Ruby. Właściwie wszystkie testy przeprowadziłem w Pythonie, ale
import re
było to dla mnie zdecydowanie za długo.Jest to anonimowa funkcja, która pobiera ciąg znaków i
true/false
odpowiednio wyświetla dane wyjściowe . Używa wyrażenia regularnego, który szuka jednej z dwóch następujących rzeczy:jqxz
Jeśli którykolwiek z nich jest obecny, klasyfikujemy dane wejściowe jako nie słowo.
Funkcja dopasowuje 2030 słów (niepoprawnie zawodzi w 206) i zawodzi w 1782 nie-słowach (niepoprawnie dopasowuje 454), co daje w sumie 660 błędnych klasyfikacji. Testowany na ideonie .
Dzięki @ MartinBüttner za pomoc Ruby. Martin wskazuje również, że pełny program zajmuje tę samą liczbę bajtów:
Również dzięki user20150203 za uproszczenie wyrażenia regularnego.
Rubin,
15861488134912881203 bajtówAby uzyskać bonus, oto funkcja o znacznie dłuższym wyrażeniu regularnym:
Chciałem pokazać, że wyrażenie regularne wciąż może pokonać kompresję, więc ten poprawnie klasyfikuje każdy podany przypadek . Sam regex jest trochę jak rozkład wykładniczy - pierwsze bity pasują do wielu nie-słów, a następnie co jakiś czas dopasowuje coraz mniej, aż się poddałem i po prostu połączyłem resztę (około 200) na końcu. Niektóre z tych, które pozostały, wyglądały zaskakująco jak prawdziwe słowa (takie jak
chia
które to słowo).Rzuciłem regex w mój regex do czyszczenia golfa, który napisałem na kolejne wyzwanie - grał w golfa około 300 bajtów, zanim musiałem spróbować przetasować rzeczy ręcznie. Jest jeszcze sporo do gry w golfa.
źródło
->s{!s[/[^aeiou]{3}|[jqxz]/]}
ma tylko 29 bajtów i dopasowuje 2030 słów (niepoprawnie zawodzi w 206) i kończy się niepowodzeniem w 1782 - słowa (niepoprawnie pasujące 454), w sumie 660 błędnych klasyfikacji. ”v
. Dzięki użytkownik20150203!Groovy,
7774Napisałem program testowy w Javie, który można znaleźć w tej Gist na Github. Oto wynik mojego programu testowego:
(Nieudane 629 przypadków testowych)
PS Myślę, że niedługo skończy się problem golfa regularnego ...
Jeśli odpowiedź Sp3000 (funkcja) ma zostać przekonwertowana na Groovy, skończy się na tej samej liczbie znaków. Jako funkcja o nazwie:
lub funkcja bez nazwy:
źródło
JavaScript, 1626 bajtów:
Chciałem znaleźć rozwiązanie, które dla każdej postaci ma wskazówkę, po której można się zdecydować. Nie tak krótko, ale bez wyrażenia regularnego i dość dobry wynik (słowa: 101 błędów, brak słów, 228 błędów)
Oto działająca implementacja http://fiddle.jshell.net/jc73sjyn/
W skrócie: Obiekt g przechowuje znaki od a do z (jako klucze), a dla każdego z nich istnieje zestaw znaków (także jako klucze), z których każdy reprezentuje znak, który może nastąpić, wraz z procentem prawdopodobieństwa . Tam, gdzie nie ma obiektu, nie ma prawdopodobieństwa.
3 wyniki (4 litery -> 3 oceny) są mnożone, a słowo o wyniku 60 i więcej jest uważane za prawdziwe słowo.
Przykład: dla słowa „poradzić sobie” istnieją trzy wyszukiwania:
g [c] [o] = 20
g [o] [p] = 5
g [p] [e] = 20
wynik = 20 * 5 * 20 = 2000, czyli więcej niż 60, więc jeden jest ważny.
(Jestem całkiem nowy w javascript, więc mogą istnieć sposoby skrócenia tego, o czym nie wiem).
PÓŹNA EDYCJA:
Do tej pory zupełnie nieistotne, ale oceniłem swoją drogę do bardziej poprawnego g:
Nowe wyniki:
słowa: 53 błędy, brak słów: 159 błędów
http://fiddle.jshell.net/jc73sjyn/2/
źródło
for
pętli.w=>
przezfunction(w)
i będzie działać na każdej przeglądarce.Python 2, 5254 bajtów
To rozwiązanie dzieli dobre słowa na dwie połowy. Wyszukiwanie najpierw sprawdza pierwsze 2 znaki, aby znaleźć odpowiedni ciąg, a następnie szuka drugich 2 znaków w tym ciągu. Niezbyt kompaktowy, ale szybki do napisania. Ta metoda dopasowuje każde słowo bez błędów.
źródło
C # WPF, 110
139Krótszy
Stara odpowiedź
źródło
var
i nie wprowadzając zmiennych, chyba że jest to konieczne.Słowo VBA, 25 bajtów
Anonimowa funkcja bezpośredniego okna VBE, która pobiera dane wejściowe jako bieżący wybór i wyprowadza, jeśli jest to słowo typu boolean w bezpośrednim oknie VBE.
Funkcja testera
Poniższa funkcja została użyta do przetestowania powyższej funkcji w stosunku do przypadków testowych. Funkcja zawiodła 9,07 procent przypadków (396 rzeczywistych słów i 10 fałszywych słów)
źródło
Mathematica, 33 bajty
Hej, ktoś musiał to zrobić!
Nie wymaga wyjaśnienia.
źródło
JavaScript ES6, 32 bajty:
Za pomocą wyrażenia regularnego z @ Sp3000 odpowiedź :
To tworzy anonimową funkcję. Aby go użyć, wystarczy go owinąć
()
.Przykład:
Ma dokładnie taką samą awaryjność jak @ Sp3000 i zwraca
true
lubfalse
odpowiednio.Wszystkie kredyty należne @ Sp3000 za umożliwienie mi użycia jego wyrażenia regularnego.
źródło
F = function(s) { return /[^aeiou]{3}|[jqxz]/.test(s) }
.