Objetivo
Escreva um programa ou função que verifique se um nome de variável é válido e gera 1 ou True
se é válido, 0,5 se é válido, mas começa com um sublinhado (_) e 0 ou False
se não é válido.
Regras
- Um nome de variável na maioria dos idiomas é válido se começar com um sublinhado ou letra (az, AZ, _) e o restante dos caracteres forem sublinhados, letras ou números. (az, AZ, 0-9, _)
- Saída 1 ou
True
se o nome da variável for válido e 0 ouFalse
se não for válido. - No entanto, não é uma boa prática iniciar uma variável com um sublinhado; portanto, retorne 0,5 se começar com um sublinhado e o nome for válido.
Casos de teste
Entrada
abcdefghijklmnop
Saída
1
Entrada
_test_
Saída
0.5
(começa com um sublinhado)
Entrada
123abc
Saída
0
(começa com um número)
Entrada
A_b1C_23
Saída
1
Entrada
_!
Saída
0
(não 0,5 porque não é válido)
Entrada
magical pony1
Saída
0
(sem espaços)
Aplicam-se brechas padrão .
Isso é código-golfe , então o código mais curto vence.
Bônus: -10% se o seu programa / função gerar 0
uma string vazia ( ""
).
__init__
; Além disso, não, as classes não precisam de um,__init__
mas normalmente têm umRespostas:
JavaScript (ES6), 37 - 10% = 33,3 bytes
Guardado 4 bytes graças a @ edc65
Guardado 5,6 bytes graças a @Mateon
fonte
05AB1E ,
25242019 bytesCódigo:
Explicação:
Em resumo, a fórmula para a sequência
s
no pseudocódigo é:Experimente online!
Usa a codificação CP-1252 .
fonte
PHP (50 - 10% = 45)
Obrigado ao Schism pela -2 :)
Para não competir com as respostas do golflang, mas pensei em tentar de qualquer maneira.
Algo a se notar é que, no PHP, sem o
/u
modificador,\w
apenas seleciona letras ASCII. Em alguns outros idiomas / tipos de expressão regular, esse padrão não funcionará.Editar : vejo muitas pessoas usando \ w e \ d em suas respostas, quando usam um idioma que inclui letras e dígitos não-ASCII também. Esse não é o quebra-cabeça. Eles estão errados. (Não é possível votar / comentar ainda, desculpe-me por contar dessa maneira.)
fonte
[a-z].../i
.\d
é exatamente o mesmo que[0-9]
.\w
é exatamente o mesmo que[A-Za-z0-9_]
developer.mozilla.org/pt-BR/docs/Web/JavaScript/Guide/…Retina,
30 - 10% = 2728 - 10% = 25,229 - 10% = 26,1 bytesAmbas as versões se qualificam para o bônus, pois lidam corretamente com entradas vazias (saídas
0
)Eu tive que corrigir um bug causado por um dos recursos de regex do .NET, que considera alguns (leia tantos) caracteres Unicode como caracteres "word". Felizmente, isso me custou apenas um byte em ambas as versões. Tudo se resumia a adicionar um modificador para tornar o comportamento de correspondência de expressões regulares compatível com os padrões ECMAScript. Mais sobre isso aqui .
Nova versão de
28bytes de28, feita por @ MartinBüttner. Obrigado!Explicação
Primeiro, verificamos se a entrada começa com um sublinhado. Nesse caso, a entrada é duplicada, com uma nova linha no meio. Por exemplo:
_test_
->_test_\n_test_
, onde\n
está a nova linha. Em seguida, tentar igualar qualquer coisa, que não começa com um número, mas é seguido por qualquer número de caracteres "palavra" (a-z
,A-Z
, números e sublinhado) em cada linha . Observe que se a entrada começou com um sublinhado e foi substituída por duas linhas, isso corresponderá às duas linhas. Em seguida, verificamos se tivemos 2 correspondências e as substituímos por0.5
. Linhas vazias ou inválidas sempre produzirão 0 correspondências e nomes de variáveis válidas sempre produzirão 1 correspondência.Minha própria versão de
30bytesde31 bytesExplicação
Primeiro de tudo, vamos verificar se entrada começa com um dígito ou contém um caractere não-palavra (outra coisa senão
a-z
,A-Z
, dígitos e sublinhado). Se isso acontecer, ele será descartado, porque é inválido. Depois, verificamos se ele começa com um sublinhado. Se isso acontecer, é substituído por0.5
. Em seguida, vamos verificar se ele começa com um personagem não-dígito (neste momento o primeiro caractere ou é0
,a-z
ouA-Z
Only.a-z
EA-Z
são não-dígitos, obviamente). Se isso acontecer, é substituído por um1
. Em seguida, verificamos se há uma string vazia e a substituímos por0
.Experimente online!
Experimente online! Versão antiga
fonte
^\D.*
fase, pode começar com um 0? Isso é estranho._
e foi substituído por0.5
. Então começa com um 0.Ψ
.\w
está correspondendo caracteres não ASCII, o que não deve ser feito (tentei fornecerƜƝƞƟƠ
eᎳᎴᎵᎶᎷᎸᎹ
como entrada). Vou analisar isso mais tarde. A solução possível parece ser substituída\w
por[a-zA-Z\d_]
.MATL , 27 bytes
Isso funciona na versão atual (15.0.0) do idioma.
Entrada é uma string com aspas simples.
Experimente online!
Explicação
fonte
Pyke , 21 bytes
(não competitivo, subtração de string adicionada, várias constantes de string)
Explicação:
fonte
Python 3, 36 bytes
O código tem 40 bytes e se qualifica para o bônus de -10% .
Observe que isso só funcionará corretamente para páginas de código que não tenham letras / dígitos não ASCII.
fonte
Pitão, 27 bytes
Suíte de teste
fonte
Gogh , 29 bytes
Execute usando:
Explicação
fonte
Perl, 21 bytes
A pontuação inclui +1 byte para o
-p
switch. Experimente em Ideone .fonte
-$_||$_=...
para dar conta da resposta vazia? (usando-
porque+
é um noop em perl) #Pitão, 19 bytes
Experimente com o Pyth Compiler .
Observe que isso só funcionará corretamente para páginas de código que não tenham letras / dígitos não ASCII.
Como funciona
fonte
Fator , 84 * 0,9 = 76,5
Executa no ouvinte (repl), define uma cotação (função anônima) que pega uma string e gera {0 | 1/2 1}.
Definindo como uma palavra, são 97 caracteres:
Como funciona:
R/ [_a-zA-Z]\w*/ R/ _.*/
define duas expressões regulares.bi-curry@
aplica parcialmente a cotação[ matches? 1 0 ? ]
a cada regex, deixando duas cotações ao curry na pilha.bi
aplica cada cotação à sequência de argumentos.Cada uma dessas (cotações ao curry) deixa 1 ou 0, dependendo da correspondência. As primeiras correspondências nos nomes bem formados, a segunda nos nomes começando com sublinhado.
0 = 1 2 ? /
O último valor é substituído por 1 se for 0 ou com 2 se for 1. Então o primeiro (1 ou 0, válido ou não) é dividido pelo segundo (2 ou 1, começa com sublinhado ou não) .Isso é loooong! Quaisquer dicas para encolher um pouco mais apreciado ...
E eu odeio regexps!
PS.
todos os testes aprovados;)
fonte
Dyalog APL , 19 bytes - 10% = 17,1
{
...⍵
...}
função anônima onde o argumento direita é representada por⍵
⊃⍵
primeiro caractere (dá espaço se vazia)'_'=
1 se igual a 'underbar, 0 caso contrário1+
avalia a 2 se underbar inicial, 1 caso contrário⎕NC⍵
nome da classe ; -1 se nome inválido, 0 se indefinido (mas nome válido), 2-9 se definido (e, portanto, válido)fonte
Mathematica, 93 bytes
Sinceramente, não tenho certeza se isso pode ser jogado mais.
fonte
Perl, 34 + 1 = 35 bytes
Usa a
-p
bandeira.Explicação
fonte
[_a-zA-Z]
->[^\W\d]
se perl funciona da mesma forma JavaScript, eu acho que você também teria que fazer\w*
\w+
.a
Python, 84 -10% = 76 bytes
fonte
JavaScript ES7, 37 bytes
Experimente online
Como funciona:
Port of @ Dennis's Perl answer
fonte
Ruby, 44 bytes
fonte
/^([a-z_]).../i
em vez de/^(_|\d)?.../
Ruby, 57 - 10% = 51,3 bytes
Uma abordagem bastante ingênua
fonte
->(s){s=~/^$|^\d|\W/?0:s=~/^_/?0.5:1}
Lua, 82 - 10% = 73,8
Casos de teste:
fonte
Lua, 68 * .9 = 61,2 bytes
Recebe argumentos na linha de comando
fonte