Eingabe: Ihnen wird eine Zeichenfolge übergeben, die ein einzelnes englisches Wort enthält. Alle Buchstaben werden in Kleinbuchstaben geschrieben und die Zeichenfolge enthält keine nicht-alphabetischen Zeichen.
Ausgabe: Sie geben eine Ganzzahl von 1 bis 7 zurück, die angibt, wie viele Silben das Wort enthält.
Bewertung: Ihr Programm wird mit allen Wörtern in diesem Repository ausgeführt . Wenn Sie die N
richtigen Wörter finden und Ihr Programm M
byteslang ist, ist Ihre PunktzahlN-(M*10)
. Die höchste Punktzahl gewinnt.
Um meine Silbenzählung zu generieren, habe ich diese als meine Wortliste verwendet und dies, um die Silben zu zählen.
code-challenge
word
Nathan Merrill
quelle
quelle
resume
zum Beispiel ...Antworten:
Ruby, 8618 korrekt (91,1%), 53 Byte, 8618 - 10 * 53 = 8088 Punkte
Dies ist eine anonyme Ruby-Funktion, die reguläre Ausdrücke verwendet, um Silben zu zählen.
Die Funktion fügt eine Silbe für jede Instanz von:
e
Vokalen, gefolgt von null oder mehre
se
was ist nicht Teil eines Trailingsed
oder istely
, mit Ausnahme von Trailingted
oderded
sle
Analyse
Die Grundidee ist, Vokalläufe zu zählen, aber das ist an sich nicht sehr genau (
[aeiouy]+
74% richtig). Der Hauptgrund dafür liegt in der Stillee
, die den vorherigen Vokalton verändert, ohne selbst ausgesprochen zu werden. Zum Beispiel hat das Wortslate
zwei Vokale, aber nur eine Silbe.Um damit umzugehen, nehmen wir
e
den ersten Teil des regulären Ausdrucks heraus und behandeln ihn separat. Das Erkennen stillere
s ist schwierig, aber ich habe zwei Fälle gefunden, in denen sie häufig auftreten:ed
(es sei denn, es ist einted
oderded
wiesettled
odersaddled
),evy
(zBlovely
)Diese Fälle sind im Übrigen ausdrücklich ausgeschlossen
e.
.Der Grund für das
.
Ine(?!d$|ly).
ist, das nächste Zeichen zu verbrauchen, wenn es einen Doppelvokal gibt (z. B.ea
oderee
), und damite
am Ende des Wortes nicht gezählt werden. Allerdings ein Nachlaufle
ist Regel ausgesprochen, so dass wieder in hinzugefügt wird.Schließlich werden Vokalläufe als eine Silbe gezählt. Dies ist möglicherweise nicht immer der Fall (z. B.
curious
), es ist jedoch oft schwierig herauszufinden, ob mehrere Silben vorhanden sind. Nehmen Sie dasia
voncelestial
undspatial
, als Beispiel.Testprogramm
Ich kenne Ruby nicht wirklich, also bin ich mir nicht sicher, wie gut es golfen kann. Es ist mir gelungen, ein Testprogramm zusammenzustellen, indem ich viel SO konsultiert habe:
quelle
e
" ist, 6638 (7158 korrekt)Python3, 7935-10 * 71 = 7225
Meine schnelle und schmutzige Antwort: Zähle die Läufe aufeinanderfolgender Vokale, aber entferne zuerst alle abschließenden Es.
Nach dem Entfernen der e werden die Vokale durch
x
und alle anderen Zeichen durch ein Leerzeichen ersetzt. Das Ergebnis wird wieder zu einer Zeichenfolge zusammengefasst und dann in Leerzeichen aufgeteilt. Praktischerweise wird das Leerzeichen am Anfang und Ende ignoriert (zB" x xx ".split()
gibt["x","xx"]
). Die Länge der resultierenden Liste ist daher die Anzahl der Vokalgruppen.Die ursprüngliche 83-Byte-Antwort unten war genauer, da nur ein einzelnes e am Ende entfernt wurde. Das neuere hat also Probleme für Wörter wie
bee
; aber der verkürzte Code überwiegt diesen Effekt.Testprogramm:
Offensichtlich war dies zu schmutzig und nicht schnell genug, um die Ruby-Antwort von Sp3000 zu übertreffen. ; ^)
quelle
->s{s.scan(/([aiouy]|e(?!$))+/).size}
Punkte 7583. 84% sind ziemlich beeindruckend für etwas so Einfaches.Perl, 8145-3 * 30 = 7845
Verwenden der Listen vor den letzten Commits.
quelle
Python, 5370-10 * 19 = 5180
Dieses Programm geht einfach davon aus, dass längere Wörter mehr Silben bedeuten.
Das Testerprogramm, das ich benutze, ist:
quelle
len(x)/6
stattdessen zu verwenden (5377-190 = 5187).readlines()
Nimmt den Zeilenumbruch in das Ergebnis auf. Also ist deins eigentlich(len(x)+1)/7+1
. Sie solltenread().split('\n')
stattdessen verwenden. Ich habe zwar 5352 für diese Formel, aber.