Ihr Programm muss alle Wörter in dieser Wortliste finden , die alle Vokale enthalten ( a e i o u y
). Es gibt einfache Möglichkeiten, dies zu tun, aber ich suche nach der kürzesten Antwort. Ich werde jede Sprache nehmen, aber ich würde gerne Bash sehen.
Hier ist ein Beispiel (könnte stark verbessert werden):
cat wordlist.txt | grep "a" | grep "e" | grep "i" | grep "o" | grep "u" | grep "y"
Ihre Punktzahl ist die Länge des Codes.
-5 Punkte zum Zählen aller Vorkommen des Wortes.
Die niedrigste Punktzahl gewinnt.
code-challenge
natural-language
Der Doktor
quelle
quelle
Antworten:
GolfScript, 20 Zeichen - 5 = 15 Punkte
Basierend auf Howards Lösung , aber mit einem kürzeren Test (
\-!
spart ein Zeichen mehr&,6=
), kürzerer Länge (.,+
= 3 Zeichen) und kürzerer Ausgabeformatierung (niemand sagte, die Ausgabe müsse durch Zeilenumbrüche getrennt werden,`
spart also ein Zeichen mehrn*
).Hier ist die Ausgabe, wenn die Wortliste in Kleinbuchstaben als Eingabe angegeben wird (aus Gründen der Lesbarkeit werden Zeilenumbrüche eingefügt):
(Ps. Technisch gesehen wäre die Herausforderung, die besagt, dass der Code für diese spezielle Eingabe funktionieren muss,
n%{'aeiouy'\-!},`43
noch ein Zeichen kürzer. Ich halte das jedoch für Betrug.)Erläuterung:
n%
Teilt die Eingabe in Zeilenumbrüchen in ein Array auf.{ },
ist ein "grep" -Operator, der den Code zwischen den geschweiften Klammern für jedes Element des Arrays ausführt und diejenigen auswählt, für die er einen wahren Wert zurückgibt.'aeiouy'\-
die Literalzeichenfolgeaeiouy
und entfernt alle im Kandidatenwort gefundenen Zeichen daraus. Das!
negiert dann logischerweise die resultierende Zeichenfolge, wodurch man1
(true) , wenn die Zeichenfolge leer ist, und0
(false) , wenn es nicht..,+
Erstellt eine Kopie des gefilterten Arrays, zählt die Anzahl der darin enthaltenen Wörter und hängt das Ergebnis an das ursprüngliche Array an.`
Schluss wird die Auswertung des Arrays aufgehoben und in eine Zeichenfolgendarstellung seines Inhalts umgewandelt. (Ohne sie würden die Wörter im Array einfach in der Ausgabe verkettet, was zu einem unlesbaren Durcheinander führen würde.)quelle
GolfScript, 19 Zeichen
Verwendung:
Ausgabe:
Wenn Sie die Zählung auch am Ende ausgeben möchten, können Sie verwenden
Das ist vier Zeichen länger.
quelle
Python - 46 Zeichen
Lesbare Version: Es ist schon ziemlich lesbar :-)
quelle
APL, 21 - 5 = 16
Erwartet, die Liste der Wörter als zu finden
w
. Gibt eine Liste der Wörter zurück, die alle Vokale enthalten, plus deren Anzahl. Getestet mit ngn apl . Hier ist ein Beispiel .Erläuterung
quelle
Rubin 38
Edit 34: Best so weit (von @OI):
Bearbeiten 1: Ich habe gerade bemerkt, dass die Frage 'y' in den Vokalen enthalten sein soll. Deshalb habe ich meine Frage entsprechend bearbeitet. Wie @Nik in einem Kommentar zu seiner Antwort hervorhob,
"aeiouy".chars
ist ein Charakter weniger als%w[a e i o u y]
, aber ich lasse Letzteres für die Vielfalt, obwohl ich Albträume riskiere, weil ich auf die Gelegenheit verzichte.Edit 2: Danke an @OI für den Verbesserungsvorschlag:
Das spart 11 Zeichen von dem, was ich vorher hatte.
Edit 3 und 3a: @OI hat ein paar mehr abgeschlagen:
dann
und nochmal (3b):
Ich bin nur ein Schreiber!
Hier sind zwei weitere nicht wettbewerbsfähige Lösungen:
Anfangs hatte ich:
s
ist eine Zeichenfolge, die die durch Zeilenumbrüche getrennten Wörter enthält. Ein Array von Wörterns
, das alle fünf Vokale enthält, wird zurückgegeben. Für Leser, die mit Ruby nicht vertraut sind,%w[a e i o u y] #=> ["a", "e", "i", "o", "u", "y"]
und&
Array-Schnittmenge.Annehmen
{...}
Anfangs im Block"Abkürzungen" ist also nicht ausgewählt.
Wenn die Zeichenfolge
s
möglicherweise Duplikate enthält,s.split.select...
können Sie diese durchs.split.uniq.select...
Ersetzen ersetzen , um Duplikate zu entfernen.Nur bemerkte ich durch Ersatz von 1 char retten könnte
size==6
mitsize>5
.quelle
...size=5
ist ein Bug - sollte sein...size==5
s.split.select{|w|'aeiouy'.delete(w)==''}
s.split.select{|w|'aeiouy'.tr(w,'')==''}
. Ich bin mir ziemlich sicher, dass Sie dies unter 40 Zeichen erreichen können, wenn Sie die Null-Logik und die 'richtige' String-Methode verwenden. Immer noch auf der Suche ...Haskell - 67
quelle
Ruby - 28 Zeichen (oder 27, wenn
y
aus Vokalen ausgeschlossen)Der vollständige auszuführende Befehl lautet (48 Zeichen):
BEARBEITEN: ersetzt
puts
durchp
wie von @CarySwoveland vorgeschlagenquelle
%w[a e i o u]
würde 1 char sparen,p
fürputs
, 3 mehr.p
, ich benutze es selten. Wie bei% w [] ist die Version mit Zeichen immer noch kürzer, wenn y in der Vokalmenge enthalten ist."aeiouy".delete(s)==''
könnte dir ein paar Zeichen sparen.AWK - 29
Ausführen: Speichern Sie die Wortliste in Kleinbuchstaben unter
wordlist.txt
. Dann mach:Wenn Ihr System nicht hat
mawk
,awk
kann auch verwendet werden.Sie können auch aus einer Datei ausführen , indem Sie das Programm zur Rettung
program.awk
und tunmawk
oderawk
-f program.awk
.quelle
'/y/&&/u/&&/i/&&/o/&&/a/&&/e/'
!!Python, 45 Zeichen
quelle
k [22-5 = 17 Zeichen]
Ich habe die Datei "corncob_lowercase.txt" in "w" umbenannt
Zähle die Wörter [22 Zeichen]
Ausgabe
Alle Wörter finden [25 Zeichen]
Insgesamt 43 Wörter mit allen Vokalen
(a e i o u y)
Ausgabe
quelle
Javascript / JScript 147 (152-5), 158 (163-5) oder 184 (189-5) Bytes:
Hier ist meine Javascript und JScript schrecklich "ungolfyfied" Version (
164152152-5 = 147 Bytes):function(s,k,z,x,i,c,r){c='aeiouy'.split('');r=[];for(k in s=(s+'').split(/\b/)){i=0;for(z in c)i+=s[k].indexOf(c[z])>=0;i==6&&(r[r.length]=s[k]);}return r;}
function(s,k,z,x,i,c,r){c='aeiouy'.split('');r=[];for(k in s=(s+'').split(/\b/)){i=6;for(z in c)i-=!!s[k].search(c[z]);i&&(r[r.length]=s[k]);}return r;}
Vielen Dank an @GaurangTandon für die
search()
Funktion, die mir ein Byte erspart hat !RegExp basiert auf der HORRIBLE- Leistung, unterstützt jedoch sowohl Groß- als auch Kleinbuchstaben (163-5 = 158 Byte):
function(s,k,z,x,i,c,r){c='aeiouy'.split('');r=[];for(k in s=(s+'').split(/\b/)){i=0;for(z in c)i+=RegExp(c[z],'i').test(s[k]);i==6&&(r[r.length]=s[k]);}return r;}
RegExp basiert auf BESSERER Leistung, ABER benötigt viel mehr Bytes (189-5 = 184 Bytes):
function(s,k,z,x,i,c,r,l){l=[];r=[];for(z in c='aeiouy'.split(''))l[z]=RegExp(c[z],'i');for(k in s=(s+'').split(/\b/)){i=0;for(z in c)i+=l[z].test(s[k]);i==6&&(r[r.length]=s[k]);}return r;}
Dies ist nur zum Spaß (175-5 Bytes) und wird nicht als Antwort gewertet:
function(s,k,z,x,i,c,r){c='aeiouy'.split('');r=[];for(k in s=(s+'').split(/\b/)){i=0;for(z in c)i+=s[k].indexOf(c[z])>=0;i==6&&(r[r[r.length]=s[k]]=1+(r[s[k]]||0));}return r;}
Es basiert auf der ersten Antwort, hat aber eine Wendung: Sie können wissen, wie oft ein Wort gefunden wurde.
Das macht man einfach so:
var b=(function(s,k,z,x,i,c,r){c='aeiouy'.split('');r=[];for(k in s=(s+'').split(/\b/)){i=0;for(z in c)i+=s[k].indexOf(c[z])>=0;i==6&&(r[r[r.length]=s[k]]=1+(r[s[k]]||0));}return r;})('youaie youaie youaie youaie a word');
b.youaie //should be 4
Da das
length
nicht alle Vokale hat, wird es nicht gelöscht und wäre trotzdem eine Antwort für den Bonus.Wie nennst du das?
"Einfach": Sie binden die Funktion ein
()
und fügen('string goes here');
sie am Ende hinzu.So was:
(function(s,k,z,x,i,c,r){c='aeiouy'.split('');r=[];for(k in s=(s+'').split(/\b/)){i=0;for(z in c)i+=s[k].indexOf(c[z])>=0;i==6&&(r[r.length]=s[k]);}return r;})('a sentence youyoy iyiuyoui yoiuae oiue oiuea');
In diesem Beispiel wird nur ein Array mit 1 Zeichenfolge zurückgegeben: yoiuae
Ich weiß, dass dies die schlechteste Lösung ist, aber es funktioniert!
Warum zähle ich -5?
Nun, Javascript / JScript-Arrays haben eine Eigenschaft (
length
) in Arrays, die die Anzahl der Elemente angibt, die sie haben.Nachdem die Frage bestätigt wurde, gibt der Bonus von -5 die Anzahl der Wörter an.
Da die Anzahl der Wörter in dieser Eigenschaft ist, habe ich automatisch die Punktzahl von -5.
quelle
search()
anstattindexOf()
1 Zeichen zu sparen..split()
On nicht"aeiouy"
. JS durchläuft ein Array und einen String auf die gleiche Weise. (Entfernen es erspart Ihnen ~ 10 Zeichen)Ruby
3938Derzeit der kürzeste Ruby-Eintrag, wenn das gesamte Programm einschließlich Ein- und Ausgabe gezählt wird.
Ein Zeichen gespeichert durch Verwenden von
map
anstelle voneach
:Eine andere Version, 39 Zeichen mit schönerer Ausgabe:
Beide Programme erhalten Eingaben von stdin oder als Dateinamen, der als Befehlszeilenargument übergeben wird:
$ ruby wovels.rb wordlist.txt
Es kostet 3 zusätzliche Charaktere, um sich
y
als Wovel einzuschalten.quelle
Enumerable#grep
, um dies zu verkürzen? zBs.split.grep /a*e*i*o*u*y/
unter der Annahmes
ist eine Zeichenfolge , die durch Zeilenumbrüche getrennten Worte..*
anpasse , mit zwischen den Wovels.s = "aeiouy\neiouay\nyuaioe\n"
. Danns.split.grep /a*e*i*o*u*y/
kommt["aeiouy", "eiouay", "yuaioe"]
für mich zurück. Testen inpry
Ruby 2.0.0. Übrigens eine großartige Lösung.grep
der=~
Operator verwendet wird, aber anscheinend wird er verwendet===
. Mein Verdacht war, dass es auch Zeichenfolgen entsprechen würde, die nicht alle Wovels enthalten, weil zum Beispiel/e*a*i*o*u*y/=~"eioy"
funktioniert. Ich verstehe wirklich nicht, was der===
Unterschied zwischen einem Regex und einem Operator tatsächlich macht. Toller Fund; Ich würde vorschlagen, dass Sie es selbst als Antwort posten. edit da hatte ich recht: versuch mal mit zum beispiel"heya"
.Mathematica (65 oder 314)
Zwei sehr unterschiedliche Ansätze, der bessere wurde von Belisarius in den Kommentaren zu meiner ersten Antwort vorgeschlagen. Zuerst meine brutale Anstrengung, die algorithmisch jeden möglichen regulären Ausdruck generiert, der mit einer Kombination von sechs Vokalen (einschließlich "y") übereinstimmt, und dann jedes Wort in der Zielwortliste mit jedem dieser 720 regulären Ausdrücke vergleicht. Es funktioniert, aber es ist nicht sehr präzise und es ist langsam.
~ 320 Zeichen. Einige können durch Verwendung einer alternativen Notation gespeichert werden, und zusätzliche Zeichen gehen verloren, wenn die Wörterbuchdatei als Liste von Zeichenfolgen vorbereitet wird (das natürliche Format für das Wörterbuch in Mathematica. Andere Sprachen benötigen diese Vorbereitung möglicherweise nicht, Mathematica jedoch). Wenn wir diesen Schritt weglassen und davon ausgehen, dass er für uns erledigt wurde, kann derselbe Ansatz in weniger als 250 Zeichen ausgeführt werden, und wenn wir das in Mathematica integrierte Wörterbuch verwenden, erzielen wir noch größere Einsparungen.
Unter 200 Zeichen. Das Zählen der Anzahl der gefundenen Wörter erfordert nur das Übergeben des Ergebnisses an
Length[Flatten[]]
, das entweder um einen der obigen Codeblöcke herum oder anschließend mit beispielsweise hinzugefügt werden kannLength@Flatten@%
. Die für diese Herausforderung angegebene Wortliste enthält 43 Übereinstimmungen, und das Mathematica-Wörterbuch enthält 64 (und ist viel schneller). Jedes Wörterbuch enthält übereinstimmende Wörter, die nicht im anderen enthalten sind. Mathematica findet beispielsweise "unprofessionell", was nicht in der freigegebenen Liste enthalten ist, und die freigegebene Liste findet "eukaryotisch", was nicht in Mathematics Wörterbuch enthalten ist.Belisarius schlug eine weitaus bessere Lösung vor. Unter der Annahme, dass die Wortliste bereits erstellt und der Variablen zugewiesen wurde
l
, definiert er einen einzelnen Test basierend auf derStringFreeQ[]
Funktion von Mathematica und wendet diesen Test dann mit derPick[]
Funktion auf die Wortliste an . 65 Zeichen, und es ist etwa 400-mal schneller als mein Ansatz.quelle
f@u_:=And@@(!StringFreeQ[u,#]&/@Characters@"aeiouy");Pick[l,f/@l]
Wol
ist die Wortlistey
als Vokal zu betrachten (gemäß den OP-Anforderungen!)Perl 6 - 35 Zeichen
Inspiriert von der Ruby-Lösung von @CarySwoveland:
Dies wählt
grep
jede Zeile aus,True
für<a e i o u y> ⊆ *.comb
die ein Wert zurückgegeben wird. Dies ist nur eine ungewöhnliche Art zu fragen: "Ist das Set('a','e','i','o','u','y')
eine Teilmenge (⊆
) des Sets, die sich aus den Buchstaben der Eingabe (*.comb
) zusammensetzt?"Eigentlich machen beide
<a e i o u y>
und*.comb
nurList
s:⊆
(oder(<=)
wenn Sie in ASCII stecken bleiben) sie zuSet
s für Sie.Um die Anzahl der gedruckten Zeilen zu erhalten, gibt dieses Skript mit 42 Zeichen und 5 = 37 Punkten Folgendes aus:
quelle
C - 96 Bytes
Ich habe dank eines glücklichen Zufalls der Operator-Priorität mehrere Bytes Klammern gespart.
quelle
Javascript - Ergebnis = 124 - 5 = 119 !!!
Edit: 17/02/14
Vielen Dank an @Ismael Miguel, der mir geholfen hat, ~ 12 Zeichen abzuschneiden !
Ich habe das Formular für die Fettpfeilnotation entfernt, da es, obwohl ich gesehen habe, nicht funktioniert. Keine Ahnung warum ...
Damit es funktioniert:
Übergeben Sie alle durch Newline getrennten Wörter als Argument an die unten gezeigte Funktion.
Prüfung:
quelle
k="aeiouy".split("")
sich innerhalb derfor(i in k)
Schleife befinden. Durch die Verwendung von;
anstelle von neuen Zeilen werden in Windows einige Bytes gespart. Und doch sehe ich nicht, wie es mit einer Liste von Wörtern umgehen wird. Und wie es funktioniert.k="aeiouy";o=0;for(i in k)
Versuchen Sie es stattdesseno=0;for(i in k='aeiouy')
. und unter Verwendung der Bytes speichert, können Sie sie verwenden , um zu änderno+=RegExp(k[i]).test(s)
ino+=RegExp(k[i],'i').test(s)
, Aufnahme ein weiteres Byte, sondern arbeitet sowohl mit Groß- und Klein.Bash + Coreutils, 39
Übernimmt die Eingabe von stdin.
quelle
sed 29 Zeichen
Reihenfolge von Buchstabenhäufigkeit auf Wikipedia zur Geschwindigkeitskontrolle gewählt.
Auf meinem Gastgeber:
und
quelle
Bash (grep) - 36 Bytes
Beachten Sie die Reihenfolge der getesteten Vokale, am seltensten zuerst. Für den Testfall läuft dies etwa dreimal so schnell wie das Testen, um dies zu erreichen. Auf diese Weise werden beim ersten Test mehr Wörter entfernt, sodass nachfolgende Tests weniger Arbeit erfordern. Offensichtlich hat dies keine Auswirkung auf die Länge des Codes. Viele der anderen hier aufgeführten Lösungen würden in ähnlicher Weise von der Durchführung der Tests in dieser Reihenfolge profitieren.
quelle
D - 196
Nicht golfen :
Verwendung :
C:\>rdmd vowels.d wordlist.txt
wordlist.txt
muss die Wörter der Kleinbuchstabenliste enthalten.quelle
Rebol (104 Zeichen)
Nicht golfen:
d
Enthält jetzt eine Liste der gefundenen Wörter. Hier ist ein Beispiel von der Rebol-Konsole:quelle
Smalltalk (36/57 Zeichen)
Um die Anzahl zu ermitteln, senden Sie #size an die resultierende Sammlung. Die Ergebnissammlung enthält 43 Wörter ("enthaltsam", "maßgeblich", "fraglos", "nicht erkennbar").
Der obige Code hat 77 Zeichen, aber ich hätte die Wortlistendatei in 'w' umbenennen können, also zähle ich den Dateinamen als 1, was eine Punktzahl von 57 ergibt.
Gehört das Lesen der Datei zum Problem oder nicht? Ist dies nicht der Fall (siehe andere Beispiele) und befindet sich die Wortliste bereits in einer Sammlung c, reduziert sich der Code auf:
Das sind 36 Zeichen (wobei das Leerzeichen weggelassen wird).
quelle
aktualisiert: unnötige Leerzeichen entfernt
Sehr langsam, aber in Bash (81 Zeichen):
EDIT:
echo $l|fold -w1
ersetzt durchfold -w1<<<$l
wie von @ nyuszika7h vorgeschlagenquelle
fold -w1<<<$l
anstelle von verwendenecho $l|fold -w1
. Hinweis: Der aktuelle Code ist 84 Zeichen, Sie sollten die nachgestellte Zeile nicht mitzählen.JavaScript - 95 Byte
Hier ist mein Golf.
Und ich möchte auch darauf hinweisen, dass Ihr Golf nicht alle Vorkommen von Vokalen zu finden scheint.
Ungolfed:
quelle
(?=.*a)
überprüfen, oba
sich irgendwo in der Zeichenfolge befindet.sort + uniq + sed
Dieser stimmt nicht mit wiederholten Vorkommen eines Wortes überein. Es stimmt auch nicht mit dem Buchstaben 'y' überein, wenn es am Anfang eines Wortes steht.
quelle
Bash
Nicht so kurz wie die OPs, aber eine Zeile in Bash:
quelle
C # - 170
Formatiert:
Derzeit nicht in der Stimmung, das Zählen zu implementieren , sollte aber einfach sein.Der Pfad zur (Kleinbuchstaben-) Wortliste sollte als erstes Argument an das Programm übergeben werden:Ausgabe:
Ich ließ mir die Freiheit, die Wörter auszugeben und durch Kommas zu trennen. Keiner von beiden ist in den Regeln festgelegt (welcher Status "muss alle Wörter finden", nicht wie (und WENN) auszugeben ist).
Einschließlich Anzahl (+ Ausgabe): 192 - 5 = 187
Ausgabe:
(Beachten Sie die Zählung am Ende: 43)
Keine Ausgabe ( „must finden alle Worte“): 137-5 = 132
(Biege die Regeln dann nochmal ein Bitm: nicht wirklich) Dies findet alle Wörter und die Zählung ist durch Ausführen verfügbar
r.Count()
.quelle
C-Sharp
Ich habe das noch nie zuvor gemacht und bin mir nicht ganz sicher, wie die Postings ablaufen. Aber das habe ich mir ausgedacht:
185 Bytes
wordList
= aList<string>
von allen Wörtern.Wenn Sie eine Gesamtsumme anzeigen möchten:
219 - 5 = 214 Bytes
Erweitert
quelle
vb.net (Ergebnis 91 = 96c - 5) * 0
* 0 + 49 c min
Dadurch wird eine Aufzählung erstellt, die alle Wörter enthält, die alle Vokale enthalten.
quelle
Your program must find all the words in this wordlist
. Dies ist a) kein Programm, sondern ein Ausschnitt aus einem Programm und b) liest / verwendet die Wortliste nicht.Mathematica -
136102Der verkürzte Link geht zu http://www.mieliestronk.com/corncob_lowercase.txt
quelle
http://bit.ly/1iZE9kY
.Characters["aeiou"]
oder mehr, wenn Sie einschließeny
.