Dane wejściowe: otrzymasz ciąg zawierający jedno angielskie słowo. Wszystkie litery będą pisane małymi literami, a ciąg nie będzie zawierał znaków innych niż alfabetyczne.
Wyjście: Zwrócisz liczbę całkowitą od 1 do 7 reprezentującą liczbę sylab, które Twoim zdaniem są w tym słowie.
Punktacja: Twój program będzie działał dla wszystkich słów znalezionych w tym repozytorium . Jeśli otrzymujesz N
poprawne słowa, a twój program ma M
bajty duże, to twój wynik toN-(M*10)
. Największy wynik wygrywa.
Aby wygenerować moją liczbę sylab, użyłem tego jako mojej listy słów i tego do zliczenia sylab.
code-challenge
word
Nathan Merrill
źródło
źródło
resume
na przykład ...Odpowiedzi:
Rubinowy, 8618 poprawny (91,1%), 53 bajty, 8618 - 10 * 53 = wynik 8088
Jest to anonimowa funkcja Ruby, która używa wyrażeń regularnych do liczenia sylab.
Funkcja dodaje sylabę do każdego wystąpienia:
e
samogłosek, po której następuje zero lub więceje
se
Który nie częścią tylnąed
iely
, z wyjątkiem końcoweted
lubded
Sle
Analiza
Podstawową ideą jest zliczanie samogłosek, ale samo to nie jest zbyt dokładne (
[aeiouy]+
uzyskuje 74% poprawności). Głównym tego powodem jest cicha zmianae
, która modyfikuje poprzednią samogłoskę, ale sama nie jest wymawiana. Na przykład słowoslate
ma dwie samogłoski, ale tylko jedną sylabę.Aby sobie z tym poradzić, wyjmujemy
e
pierwszą część wyrażenia regularnego i traktujemy ją osobno. Wykrywanie cichyche
s jest trudne, ale znalazłem dwa przypadki, w których często występują:ed
(o ile nie jest toted
lubded
podobnesettled
lubsaddled
)evy
(np.lovely
)Przypadki te są wyraźnie wykluczone z tego, co byłoby inaczej
e.
.Powodem
.
ine(?!d$|ly).
jest użycie następnego znaku, jeśli występuje podwójna samogłoska (np.ea
Lubee
), a więce
na końcu słowa nie są liczone. Jednak końcowele
jest zwykle wymawiane, więc jest dodawane z powrotem.Wreszcie, samogłoski są liczone jako jedna sylaba. Chociaż nie zawsze tak jest (np.
curious
), Często trudno jest ustalić, czy istnieje wiele sylab. Weźia
odcelestial
ispatial
, jako przykład.Program testowy
Naprawdę nie znam Ruby, więc nie jestem pewien, jak dobrze można grać w golfa. Udało mi się zeskrobać program testowy, konsultując wiele SO:
źródło
e
” daje 6638 (poprawne 7158)Python3, 7935 - 10 * 71 = 7225
Moja szybka i brudna odpowiedź: policz serie kolejnych samogłosek, ale najpierw usuń wszystkie końcowe e.
Po usunięciu liter e zastępuje samogłoski
x
i wszystkie inne znaki spacją. Wynik jest ponownie łączony w ciąg, a następnie dzielony na białe znaki. Dogodnie spacje na początku i na końcu są ignorowane (np." x xx ".split()
Daje["x","xx"]
). Długość wynikowej listy jest zatem liczbą grup samogłosek.Oryginalna, 83-bajtowa odpowiedź poniżej była dokładniejsza, ponieważ usunęła tylko jeden e na końcu. Nowszy ma zatem problemy z takimi słowami
bee
; ale skrócony kod przeważa nad tym efektem.Program testowy:
Najwyraźniej było to zbyt brudne i zbyt szybkie, aby pobić odpowiedź Ruby na Sp3000. ; ^)
źródło
->s{s.scan(/([aiouy]|e(?!$))+/).size}
zdobywa 7583. 84% jest imponujące jak na coś tak prostego.Perl, 8145 - 3 * 30 = 7845
Korzystanie z list sprzed ostatnich zatwierdzeń.
źródło
Python, 5370-10 * 19 = 5180
Ten program zakłada po prostu, że dłuższe słowa oznaczają więcej sylab.
Program testowy, którego używam to:
źródło
len(x)/6
zamiast tego (5377-190 = 5187).readlines()
zawiera nowy wynik w wyniku. Więc twoje jest w rzeczywistości(len(x)+1)/7+1
. Zamiast tego powinieneś użyćread().split('\n')
. Chociaż dostałem 5352 dla tej formuły.