Wort oder Nahwort?

8

Schreiben Sie ein Programm oder eine Funktion, die eine Zeichenfolge (oder das Äquivalent Ihrer Sprache) enthält, bestimmen Sie, ob die Zeichenfolge ein Wort ist oder nicht, und geben Sie einen wahrheitsgemäßen oder falschen Wert aus.

(Dies ist kein Duplikat von Ist dies überhaupt ein Wort? Die falschen Wörter werden auf eine ganz andere Weise generiert, die meiner Meinung nach eine völlig andere Herausforderung darstellt.)

Die Wörter werden alle in Kleinbuchstaben zwischen 5 und 10 Zeichen geschrieben und haben keine Apostrophe.

Die richtigen Wörter sind eine zufällig ausgewählte Teilmenge der englischen SCOWL-Wortliste (Größe 50).

Die falschen Wörter werden auf zwei Arten generiert: Tauschen und Ersetzen.

Die "Austausch" -Wörter werden unter Verwendung eines modifizierten Fisher-Yates-Shuffle für die Buchstaben zufällig ausgewählter (realer) Wörter erzeugt. Anstatt die Buchstaben jedes Mal auszutauschen, kann ein Buchstabe ausgetauscht werden oder nicht (die Wahrscheinlichkeit variiert, sodass einige Wörter realistischer sind als andere). Wenn das neue Wort mit einem vorhandenen Wort übereinstimmt, wird das Ergebnis verworfen und ein anderes Wort generiert.

Die "Substitutions" -Wörter werden mit einer ähnlichen Methode erzeugt, aber anstatt den Buchstaben durch einen anderen Buchstaben zu tauschen, hat jeder Buchstabe die Möglichkeit, durch einen anderen zufälligen Buchstaben ersetzt zu werden.

Jede Methode wird verwendet, um 50% der gefälschten Wörter zu generieren.

Wertung

Ihre Funktion muss kleiner als 150 Byte sein . Die Wertung wird wie folgt ermittelt:

percentage of answers correct + ((150 - length of program) / 10) 

Regeln

Da es sich um eine große Anzahl von Testfällen handelt (jede Wortliste besteht aus 1000 Wörtern), ist ein automatisiertes Testprogramm in Ordnung. Der automatisierte Tester zählt nicht zur Länge des Programms. Es sollte jedoch veröffentlicht werden, damit andere es testen können.

  • Keine Lücken.
  • Keine integrierten Funktionen für Rechtschreibung / Wörterbuch.

Ressourcen

Liste der Wörter: http://pastebin.com/Leb6rUvt

Liste der nicht Wörter (aktualisiert) : http://pastebin.com/rEyWdV7S

Andere Ressourcen (SCOWL-Wortliste und der Code, der zum Generieren der zufälligen Wörter verwendet wird): https://www.dropbox.com/sh/46k13ekm0zvm19z/AAAFL25Z8ogLvXWTDmRwVdiGa?dl=0

Daniel M.
quelle
2
Ich weiß, dass eine verfügbare Wortliste den Punkt der Herausforderung zunichte machen würde, aber woher soll ein Programm wissen, dass Grits (404 in der Nicht-Wortliste) kein Wort sind, wenn man bedenkt, dass es wirklich wirklich eines ist?
Geobits
2
Versteh mich nicht falsch; Ich mag Grütze überhaupt nicht. Warum jemand sie essen würde, ist mir ein Rätsel. Aber selbst ich würde nicht so weit gehen, das Wort selbst abzulehnen: P
Geobits
Faire Warnung: Ich bin nicht weiter als das auf der Liste gegangen, also ist es möglich, dass es andere gibt.
Geobits
Ein paar mehr Wort nicht Worte, einige etwas verschleiern: quais, paves, colic, supermax. (Randnotiz: Ich war erfreut herauszufinden, dass dies supermaxein tatsächliches Wort ist)
Sp3000
Was seltsam ist, ist, dass das Durchlaufen der Liste durch SCOWLs größte Liste keine davon erfasst hat, obwohl es sich definitiv um Wörter handelt. Ich habe weitere 1000 Wörter generiert (sie befinden sich im Link zu den anderen Ressourcen). Wenn ein Nicht-Wort tatsächlich ein Wort ist, wird es durch das Wort in der alternativen Liste ersetzt, das dieselbe Zeilennummer hat. In der Zwischenzeit habe ich das Pastebin-Ding aktualisiert, um die alternativen Wörter für das Wort Nicht-Wörter zu verwenden.
Daniel M.

Antworten:

8

PHP 64,9 (50%, 1 Byte)

Nun, ich bin mir nicht sicher, ob dies eine akzeptable Antwort ist, aber hier ist:

1

Laufen Sie so:

echo '1' | php -- word

Bei einer gleich großen Liste korrekter und falscher Wörter führt dies offensichtlich zu 50% falsch positiven und 0% falsch negativen Ergebnissen, also zu 50% richtig. Da das Programm jedoch 1 Byte umfasst, erhalten Sie den maximal möglichen Längenbonus (ungeachtet der Antworten mit der Länge Null).

aross
quelle
Interessanterweise ist dies aufgrund des Gleichgewichts ziemlich konkurrierend. +1
Addison Crump
6

