Étant donné une chaîne en entrée, déterminez s'il s'agit d'un nom ou non.
Vous serez noté sur les 1000 mots anglais les plus courants, par combien vous étiquetez correctement comme nom ou non.
Le programme ou la fonction qui classe correctement la plupart de ces mots dans 50 octets ou moins gagnera.
Noms
Un nom est un mot qui représente une chose, généralement. Cela devient plus complexe, mais c'est l'idée de base.
Dans les cas où un mot pourrait être un nom ou une autre partie du discours, je l'ai classé comme un nom, même si c'est un usage rare. Ou en fait, je laisse ce site le faire pour moi.
Les mots sur lesquels vous serez noté sont ces 1000 mots courants , qui viennent de Wikipédia simple , avec "deux" et "une fois" ajoutés. De ceux-ci, ce sont les 586 noms , et ce sont les 414 non-noms . Vous pouvez trouver les trois listes ici . Notez que toutes ces entrées sont en minuscules. Ces listes sont définitives - n'essayez pas d'argumenter la grammaire.
Votre programme sera considéré comme correct s'il génère un résultat véridique sur une entrée qui est un nom et un résultat faux sur une entrée qui n'est pas un nom.
Subtilités:
Les programmes doivent avoir une sortie déterministe. Si vous voulez utiliser l'aléatoire, semez-le. Les programmes ne sont pas autorisés à utiliser des listes de noms intégrées ou d'autres fonctionnalités intégrées de partie du discours.
Exemples:
a: noun
act: noun
active: noun
about: non-noun
above: non-noun
across: non-noun
Veuillez indiquer le taux de réussite de votre programme dans votre réponse. Le programme ou la fonction d'au plus 50 octets avec le taux de réussite le plus élevé l'emporte. En cas d'égalité, le nombre d'octets le plus bas déterminera un gagnant. Bonne chance!
[bcdf-mp-tvwy]
est équivalente à la classe[^aenouxz]
. Une modification permettrait d'économiser 4 octets, qui pourraient être capitalisés.[^aenouz]
car nous n'avons pas de mot commençant par ax
.Gelée , 48 octets, score 731
C'est ma toute première réponse dans Jelly et j'ai eu beaucoup de mal à mettre cela ensemble. Ah bien ... c'était amusant. :-)
1 octet enregistré grâce à @JonathanAllan
Essayez-le en ligne!
Ventilation et suites de tests
Comment?
Nous calculons d'abord un hachage de la chaîne d'entrée par:
Cela nous laisse un index dans [0 ... 255] et divise ainsi tous les mots en 256 groupes.
Pour chaque groupe de mots, nous pré-calculons un drapeau binaire qui est
1
si le groupe contient plus de noms que de non-noms, et0
sinon. Cela conduit à un nombre N de 256 bits que nous allons utiliser comme table de recherche. Nous le stockons en tant que chaîne encodée en base 250.Ci - dessous est la représentation binaire de N .
Qui peut être stocké comme
“Ạ$ⱮẊḲḲLÑMṆụ⁻ẉṂ`ŻvḤæɠ5ṭȯƁU*×TdƲḥ`’
dans Jelly.D'où le code:
la source
O‘ḅ⁹%⁽€Oæ»4“Ạ$ⱮẊḲḲLÑMṆụ⁻ẉṂ`ŻvḤæɠ5ṭȯƁU*×TdƲḥ`’æ»Ḃ
(notez également que vous pouvez utiliser le pied de page sur TIO, j'irais avecÇ€¬S,L
etǀS,L
pour vos deux suites de tests.JavaScript (ES6), 50 octets, score 693
Il suffit de rechercher tous les modèles possibles que les non-noms ont que les noms n'ont pas.
Les non-noms contiennent plus souvent:
Fragment:
Afficher l'extrait de code
la source
/h|n/
(ou en faisant/^.[hn]/.test(s)
), et un autre en changeants[2]>''
en soit!!s[2]
ou2 in s
.a.p
redondant puisque vous l'avez déjà fait[aouz]
?[aouz]
n'est mis en correspondance qu'au début de la chaîne. Pour une raison quelconque, testera.p
n'importe où dans la chaîne améliore le score.Gelée , 50 octets , score 763
Utiliser un hachage maintenant (un peu comme la réponse d'Arnauld Jelly )
Essayez-le en ligne!
250/414 pour non-noms
513/586 pour les noms
Total = 250 + 513 = 763.
Comment?
Construit une table avec 308 entrées, soit 1 (identifiant un nom) ou 0 (identifiant un non-nom) et les indexe à l'aide d'une clé fournie par une fonction de hachage qui utilise le produit des ordinaux du mot d'entrée:
Précédent:
5047 octets , score 684Un lien monadique prenant un mot et renvoyant une liste d'un caractère (véridique) si le mot est identifié comme un nom, ou une liste vide ou zéro (les deux falsey) s'il ne l'est pas.
Essayez-le en ligne! (le pied de page effectue un if else sur le résultat à imprimer
Noun
ouNon-Noun
)... ou voir le programme de notation (compte les index véridiques sur les deux listes, puis calcule le score).
Répartition des scores: 462/586 noms correctement identifiés (124 incorrects), 222/414 non-noms correctement identifiés (192 incorrects) - total correct = 684/1 000.
Comment?
Je suppose que ce n'est pas un nom si ...
'be', 'th', 'le', 'he', 'm ', 'ev', 'et', 's ', 'fl', 'ax', 'en', 'fo', 'am', 'az'
(remarque:'m '
et's '
ne sont là que pour faciliter la compression, mais elles n'apparaissent jamais de toute façon)aenouyz
(bien que cela soit implémenté inversement et avec des majuscules en excès)... puisque les mots ont tous une longueur comprise entre 1 et 11, l' indice -299 ème est équivalent à utiliser la longueur pour indexer le mappage:
{7:2; 8:5; 9:7; 11:9; else 1}
13 octets, score: 638
Un premier coup bas (étendu ci-dessus)
la source
0,-2
ne veut pas dire quepair zero with -2
cela signifieliteral [0, -2]
0,-2
un nilad, pas séparé(0)(,)(-2)
... bien sûr c'est le même effet dans ce cas mais pas toujours. J'ai appris à la dure ... et quoi qu'il en soit, je préférerais de toute façon expliquer ce qui se passe réellement au lieu de quelque chose avec le même effet ou quelque chose.j
»?pair
oujoin
sont évidemment de mauvaises manières de le formuler, car0,-2,-6
par exemple ne signifie paspair 0 with -2 and then pair that with -6 = [[0, -2], -6]
mais signifie plutôtliteral [0, -2, -6]
. Je comprends, l',
atome et le...,...(,...(...))
littéral prêtent à confusion ... mais ce0,-2,-6
n'est pas tout à fait la même chose0,-2;-6
puisque le premier est à 1 lien et le dernier à 3 liens.Julia 34 octets, 609
f(w)=hash(w)&0x0800000000004808>0
Je voulais économiser sur les personnages en utilisant le hachage intégré. J'ai l'impression qu'il doit y avoir un moyen de faire mieux. Julia n'est tout simplement pas assez amicale avec les opérations de frappe que je veux utiliser pour améliorer cela, je pense.
Trouver des masques de bit appropriés pour le hachage pour les séparer est un jeu intéressant.
la source
Python 2 , 50 octets, précision: 596
Essayez-le en ligne!
Vérifie simplement la première lettre, la longueur et si "st" est dans le mot Code suppose que le mot est défini comme x (Edit: Merci à issacg pour la correction du code de l'extrait à la fonction)
la source
Haskell, 36 octets,
626631la source
length x>2&&(x!!0`notElem`"aenou"||x!!1`elem`"acqrsty")
Implémentation de la porte logique à 2 niveaux, pas 50 octets, score 1000
Branchez simplement la représentation binaire du mot donné aux 88 entrées
Le circuit renvoie 1 si le mot est un nom et renvoie 0 sinon
Cette mise en œuvre a besoin
Quelques mesures
Circuit.pdf en pleine résolution ici
Circuit.png pleine résolution ici
la source
Python 3, 50 octets, score 602
Python n'est pas le langage le plus verbeux, mais 50 octets est difficile.
la source