Objetivo
Escriba un programa o función que verifique si el nombre de una variable es válido y el resultado 1 o True
si es válido, 0.5 si es válido pero comienza con un guión bajo (_) y 0 o False
si no es válido.
Reglas
- Un nombre de variable en la mayoría de los idiomas es válido si comienza con un guión bajo o una letra (az, AZ, _) y el resto de los caracteres son guiones bajos, letras o números. (az, AZ, 0-9, _)
- Salida 1 o
True
si el nombre de la variable es válido y 0 oFalse
si no es válido. - Sin embargo, no es una buena práctica comenzar una variable con un guión bajo, por lo tanto, devuelva 0.5 si comienza con un guión bajo y el nombre es válido.
Casos de prueba
Entrada
abcdefghijklmnop
Salida
1
Entrada
_test_
Salida
0.5
(comienza con un guión bajo)
Entrada
123abc
Salida
0
(comienza con un número)
Entrada
A_b1C_23
Salida
1
Entrada
_!
Salida
0
(no 0.5 porque no es válido)
Entrada
magical pony1
Salida
0
(No hay espacios)
Se aplican lagunas estándar .
Este es el código de golf , por lo que gana el código más corto.
Bonificación: -10% si su programa / función genera 0
una cadena vacía ( ""
).
__init__
; Además, no, las clases no necesitan un,__init__
pero generalmente tienen unoRespuestas:
JavaScript (ES6), 37-10% = 33.3 bytes
Guardado 4 bytes gracias a @ edc65
5,6 bytes guardados gracias a @Mateon
fuente
05AB1E ,
25242019 bytesCódigo:
Explicación:
En resumen, la fórmula para la cadena
s
en pseudocódigo es:Pruébalo en línea!
Utiliza la codificación CP-1252 .
fuente
PHP (50-10% = 45)
Gracias a Schism por el -2 :)
No para competir con las respuestas de golflang, pero pensé que lo intentaría de todos modos.
Algo a tener en cuenta es que en PHP, sin el
/u
modificador,\w
solo selecciona letras ASCII. En algunos otros idiomas / sabores Regex, este patrón no funcionará.Editar : veo a muchas personas que usan \ wy \ d en sus respuestas, cuando usan un idioma que también incluye letras y dígitos que no son ASCII. Ese NO es el rompecabezas. Están equivocados. (Todavía no puedo votar / comentar, lamento tener que decirlo de esta manera).
fuente
[a-z].../i
.\d
es exactamente lo mismo que[0-9]
.\w
es exactamente lo mismo que[A-Za-z0-9_]
developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/…Retina,
30 - 10% = 2728 - 10% = 25.229 - 10% = 26.1 bytesAmbas versiones califican para bonificación, ya que manejan la entrada vacía correctamente (salidas
0
)Tuve que corregir un error causado por una de las características de expresión regular de .NET, que considera algunos (leer tantos) caracteres Unicode como caracteres de "palabra". Afortunadamente, esto me costó solo un byte en ambas versiones. Solo se redujo a agregar un modificador para hacer que el comportamiento de coincidencia de expresiones regulares sea compatible con los estándares ECMAScript. Más sobre eso aquí .
Nueva versión
28 de29 bytes, realizada por @ MartinBüttner. ¡Gracias!Explicación
Primero, verificamos si la entrada comienza con un guión bajo. Si lo hace, la entrada se duplica, con una nueva línea en el medio. Por ejemplo:
_test_
->_test_\n_test_
, donde\n
está la nueva línea. Entonces tratamos de coincidir con nada, que no se inicia con un número, pero es seguido por cualquier número de caracteres "palabra" (a-z
,A-Z
, dígitos, y subrayado) en cada línea . Tenga en cuenta que si la entrada comenzó con un guión bajo y fue reemplazada por dos líneas, esto coincidirá con ambas líneas. Luego verificamos si teníamos 2 coincidencias y las reemplazamos por0.5
. La línea vacía o no válida siempre generará 0 coincidencias, y los nombres de variables válidos siempre generarán 1 coincidencia.Mi propia versión de
3031 bytesExplicación
En primer lugar, comprobamos si de entrada comienza con un dígito o contiene un carácter no-palabra (que no sea nada
a-z
,A-Z
, dígitos y subrayado). Si lo hace, se descarta porque no es válido. Luego verificamos si comienza con un guión bajo. Si lo hace, se reemplaza con0.5
. Luego comprobamos si comienza con un carácter no numérico (en este punto el primer carácter es cualquiera0
,a-z
oA-Z
. Sóloa-z
yA-Z
son no dígitos, obviamente). Si lo hace, se reemplaza con a1
. Luego verificamos si hay una cadena vacía y la reemplazamos por0
.Pruébalo en línea!
Pruébalo en línea! Versión antigua
fuente
^\D.*
etapa puede comenzar con un 0? Eso es raro._
fue reemplazado por0.5
. Luego comienza con un 0.Ψ
.\w
coincide con caracteres no ASCII, lo que no debería hacer (he intentado darloƜƝƞƟƠ
yᎳᎴᎵᎶᎷᎸᎹ
como entrada). Lo investigaré más tarde. Posible solución parece reemplazar\w
con[a-zA-Z\d_]
.MATL , 27 bytes
Esto funciona en la versión actual (15.0.0) del lenguaje.
La entrada es una cadena con comillas simples.
Pruébalo en línea!
Explicación
fuente
Pyke , 21 bytes
(no competitiva, resta de cadena agregada, varias constantes de cadena)
Explicación:
fuente
Python 3, 36 bytes
El código tiene 40 bytes de longitud y califica para el bono de -10% .
Tenga en cuenta que esto solo funcionará correctamente para páginas de códigos que no tengan letras / dígitos que no sean ASCII.
fuente
Pyth, 27 bytes
Banco de pruebas
fuente
Gogh , 29 bytes
Ejecutar usando:
Explicación
fuente
Perl, 21 bytes
La puntuación incluye +1 byte para el
-p
cambio. Pruébalo en Ideone .fuente
-$_||$_=...
para explicar la respuesta vacía? (usando-
porque+
es un noop en perl)Pyth, 19 bytes
Pruébalo con el compilador Pyth .
Tenga en cuenta que esto solo funcionará correctamente para páginas de códigos que no tengan letras / dígitos que no sean ASCII.
Cómo funciona
fuente
Factor , 84 * 0.9 = 76.5
Se ejecuta en el oyente (repl), define una cita (función anónima) que toma una cadena y genera {0 | 1/2 | 1}.
Definiéndolo como una palabra, son 97 caracteres:
Como funciona:
R/ [_a-zA-Z]\w*/ R/ _.*/
define dos expresiones regularesbi-curry@
aplica parcialmente la cita[ matches? 1 0 ? ]
a cada expresión regular, dejando dos citas al curry en la pila.bi
aplica cada cita a la cadena de argumento.Cada una de esas (citas al curry) deja un 1 o un 0, dependiendo de si coinciden. Las primeras coincidencias en los nombres bien formados, la segunda en los nombres que comienzan con guión bajo.
0 = 1 2 ? /
El último valor se reemplaza con un 1 si era 0, o con un 2 si era 1. Luego, el primero (1 o 0, válido o no) se divide por el segundo (2 o 1, comienza con un guión bajo o no) .¡Esto es muuuucho! Cualquier sugerencia para reducir un poco más apreciada ...
¡Y odio las expresiones regulares!
PD.
todos pasan la prueba;)
fuente
Dyalog APL , 19 bytes - 10% = 17.1
{
...⍵
...}
función anónima donde el argumento correcto está representado por el⍵
⊃⍵
primer carácter (da espacio si está vacío)'_'=
1 si es igual a 'barra inferior, 0 de lo contrario se1+
evalúa a 2 si la barra inferior inicial, 1 de lo contrario⎕NC⍵
nombra la clase ; -1 si el nombre no es válido, 0 si no está definido (pero el nombre es válido), 2-9 si está definido (y, por lo tanto, es válido)fuente
Mathematica, 93 bytes
Sinceramente, no estoy seguro de si esto se puede jugar más.
fuente
Perl, 34 + 1 = 35 bytes
Usa la
-p
bandera.Explicación
fuente
[_a-zA-Z]
->[^\W\d]
si perl funciona igual que JavaScript, creo que también\w*
\w+
.a
Python, 84-10% = 76 bytes
fuente
JavaScript ES7, 37 bytes
Pruébalo en línea
Cómo funciona:
Port of @ Dennis's Perl respuesta
fuente
Ruby, 44 bytes
fuente
/^([a-z_]).../i
vez en lugar de/^(_|\d)?.../
Ruby, 57-10% = 51.3 bytes
Un enfoque bastante ingenuo
fuente
->(s){s=~/^$|^\d|\W/?0:s=~/^_/?0.5:1}
Lua, 82 - 10% = 73.8
Casos de prueba:
fuente
Lua, 68 * .9 = 61,2 bytes
Toma argumentos en la línea de comando
fuente