É um número inteiro, uma string ou um decimal?

8

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 , por isso a resposta mais curta vence.

noɥʇʎԀʎzɐɹƆ
fonte
5
Por que 02 não é um número inteiro? Parecem restrições arbitrárias para aumentar a dificuldade do desafio.
Addison Crump
1
Eu acho que 02não é considerado um número inteiro porque a maioria dos idiomas apara os zeros à esquerda quando o tipo é um, integermas mantém os zeros à esquerda quando é armazenada como a string. Embora, eu estou com @isaacg que, se 0.0for considerado um decimal, também 0.01deve ser. .01sem contar faz sentido, eu acho ...
hargasinski
3
@ Zequ .01 não conta faz sentido, eu acho ... - por quê? É válido em quase todos os idiomas.
mınxomaτ 26/12/15
2
Bem-vindo à programação de quebra-cabeças e código de golfe! Não é necessário executar ping desnecessariamente em todos os que comentaram sua pergunta; sua edição coloca automaticamente sua pergunta na fila de reabertura, onde será reaberta, se necessário. Além disso, muitos de seus desafios parecem ter sido fechados; convém experimentá- los primeiro em nossa Sandbox . Obrigado!
Maçaneta
1
@CrazyPython Acho que a ideia que você está obtendo com "número inteiro válido" e "decimal válido" é a ideia de uma representação canônica. Pelo que entendi suas regras, há exatamente uma maneira de escrever cada número inteiro e cada decimal. Se essa for a intenção, acrescentar isso ao desafio esclarecerá por que as regras são do jeito que são.
Isaacg

Respostas:

3

Pitão, 33 bytes (39 sem string compactada)

@_c."at%¸Ã`9hàãáÊ"7.x/`MsB+vz0z0

Alguns bytes são removidos devido ao Markdown. Código oficial e suíte de testes.

Sem corda embalada:

@_c"integerdecimalstring"7.x/`MsB+vz0z0

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.

isaacg
fonte
2

Javascript, 112 121 87 bytes

Obrigado 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.

b=a=>/^[1-9]\d*$/.test(a)?"integer":/^([1-9]\d+|\d)\.\d+$/.test(a)?"decimal":"str‌​ing"

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

function b(a) {
    if(/^[1-9]\d*$/.test(a)) // regex check for the rules of an 'integer':
        return"integer";     // ^[1-9] - check to make sure the first digit
                             // \d* - check to make sure that it is followed by zero or more digits
                             // $ - ensures that the previous check continues to the end of the word
    if(/^([1-9]\d+|\d)\.\d+$/.test(a)) // regex check for the rules of a 'decimal', starting from the middle
        return"decimal";     // \. checks for a '.' in the word
                             // the ([1-9]\d+|\d) and \d+ check to make sure the '.' is surrounded by
                             // one or more numerical characters on each side.
                             // the ^,$ ensure that the match is for the whole word
return"string";              // none of the others match, so it must be a string.

}

hargasinski
fonte
Isso parece falhar em entradas como 01.23.
LegionMammal978
Eu consertei, passa no 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.
hargasinski
Encurtado para ES6 é de 83 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 maneira
edc65
Obrigado, atualizei o código, tive que adicionar b=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.
hargasinski
@Zequ geralmente atribuindo a função a uma variável ( 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"
edc65
1

Java, 133 bytes

String t(String v){if(v.matches("[1-9]\\d*"))return "integer";if(v.matches("(0|[1-9]\\d+)\\.\\d+"))return "decimal";return "string";}
SuperJedi224
fonte
1

JavaScript (ES6), 74 75

Editar 1 byte salvo thx Zequ

f=i=>(i=i.match(/^(0|[1-9]\d*)(\.\d+)?$/))?i[2]?'decimal':'integer':'string'

Teste

f=i=>(i=i.match(/^(0|[1-9]\d*)(\.\d+)?$/))?i[2]?'decimal':'integer':'string'

console.log=x=>O.textContent +=x +'\n';

// test cases from the question and some more
s=['asdf','asdf3.4','02','40.','.','.01','.9.9.9','','0.0.0','00.00','02.00']
i=['2', '11', '1000']
d=['2.0','0.0', '1.009', '911.1','123.4567890']

console.log('Strings:')
s.forEach(x=>console.log('<'+x+'> -> '+f(x)))
console.log('Integers:')
i.forEach(x=>console.log('<'+x+'> -> '+f(x)))
console.log('Decimals:')
d.forEach(x=>console.log('<'+x+'> -> '+f(x)))
<pre id=O></pre>

edc65
fonte
Você pode salvar um byte alterando [^0\D]a correspondência regex para[1-9]
hargasinski
@Zequ boa dica, graças ... utilizando uma gama composto parecia tão inteligente :(
edc65
1

Perl 5, 59 bytes

Com o -pargumento na linha de comando (calculada na contagem de bytes):

chop;$_=!/\D|^0/?"integer":/^\d+\.\d+$/?"decimal":"string"
Codefun64
fonte
Falha em qualquer 00.nn (tente 00.00)
edc65
1
Fixo. Embora talvez isso deva estar nos casos de teste fornecidos.
Codefun64
Deveria. Por outro lado, frequentemente os casos de teste não cobrem todos os casos possíveis.
edc65
Ainda errado, agora fornece 'inteiro' para entrada .0. Para que serve chop?
edc65
Fixo. Perdeu o interesse neste desafio. Não tenho certeza se eu poderia ter otimizado essa correção ou não. Chop foi necessário em uma iteração anterior do script. Não gostou da nova linha da entrada do usuário.
Codefun64
0

Perl 6 , 61 bytes

{<string integer decimal>[?/^[(\d+\.\d+)|<[1..9]>\d*]$/+?$0]} # 61

Uso:

say «asdf asdf3.4 2 2.0 02 40. . .01 0.0 .9.9.9 ''».map: {...}
(string string integer decimal string string string string decimal string string)
Brad Gilbert b2gills
fonte
0

Python 2, 148 bytes

def f(s):
 try:
  t=float(s);assert s[0]!='0'
  if `t+0`==s:return'decimal'
  if `int(t)`==s:return'integer'
  return'string'
 except:return'string'


assert f('asdf') == 'string'
assert f('asdf3.4') == 'string'
assert f('2') == 'integer'
assert f('2.0') == 'decimal'
assert f('.') == 'string'
assert f('.01') == 'string'
assert f('.9.9.9') == 'string'
assert f(' ') == 'string'    
assert f('40.') == 'string'
assert f('02') == 'string'
assert f('0.0') == 'string'
assert f('00.00') == 'string'
Willem
fonte
0

JavaScript ES6, 74 70 bytes

w=>w.match(/^\d+\.\d+$/)?"decimal":w.match(/^\d+$/)?"integer":"string"
nicael
fonte
falha com os casos de teste da pergunta. Realmente, por favor, teste antes de postar.
edc65
@edc Obrigado pelo feedback, você poderia me dizer quais casos falham, exceto 02?
Nicael
Fico feliz que você encontrá-lo por si mesmo
edc65
Dê uma olhada na minha resposta para um violino.
Pavlo
Ele deve funcionar com os casos de teste se você tiver alterado /^\d+$/para ^[1-9]\d*(75 bytes).
Chiru