Vous devez écrire un programme ou une fonction prenant une chaîne de 4 caractères en entrée et fournissant une valeur indiquant si la chaîne est un mot anglais ou non. Vous êtes autorisé à commettre des erreurs dans 15% des cas de test fournis.
Détails d'entrée:
L'entrée est une chaîne de 4 caractères contenant uniquement les lettres anglaises minuscules (az).
Détails de sortie:
Si l'entrée est un mot anglais, vous devez générer un booléen true
ou un entier 1
.
Si l'entrée n'est pas un mot anglais, vous devez indiquer un booléen false
ou un entier 0
.
Listes de mots
liste de mots anglais de 4 lettres (2236 mots)
liste de chaînes de 4 lettres autres que des mots (2236 chaînes)
La liste de non-mots contient des séquences de lettres générées de manière uniforme et aléatoire, sans les mots réels.
Essai
Votre programme ou fonction ne doit pas faire plus de 15% d’erreurs sur la liste de mots donnée. Cela signifie que vous pouvez donner une mauvaise sortie pour 670 des 4472 entrées fournies.
Vous devez également publier le programme ou la fonction de test afin que d’autres puissent vérifier votre réponse. La longueur de votre programme de test ne compte pas dans le score de vos soumissions.
Les failles standard sont interdites.
Votre programme ne doit utiliser aucune source externe, par exemple accéder à Internet ou lire un fichier.
C'est le code-golf donc le programme ou la fonction le plus court gagne.
la source
Réponses:
Ruby, 29 octets
J'espère que j'ai bien compris - c'est ma première programmation en Ruby. J'ai en fait fait tous mes tests en Python, mais ce
import re
fut beaucoup trop long pour moi.Il s'agit d'une fonction anonyme qui prend une chaîne et génère le résultat en
true/false
conséquence. Il utilise une expression régulière qui recherche l'une des deux choses suivantes:jqxz
Si l'un ou l'autre est présent, nous classons l'entrée comme n'étant pas un mot.
La fonction correspond à 2030 mots (manquant de manière incorrecte sur 206) et échoue à 1782 mots non (correspondant à 454 de façon incorrecte), pour un total de 660 classifications erronées. Testé sur ideone .
Merci à @ MartinBüttner pour l'aide de Ruby. Martin souligne également qu'un programme complet prend le même nombre d'octets:
Merci également à user20150203 pour simplifier la regex.
Ruby,
15861488134912881203 octetsPour un bonus, voici une fonction avec une expression rationnelle beaucoup plus longue:
Je voulais montrer que regex peut toujours battre la compression, donc celle-ci classe correctement chaque cas donné . La regex elle-même est un peu comme une décroissance exponentielle - les premiers bits correspondent à beaucoup de non-mots, puis de plus en plus concordants, jusqu'à ce que j'abandonne et concatène le reste (environ 200) à la fin. Certains de ceux qui restaient ressemblaient étrangement à de vrais mots (comme
chia
ce qui est un mot).J'ai lancé la regex sur mon nettoyeur de golf regex que j'avais écrit pour un autre défi: il jouait au golf environ 300 octets avant de devoir essayer de remuer les choses à la main. Il y a encore pas mal de choses à jouer au golf.
la source
->s{!s[/[^aeiou]{3}|[jqxz]/]}
ne contient que 29 octets et correspond à 2030 mots (échec incorrect sur 206) et échoue sur 1782 non -words (correspondant 454 de façon incorrecte), pour un total de 660 classifications erronées. "v
. Merci user20150203!Groovy,
7774J'ai écrit le programme de test en Java, que vous pouvez trouver dans ce Gist sur Github. Voici le résultat de mon programme de test:
(Échec de 629 cas de test)
PS je pense que cela va finir très vite par un problème de golf regex ...
Si la réponse de Sp3000 (la fonction) doit être convertie en Groovy, elle se retrouvera avec le même nombre de caractères. En tant que fonction nommée:
ou fonction non nommée:
la source
Javascript, 1626 octets:
Je voulais aller chercher une solution qui, pour chaque personnage, a un indice dont on pourrait suivre. Pas si court, mais pas de regex et un assez bon résultat (mots: 101 erreurs, non-mots, 228 erreurs)
Voici une implémentation qui fonctionne http://fiddle.jshell.net/jc73sjyn/
En bref: l’objet g contient les caractères de a à z (en tant que clés) et, pour chacun d’entre eux, il existe un ensemble de caractères (également en tant que clés) qui représentent chacun un caractère pouvant suivre, ainsi que son pourcentage de probabilité. . Là où aucun objet n'existe, il n'y a aucune probabilité.
Les 3 scores (4 lettres -> 3 évaluations) sont multipliés, et un mot avec un score de 60 et plus est considéré comme un mot réel.
Exemple: pour le mot 'Cope', il y a trois recherches:
g [c] [o] = 20
g [o] [p] = 5
g [p] [e] = 20
score = 20 * 5 * 20 = 2000, soit plus de 60, de sorte qu'un est valide.
(Je suis assez nouveau avec javascript, donc il y a peut-être des façons de le raccourcir que je ne connais pas.)
TARD EDIT:
Complètement non pertinent maintenant, mais j’ai évalué mon chemin vers un g plus correct:
Nouveaux résultats:
mots: 53 erreurs, non-mots: 159 erreurs
http://fiddle.jshell.net/jc73sjyn/2/
la source
for
boucle.w=>
parfunction(w)
et cela fonctionnera pour tous les navigateurs.Python 2, 5254 octets
Cette solution sépare les bons mots en deux moitiés. La recherche vérifie d'abord les 2 premiers caractères pour trouver la bonne chaîne, puis recherche les 2 derniers caractères de cette chaîne. Pas très compact, mais rapide à écrire. Cette méthode correspond à chaque mot sans erreur.
la source
C # WPF, 110
139Plus court
Ancienne réponse
la source
var
et en n'introduisant pas de variables sauf si nécessaire.Word VBA, 25 octets
Fonction de fenêtre immédiate VBE anonyme qui prend en entrée la sélection en cours et émet s'il s'agit d'un mot booléen dans la fenêtre immédiate de VBE.
Fonction testeur
La fonction ci-dessous a été utilisée pour tester la fonction ci-dessus par rapport aux cas de test. La fonction a échoué dans 9,07% des cas (396 mots réels et 10 mots fictifs).
la source
Mathematica, 33 octets
Hé, quelqu'un devait le faire!
Auto-explicatif.
la source
Javascript ES6, 32 octets:
En utilisant l'expression régulière de @ Sp3000, répondez :
Cela crée une fonction anonyme. Pour l'utiliser, il vous suffit de l'envelopper
()
.Exemple:
Cela a exactement le même taux d'échec que @ Sp3000 et renvoie
true
ou enfalse
conséquence.Tous les crédits dus à @ Sp3000 pour m'avoir permis d'utiliser ses regex.
la source
F = function(s) { return /[^aeiou]{3}|[jqxz]/.test(s) }
.