Prelúdio:
Eu queria treinar na criação de casos de teste, então vou experimentá-los em algo fácil.
Desafio:
Pegue qualquer entrada (string) (dentro do intervalo ASCII visível) e deduza se é um número e produza algo que possa ser usado para avaliar.
Regras:
- Um número conterá apenas os caracteres
-0123456789,.
- As respostas são necessárias apenas para reconhecer números entre -1000000000 e 1000000000 (exclusivo), mas podem reconhecer números arbitrariamente grandes.
- Você pode escrever um programa completo ou uma função.
- Se um número, retorne qualquer coisa que possa ser usada para discerni-lo e documente a saída na descrição (ex.
My program outputs T if a number, F if not.
). - Entrada terá qualquer quantidade de caracteres dentro do intervalo ASCII ou vazio (se vazio retornar o que você produziria se não fosse um número).
- Os números podem incluir um ponto decimal (ex.
3.14
). Se o fizerem, eles devem ter pelo menos um dígito antes do ponto decimal e pelo menos um depois dele. - Os números podem ter zeros à esquerda ou à direita (ex.
000001.00000
). - A parte inteira de um número pode ser dividida para facilitar a leitura em pedaços de três dígitos com vírgulas (ex.
1,000.23456
). Neste caso, devem ser dividida a cada três dígitos da direita para a esquerda (ex.1,234,567
,10,000.202
,123,234.00
,0,123.293
). - Os números negativos são indicados por um princípio
-
(ex.-1.23
). Uma+
indicação para indicar um número positivo não é permitida e deve resultar na saída falsa. - As exceções NÃO são contadas como saída válida e discernível (exceto quando elas podem transmitir saídas para o fluxo de saída padrão (por exemplo,
Exception on line N [...]
podem ser inseridas como saída para um número / não-número se a string for colocada no fluxo de saída padrão).
Casos de teste:
(assumindo a My program outputs T if a number, F if not.
versão)
123 -> T [on integer]
-123 -> T [negative numbers need to be handled]
0 -> T [on zero]
123.456 -> T [on floating point]
123,456.789 -> T [on evenly divided by 3 digits with comas]
123456789 -> T [thousand separators are not required]
0000001.00000 -> T [on leading/trailing zeros]
00.00 -> T [on zero and leading/trailing zeros]
999999999.9999999999999999999999999999999999999999999999999999 -> T [on close to the maximum value]
-999999999.9999999999999999999999999999999999999999999999999999 -> T [on close to the minimum value]
-> F [on empty]
lolz -> F [on non-number value]
n4melyh4xor -> F [on non-number with digits]
1.2 -> F [on space-padded]
9.3 1.3 -> F [on anyhow separated multiple numbers]
1e5 -> F [no scientific notation]
50cl05e.buty3ts0f4r -> F [on input with letters obscuring the number]
1,2,3,4.5678 -> F [on badly readability-divided number]
1,234.5,678 -> F [on readability-divided floating point part]
.234 -> F [on no leading zero]
+1 -> F [no leading + sign]
1.234.3 -> F [only one decimal point]
12345,678 -> F [on separator stopping mid-way]
code-golf , menos caracteres é o vencedor.
code-golf
number
decision-problem
n4melyh4xor
fonte
fonte
-123
estiver tudo bem, que tal+456
-> bom ou ruim. Ou é+
deixado de fora da festa?Respostas:
Retina ,
2829314034 bytesSaídas
1
se verdade,0
caso contrário. Pelo que entendi, nesse caso, a Retina gera o número de correspondências que o regex possui na entrada.Experimente online!
Suíte de teste
Editar% s
RegExplanation
fonte
m
eg
) na Retina?`
na frente do regex e os modificadores vão na frente dele, por exemplom`^.$
.g
não existe no .NET, as correspondências são globais por padrão.JavaScript,
4649 bytesEsta é uma porta direta da minha resposta Retina. A única razão pela qual eu usei JS é para que haja uma maneira fácil de testar a regex usando o Snack Snippet abaixo
fonte
isNaN(+prompt())
por 16 caracteres. Tal vida é, suponhoPerl 6 , 42 bytes
Tente
Expandido:
fonte
PHP, 62 bytes
O builtin não pode manipular vírgulas e aceita notação científica; então eu tive que seguir o caminho regex.
<?=is_numeric($argv[1]);
teria sido de 24 bytes.fonte
ferramentas bash / Unix, 64 bytes
Salve isso como um arquivo e passe a string a ser testada como o primeiro argumento para o comando.
A saída é 0 para um não número, 1 para um número.
Se você estiver disposto a aceitar a entrada do stdin e se puder garantir que a entrada consiste em apenas uma linha, remova o <<< "$ 1" no final, resultando em 57 bytes .
Quanto ao próprio código, a opção -c para egrep conta o número de linhas correspondentes (que serão 0 ou 1).
fonte
Pitão, 25 caracteres
Comprime a expressão regular de Kritixi Lithos .
Experimente online. Usa caracteres Unicode fora do Plano Multilíngue Básico, que o TIO aparentemente não consegue lidar? Este pequeno aplicativo relata o tamanho errado para a string. Esse contador de caracteres / bytes acertou.
fonte
C89, 195 bytes
Ungolfed:
fonte
Python 2, 79 bytes
Solução Regex
Experimente online
fonte
c #, 75 bytes
fonte