Seu desafio é determinar se a entrada fornecida é um número inteiro, uma sequência de caracteres ou um decimal.
Regras
- Uma string é qualquer entrada que não seja um número inteiro ou flutuante
- Um número inteiro deve conter apenas caracteres numéricos e não deve começar com um zero
- Um decimal é qualquer entrada que contenha o ponto (
.
) e o ponto é cercado por caracteres numéricos.
Nota: .01 não é considerado um decimal válido.
- O programa deve gerar uma string não processada "string", "integer" ou "decimal".
- Você pode assumir que apenas caracteres ASCII imprimíveis são usados
Casos:
asdf -> string
asdf3.4 -> string
2 -> integer
2.0 -> decimal
02 -> string
40. -> string
. -> string
.01 -> string
0.0 -> decimal
.9.9.9 -> string
[empty space] -> string
EDIT: Corrigido o erro de digitação. Eu quis dizer .01 sem o zero inicial, não com. Se isso deixou claro, está consertado agora!
Este é o código-golfe , por isso a resposta mais curta vence.
02
não é considerado um número inteiro porque a maioria dos idiomas apara os zeros à esquerda quando o tipo é um,integer
mas mantém os zeros à esquerda quando é armazenada como astring
. Embora, eu estou com @isaacg que, se0.0
for considerado um decimal, também0.01
deve ser..01
sem contar faz sentido, eu acho ...Respostas:
Pitão, 33 bytes (39 sem string compactada)
Alguns bytes são removidos devido ao Markdown. Código oficial e suíte de testes.
Sem corda embalada:
Ele passa em todos os casos de teste acima. Basicamente, para verificar se uma string é um número inteiro ou decimal, ela verifica se a string pode ser avaliada como um literal python (
v
) e, se sim, se você pode adicionar 0 a ela e encobri-la de volta à sua representação de string, e obtenha a sequência de entrada. Nesse caso, é um número inteiro ou um decimal. Se você também pode convertê-lo para um int e ainda recuperar a string original, é um número inteiro.fonte
Javascript,
11212187 bytesObrigado a @ edc65 por salvar 34 bytes, convertendo o código original (na explicação) para ES6. Não mudei a explicação porque mostra melhor a lógica.
Isso basicamente converte as regras para um número inteiro e decimal na pergunta em verificações de regex e as testa com relação à entrada fornecida. Se a entrada não corresponder, deve ser uma sequência. Ele passa em todos os testes fornecidos na pergunta.
Ungolfed + explicação
}
fonte
01.23
.b("0.123")
caso. Desculpe por isso, uma vez que foi mencionado explicitamente na pergunta que um número inteiro não poderia ter zeros à esquerda, presumi que não se aplicava a decimais.a=>/^[1-9]\d*$/.test(a)?"integer":/^([1-9]\d+|\d)\.\d+$/.test(a)?"decimal":"string"
... não o mais curto possível de qualquer maneirab=
para que ele funcionasse no Chrome. Para mim, ele mostra o original você postou a ser 85 bytes, em vez de 83, mais os 2 bytes para um total de 87.b=
) não é contada. E o resto é 83, tenha cuidado com caracteres invisíveis estranhos inseridos pelo editor de comentários - há alguns no meu comentário anterior entre "str" e "ing"Java, 133 bytes
fonte
JavaScript (ES6), 74
75Editar 1 byte salvo thx Zequ
Teste
fonte
[^0\D]
a correspondência regex para[1-9]
Perl 5, 59 bytes
Com o
-p
argumento na linha de comando (calculada na contagem de bytes):fonte
.0
. Para que servechop
?Perl 6 , 61 bytes
Uso:
fonte
Python 2, 148 bytes
fonte
JavaScript ES6,
7470 bytesfonte
02
?/^\d+$/
para^[1-9]\d*
(75 bytes).