Objectif
Écrivez un programme ou une fonction qui vérifie si un nom de variable est valide et affichez 1 ou True
s'il est valide, 0,5 s'il est valide mais commence par un trait de soulignement (_) et 0 ou False
s'il n'est pas valide.
Règles
- Un nom de variable dans la plupart des langues est valide s'il commence par un trait de soulignement ou une lettre (az, AZ, _) et que les autres caractères sont des traits de soulignement, des lettres ou des chiffres. (az, AZ, 0-9, _)
- Sortie 1 ou
True
si le nom de la variable est valide et 0 ouFalse
si non valide. - Cependant, il n'est pas recommandé de démarrer une variable avec un trait de soulignement, donc renvoyez 0,5 si elle commence par un trait de soulignement et que le nom est valide.
Cas de test
Contribution
abcdefghijklmnop
Sortie
1
Contribution
_test_
Sortie
0.5
(commence par un trait de soulignement)
Contribution
123abc
Sortie
0
(commence par un chiffre)
Contribution
A_b1C_23
Sortie
1
Contribution
_!
Sortie
0
(pas 0,5 car ce n'est pas valide)
Contribution
magical pony1
Sortie
0
(sans espaces)
Des échappatoires standard s'appliquent.
C'est le code-golf , donc le code le plus court l'emporte.
Bonus: -10% si votre programme / fonction sort 0
pour une chaîne vide ( ""
).
__init__
; aussi, non, les cours n'ont pas besoin d' un__init__
mais en ont généralement unRéponses:
JavaScript (ES6), 37 - 10% = 33,3 octets
4 octets enregistrés grâce à @ edc65
5,6 octets enregistrés grâce à @Mateon
la source
05AB1E ,
25242019 octetsCode:
Explication:
En bref, la formule de la chaîne
s
en pseudocode est:Essayez-le en ligne!
Utilise l' encodage CP-1252 .
la source
PHP (50 à 10% = 45)
Merci à Schism pour le -2 :)
Ne pas rivaliser avec les réponses de golflang, mais j'ai pensé que j'essaierais quand même.
Quelque chose à noter est qu'en PHP, sans le
/u
modificateur,\w
ne sélectionne que les lettres ASCII. Dans certaines autres langues / versions Regex, ce modèle ne fonctionnera pas.Edit : Je vois beaucoup de gens qui utilisent \ w et \ d dans leurs réponses, lorsqu'ils utilisent une langue qui comprend aussi des lettres et des chiffres non ASCII. Ce n'est PAS le casse-tête. Ils ont tort. (Je ne peux pas encore voter / commenter, désolé de devoir le dire de cette façon.)
la source
[a-z].../i
.\d
c'est exactement la même chose que[0-9]
.\w
est exactement le même que[A-Za-z0-9_]
developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/…Rétine,
30 - 10% = 2728 - 10% = 25,229 - 10% = 26,1 octetsLes deux versions sont éligibles au bonus, car elles gèrent correctement les entrées vides (sorties
0
)J'ai dû corriger un bogue causé par l'une des fonctionnalités de regex .NET, qui considère certains (lire autant) caractères Unicode comme des caractères "word". Heureusement, cela ne m'a coûté qu'un seul octet dans les deux versions. Il ne s'agissait que d'ajouter un modificateur pour rendre le comportement de correspondance des expressions rationnelles conforme aux normes ECMAScript. Plus à ce sujet ici .
Nouvelle version
2829 octets, réalisée par @ MartinBüttner. Merci!Explication
Tout d'abord, nous vérifions si l'entrée commence par un trait de soulignement. Si c'est le cas, l'entrée est dupliquée, avec une nouvelle ligne entre les deux. Par exemple:
_test_
->_test_\n_test_
, où\n
est la nouvelle ligne. Ensuite , nous essayons de correspondre à quelque chose, qui ne commence pas par un chiffre, mais il est suivi par un certain nombre de caractères « mot » (a-z
,A-Z
, chiffres et tirets) sur chaque ligne . Notez que si l'entrée a commencé avec un trait de soulignement et a été remplacée par deux lignes, cela correspondra aux deux lignes. Ensuite, nous vérifions si nous avons eu 2 correspondances et les remplaçons par0.5
. Une ligne vide ou invalide donnera toujours 0 correspondances et les noms de variables valides produiront toujours 1 correspondance.Ma propre version
3031 octetsExplication
Tous, nous vérifions d' abord si les mises en entrée avec un chiffre ou contient un caractère non-mot (autre chose que
a-z
,A-Z
, chiffres et tirets). Si c'est le cas, il est rejeté, car il n'est pas valide. Ensuite, nous vérifions s'il commence par un trait de soulignement. Si c'est le cas, il est remplacé par0.5
. Ensuite , nous vérifions si elle commence par un caractère non-chiffres (à ce stade , le premier caractère est soit0
,a-z
ouA-Z
. Seulsa-z
etA-Z
sont non-chiffres, évidemment). Si c'est le cas, il est remplacé par un1
. Ensuite, nous vérifions la chaîne vide et la remplaçons par0
.Essayez-le en ligne!
Essayez-le en ligne! Ancienne version
la source
^\D.*
stade, il peut commencer par un 0? C'est bizarre._
et a été remplacé par0.5
. Ensuite, il commence par un 0.Ψ
.\w
correspond à des caractères non ASCII, ce qu'il ne devrait pas faire (j'ai essayé de le donnerƜƝƞƟƠ
etᎳᎴᎵᎶᎷᎸᎹ
de le saisir). J'examinerai cela plus tard. La solution possible semble remplacer\w
par[a-zA-Z\d_]
.MATL , 27 octets
Cela fonctionne dans la version actuelle (15.0.0) de la langue.
L'entrée est une chaîne avec des guillemets simples.
Essayez-le en ligne!
Explication
la source
Pyke , 21 octets
(non compétitif, soustraction de chaîne ajoutée, diverses constantes de chaîne)
Explication:
la source
Python 3, 36 octets
Le code est de 40 octets long et donne droit au bonus de -10% .
Notez que cela ne fonctionnera correctement que pour les pages de codes qui n'ont pas de lettres / chiffres non ASCII.
la source
Pyth, 27 octets
Suite de tests
la source
Gogh , 29 octets
Exécutez en utilisant:
Explication
la source
Perl, 21 octets
Le score comprend +1 octet pour le
-p
commutateur. Essayez-le sur Ideone .la source
-$_||$_=...
expliquer la réponse vide? (en utilisant-
parce que+
c'est un noop en perl)Pyth, 19 octets
Essayez-le avec le compilateur Pyth .
Notez que cela ne fonctionnera correctement que pour les pages de codes qui n'ont pas de lettres / chiffres non ASCII.
Comment ça marche
la source
Facteur , 84 * 0,9 = 76,5
S'exécute sur l'écouteur (repl), définit une citation (fonction anonyme) qui prend une chaîne et affiche {0 | 1/2 | 1 }.
Le définissant comme un mot, c'est 97 caractères:
Comment ça marche:
R/ [_a-zA-Z]\w*/ R/ _.*/
définit deux expressions régulières.bi-curry@
applique partiellement la citation[ matches? 1 0 ? ]
à chaque expression régulière, en laissant deux citations au curry sur la pile.bi
applique chaque citation à la chaîne d'argument.Chacune de ces (citations au curry) laisse un 1 ou un 0, selon qu'elles correspondent. Le premier correspond aux noms bien formés, le second aux noms commençant par un trait de soulignement.
0 = 1 2 ? /
La dernière valeur est remplacée par 1 si elle était 0, ou par 2 si elle était 1. Ensuite, la première (1 ou 0, valide ou non) est divisée par la seconde (2 ou 1, commence par un soulignement ou non) .C'est loooong! Tous les conseils pour rétrécir un peu plus appréciés ...
Et je déteste les regexps!
PS.
tous les tests réussissent;)
la source
Dyalog APL , 19 octets - 10% = 17,1
{
...⍵
...}
fonction anonyme où l'argument droit est représenté par le⍵
⊃⍵
premier caractère (donne l' espace si vide)'_'=
1 si égal à « underbar, 0 sinon1+
évalue à 2 si underbar initiale, 1 autre⎕NC⍵
nom de classe ; -1 si nom non valide, 0 si non défini (mais nom valide), 2-9 si défini (et donc valide)la source
Mathematica, 93 octets
Honnêtement, je ne sais pas si cela peut être approfondi.
la source
Perl, 34 + 1 = 35 octets
Utilise le
-p
drapeau.Explication
la source
[_a-zA-Z]
->[^\W\d]
si perl fonctionne de la même manière que JavaScript, je pense que vous devriez aussi le faire\w*
\w+
.a
Python, 84-10% = 76 octets
la source
JavaScript ES7, 37 octets
Essayez-le en ligne
Comment ça marche:
Réponse de Port of @ Dennis's Perl
la source
Rubis, 44 octets
la source
/^([a-z_]).../i
au lieu de/^(_|\d)?.../
Ruby, 57 - 10% = 51,3 octets
Une approche assez naïve
la source
->(s){s=~/^$|^\d|\W/?0:s=~/^_/?0.5:1}
Lua, 82 - 10% = 73,8
Cas de test:
la source
Lua, 68 * .9 = 61,2 octets
Prend des arguments sur la ligne de commande
la source