Sie sollten ein Programm oder eine Funktion schreiben, die eine 4-stellige Zeichenfolge als Eingabe verwendet und einen Wert ausgibt, der angibt, ob die Zeichenfolge ein englisches Wort ist oder nicht. Sie dürfen in 15% der bereitgestellten Testfälle Fehler machen.
Eingabedetails:
Die Eingabe ist eine 4-stellige Zeichenfolge, die nur die englischen Kleinbuchstaben (az) enthält.
Ausgabedetails:
Ist der Eingang ist ein englisches Wort , sollten Sie die Ausgabe ein boolean true
oder eine ganze Zahl 1
.
Wenn die Eingabe kein englisches Wort ist, sollten Sie einen Booleschen Wert false
oder eine Ganzzahl ausgeben 0
.
Wortlisten
Liste der englischen Wörter mit 4 Buchstaben (2236 Wörter)
Liste von 4-Buchstaben-Zeichenfolgen (2236 Zeichenfolgen)
Die Nicht-Wortliste enthält einheitlich zufällig erzeugte Buchstabenfolgen, aus denen die realen Wörter entfernt wurden.
Testen
Ihr Programm oder Ihre Funktion sollte nicht mehr als 15% Fehler in den angegebenen Wortlisten zusammen machen. Dies bedeutet, dass Sie für 670 der 4472 bereitgestellten Eingänge eine falsche Ausgabe angeben können.
Sie sollten das Testprogramm oder die Funktion auch posten, damit andere Ihre Antwort überprüfen können. Die Länge Ihres Testprogramms fließt nicht in Ihre Einreichungsbewertung ein.
Standardlücken sind nicht zulässig.
Ihr Programm sollte keine externen Quellen verwenden, z. B. Zugriff auf das Internet oder Lesen aus einer Datei.
Dies ist Code-Golf, also gewinnt das kürzeste Programm oder die kürzeste Funktion.
quelle
Antworten:
Ruby, 29 Bytes
Hoffentlich habe ich das richtig verstanden - ich programmiere zum ersten Mal in Ruby. Ich habe eigentlich alle meine Tests in Python durchgeführt, war aber
import re
viel zu lang für mich.Dies ist eine anonyme Funktion, die eine Zeichenfolge aufnimmt und entsprechend ausgibt
true/false
. Es wird ein regulärer Ausdruck verwendet, der nach einem der folgenden zwei Dinge sucht:jqxz
Wenn eine von diesen vorhanden ist, klassifizieren wir die Eingabe als kein Wort.
Die Funktion entspricht 2030 Wörtern (206 fälschlicherweise fehlgeschlagen) und 1782 Nichtwörtern (454 fälschlicherweise fehlgeschlagen), was insgesamt 660 Fehlklassifizierungen ergibt. Auf ideone getestet .
Danke an @ MartinBüttner für die Ruby-Hilfe. Martin weist auch darauf hin, dass ein vollständiges Programm die gleiche Anzahl von Bytes benötigt:
Danke auch an user20150203 für die Vereinfachung der Regex.
Ruby,
1586,1488,1349,1288,1203 BytesAls Bonus gibt es hier eine Funktion mit einem viel längeren regulären Ausdruck:
Ich wollte zeigen, dass Regex die Komprimierung immer noch übertreffen kann, daher klassifiziert dieser Fall jeden einzelnen Fall korrekt . Die Regex selbst ist ein bisschen wie der exponentielle Zerfall - die ersten Bits stimmen mit vielen Nicht-Wörtern überein, dann stimmt jedes Bit nacheinander immer weniger überein, bis ich aufgab und den Rest (ungefähr 200) am Ende verkettete. Einige von denen , die übrig waren sahen überraschend wie echte Worte (wie
chia
die ist ein Wort).Ich habe den Regex auf meinen Regex-Golfreiniger geworfen, den ich für eine andere Herausforderung geschrieben habe - er hat ungefähr 300 Bytes lang gespielt, bevor ich versuchen musste, die Dinge manuell zu mischen. Es gibt aber noch einiges zu golfen.
quelle
->s{!s[/[^aeiou]{3}|[jqxz]/]}
Hat nur 29 Bytes und passt zu 2030 Wörtern (fälschlicherweise fehlgeschlagen auf 206) und schlägt fehl auf 1782 nicht -Wörter (die falsch mit 454 übereinstimmen) für insgesamt 660 Fehlklassifizierungen. "v
. Danke user20150203!Groovy,
7774Ich habe das Testprogramm in Java geschrieben, das Sie in diesem Gist on Github finden. Hier ist die Ausgabe meines Testprogramms:
(629 Testfälle fehlgeschlagen)
PS: Ich denke, das wird sehr bald zu einem Problem mit dem regulären Golfspiel führen ...
Wenn die Antwort von Sp3000 (die Funktion) in Groovy konvertiert werden soll, wird dieselbe Zeichenanzahl verwendet. Als benannte Funktion:
oder unbenannte Funktion:
quelle
Javascript, 1626 Bytes:
Ich wollte nach einer Lösung suchen, die für jeden Charakter eine Ahnung hat, nach welcher man suchen könnte. Nicht so kurz, aber kein Regex und ein ziemlich gutes Ergebnis (Wörter: 101 Fehler, Nicht-Wörter, 228 Fehler)
Hier ist eine funktionierende Implementierung: http://fiddle.jshell.net/jc73sjyn/
Kurz gesagt: Das Objekt g enthält die Zeichen von a bis z (als Schlüssel), und für jedes von ihnen gibt es eine Reihe von Zeichen (auch als Schlüssel), die jeweils ein eventuell nachfolgendes Zeichen zusammen mit seinem Wahrscheinlichkeitsprozentsatz darstellen . Wo kein Objekt existiert, gibt es keine Wahrscheinlichkeit.
Die 3 Bewertungen (4 Buchstaben -> 3 Bewertungen) werden multipliziert, und ein Wort mit einer Bewertung von 60 und höher wird als echtes Wort betrachtet.
Beispiel: Für das Wort 'Cope' gibt es drei Suchvorgänge:
g [c] [o] = 20
g [o] [p] = 5
g [p] [e] = 20
score = 20 * 5 * 20 = 2000, was mehr als 60 ist, so dass einer gültig ist.
(Ich bin ziemlich neu mit Javascript, daher gibt es möglicherweise Möglichkeiten, es kürzer zu machen, von denen ich nichts weiß.)
LATE EDIT:
Völlig irrelevant, aber ich habe meinen Weg zu einem korrekteren g bewertet:
Neue Ergebnisse:
Wörter: 53 Fehler, Nichtwörter: 159 Fehler
http://fiddle.jshell.net/jc73sjyn/2/
quelle
for
Schleife entfernt haben.w=>
durch ,function(w)
und es wird für jeden Browser arbeiten.Python 2, 5254 Bytes
Diese Lösung trennt die guten Wörter in zwei Hälften. Die Suche überprüft zuerst die ersten 2 Zeichen, um die richtige Zeichenfolge zu finden, und sucht dann nach den zweiten 2 Zeichen in dieser Zeichenfolge. Nicht sehr kompakt, aber schnell zu schreiben. Diese Methode passt zu jedem Wort ohne Fehler.
quelle
C # WPF, 110
139Kürzer
Alte Antwort
quelle
var
Variablen verwenden und nicht einführen, es sei denn, dies ist erforderlich.Word VBA, 25 Bytes
Anonyme VBE-Direktfensterfunktion, die Eingaben als aktuelle Auswahl annimmt und ausgibt, wenn es sich um ein Wort handelt, das für das VBE-Direktfenster boolesch ist.
Testerfunktion
Die folgende Funktion wurde verwendet, um die obige Funktion gegen die Testfälle zu testen. Die Funktion schlug in 9,07 Prozent der Fälle fehl (396 der tatsächlichen Wörter und 10 der gefälschten Wörter)
quelle
Mathematica, 33 Bytes
Hey, jemand musste es tun!
Selbsterklärend.
quelle
Javascript ES6, 32 Bytes:
Verwenden Sie die Regex von @ Sp3000 Antwort :
Dadurch wird eine anonyme Funktion erstellt. Um es zu benutzen, wickelst du es einfach um
()
.Beispiel:
Dies hat genau die gleiche Fehlerrate wie @ Sp3000 und gibt
true
oderfalse
dementsprechend zurück.Alles Dank an @ Sp3000, dass ich seine Regex verwenden durfte.
quelle
F = function(s) { return /[^aeiou]{3}|[jqxz]/.test(s) }
.