CJam, 78,6 (78,5%, 149 Bytes)

l2b0"(1»\]ÁûKëá*ßð%äp`Ï_5ÚY÷:Ä$î ëQXV)­JKÆ¿-(ivHì?{'à\ßÐiCæz°P0ãª/îÏèÄ)WCÅH±Ø^2Ô¥?
î'jJ#OAõ~×cA$[8,ô#~¬#7>"255b2b+=

Entspricht 696 echten Wörtern und nicht mit 874 Nichtwörtern 1570/2000 = 0.785. Getestet auf dem Online-Interpreter in Chrome - Ich bin nicht sicher, ob der Permalink in Firefox funktioniert. Falls dies nicht der Fall ist, kann die Zeichenfolge, die nicht druckbare Dateien enthält, von abgerufen werden

[24 40 5 49 25 187 92 93 193 251 158 131 75 235 131 225 42 129 223 240 14 37 228 112 96 207 95 53 218 89 247 58 3 196 3 36 1 238 143 32 235 139 81 15 88 86 41 20 173 74 75 198 191 45 40 105 118 72 236 63 123 39 224 15 15 92 223 208 16 147 105 140 67 16 230 122 176 80 26 48 133 227 148 144 170 47 238 207 232 136 24 196 41 87 132 67 197 72 177 216 94 24 50 212 165 63 10 238 39 106 74 35 79 65 245 126 215 136 6 99 65 36 91 56 44 143 155 150 244 35 126 172 35 55 62]:c

Das Programm hascht lediglich die Eingabe und führt eine Suche basierend auf 1077 möglichen Buckets durch. Ich habe versucht, Regex zu spielen, aber die Nicht-Wörter waren zu nah an echten Wörtern, als dass sie nützlich wären.

Probieren Sie es online aus! | Testsuite (vollständige Wortliste einfügen, um die Anzahl der Übereinstimmungen zu zählen)

Sp3000
quelle
1
"Ich habe versucht, Regex Golf zu spielen, aber die Nicht-Wörter waren zu nah an echten Wörtern" - so ziemlich das Ziel
Daniel M.
3

Mathematica, 69,35 (69,35%, 150 Byte)

StringContainsQ[" "|##&@@"seaeiislaanreuaooesrtnlneimdiuuosnlrlggtwtwnsdjexexavsvnuvtxsgokcmairlzlzeyatgpnlfiyhtcdxrvmuqtqtmsfohnk"~StringPartition~2]

Erläuterung

Die Funktion prüft, ob das Wort bestimmte Buchstabenpaare enthält, die in echten Wörtern selten vorkommen. In diesem Fall kehrt die Funktion zurück Trueund zeigt an, dass das Wort wahrscheinlich kein echtes Wort ist. Zum Beispiel kommt das Paar "ii"21 Mal in der Liste der nicht Wörter vor, während es in der Liste der Wörter nicht vorkommt.

Richtige Rate

Words:      85.4%  
Not words:  53.3%
njpipeorgan
quelle
0

CSharp, 69,85 (57,45%, 26 Bytes)

"hoeiaunrt".Contains(s[1])

Ich überprüfe, ob der zweite Buchstabe des Wortes auf der Liste der beliebtesten zweiten Buchstaben in Englisch steht ( von dieser Seite ).

Automatisierter Test:

static void Main(string[] args)
{
string[] good = System.IO.File.ReadAllLines( @"PATH_GOOD.txt");
string[] bad = System.IO.File.ReadAllLines(@"PATH_BAD.txt");

int counter_good = 0;
int counter_bad = 0;

foreach (string s in good)
{
    if ("hoeiaunrt".Contains(s[1])) counter_good++;
}

foreach (string s in bad)
{
    if (!("hoeiaunrt".Contains(s[1]))) counter_bad++;
}

Console.WriteLine(counter_good);
Console.WriteLine(counter_bad);

Console.ReadLine();
}

Ergebnis:

828
321

Berechnung:

(828+321)/20 + 124/10 = 57.45 + 12.4 = 69.85
ivaan
quelle
0

ES6, 76 (67,4%, 64 Byte)

Diesmal eine ernstere Antwort. Dies ist ein ziemlich einfacher Algorithmus. Es gibt einen wahrheitsgemäßen Wert zurück, wenn das zweite Zeichen eines Wortes eines von ist aeinoru. Es ergibt keine wesentlich bessere Erfolgsquote als nur 1, aber es ist immer noch sehr kurz.

w=>/^[^qxy][aehil-prux]/.test(w)>/[^aeiouy]{3}|[fiopq]$/.test(w)

Hier testen.

  • +2,7 durch Hinzufügen eines regulären Ausdrucks, um Wörter mit 3 oder mehr aufeinanderfolgenden Konsonanten zu finden und sie als "Nicht-Wort" zu regeln
  • +0.1 durch Ersetzen &!durch>
  • +1,95 durch Ausschließen der ungewöhnlichsten ersten Zeichen qxy, Hinzufügen von mehr gültigen (allgemeinen) zweiten Zeichen, um falsche Negative zu kompensieren, und Entfernen des redundanten Kommas in Regex
  • +0.05 durch Ausschließen von Wörtern, die mit den unwahrscheinlichen Endzeichen enden fiopq
aross
quelle