Wyzwanie
Napisz funkcję, która pobiera argument, który jest czasownikiem, i zwraca czas przeszły czasownika. (Załóżmy, że czasownik jest regularny)
Czas przeszły
Uwaga: uważaj y za spółgłoskę ani samogłoskę.
Zwykle samo dodanie ed
po zakończeniu czasownika powoduje, że czas przeszły jest czas przeszły.
Np .: jump
→ jumped
, ask
→asked
Istnieją jednak inne zasady.
Jeśli ostatnim znakiem danego czasownika jest
e
, po prostu dodajd
.Np .:
love
→loved
,move
→moved
Jeśli czasownik kończy się spółgłoską +
y
, zmieńy
nai
i dodajed
.Np .:
study
→studied
,cry
→cried
Jeśli jednak czasownik kończy się samogłoską +
y
, po prostu dodajed
.Np .:
play
→played
,stay
→stayed
Jeśli czasownik kończy się samogłoską i spółgłoską, napisz spółgłoskę jeszcze raz i dodaj
ed
.Np .:
stop
→stopped
,plan
→planned
Jeśli jednak czasownik kończy się wieloma samogłoskami + spółgłoską lub pojedynczą samogłoską + wieloma spółgłoskami, po prostu dodaj
ed
.Np .:
look
→looked
,jump
→jumped
Jest więcej zasad, ale uważajmy tylko nad nimi. Na przykład zgodnie z powyższą zasadą visit
→ visitted
.
Zwycięzca
Ponieważ jest to kod golfowy, wygrywa najkrótszy kod, który poprawnie zwraca czasy przeszłe.
Przykład (JS, 127)
function f(x){return x.replace(/([^aeiouy])y$/,'$1i').replace(/([^aeiouy][aeiou])([^aeiouy])$/,'$1$2$2').replace(/e$/,'')+'ed'}
Odpowiedzi:
sed, 76 znaków
Czy skrypt sed liczy się jako funkcja tego problemu?
źródło
Mathematica 43 znaki
Stosowanie:
Również:
źródło
Groovy - 111 znaków
źródło
Perl 5 (82 znaków):
Jestem pewien, że można to poprawić.
źródło
C -
120119 znakówW typowym stylu C funkcja f aktualizuje bufor ciągów, zakładając, że osoba wywołująca zarezerwowała wystarczająco dużo miejsca dla maksymalnie trzech dodatkowych znaków. Drugi argument należy podać jako 0. Deklaracja globalnej zmiennej stanu
l
jest uwzględniona w całkowitej liczbie znaków.Objaśnienie: Funkcja iteruje rekurencyjnie znaki. Drugi argument
i
koduje, które z poprzednich trzech znaków były spółgłoskami w jego dolnych trzech bitach. Na końcu ciągu, jeślii==5
trzy ostatnie znaki były spółgłoską, samogłoską i spółgłoską, a zatem ostatni znak musi zostać zduplikowany. Podobnie, jeśli bit 1i
oznacza, że przedostatni znak był spółgłoską, a ostatnim znakiem jest „y”, wówczas „y” zastępuje się „i”.źródło
Scala 199
273znakówWezwanie:
Moje pierwsze podejście było znacznie dłuższe, przenosząc kaskadę if-else-kaskadową na listę => do funkcji:
Może to podejście jest interesujące. Degolfed i wyjaśnił:
źródło
Ruby, 101 znaków
Prawdopodobnie może być mniejszy.
Stosowanie:
źródło
f=->(x){...}
aby uzyskać krótszy kod. Równieżaeiouy
IMHO powinno być stałe.Kupa - 72 znaki
źródło
Python - 147
źródło