É um número inteiro?


26

Um número é inteiro se for um número inteiro não negativo sem parte decimal. Então 0e 8e 233494.0são inteiros, enquanto 1.1e 0.001e 233494.999não são.


Entrada

Um número de ponto flutuante na base / codificação padrão do seu idioma.

Por exemplo, a representação inteira padrão para Cálculo lambda binário seria numerais da igreja . Mas a representação inteira padrão para Python é a base 10 decimal , não Unary .

Saída

Um valor verdadeiro, se a entrada for inteira, um valor falso, se não for.

Observe que, se o seu idioma suportar apenas a precisão decimal, digamos, 8 casas, 1.000000002poderá ser considerado inteiro.

A entrada e a saída podem ser feitas por qualquer método de E / S padrão .


Casos de teste

Input        -> Output
332          -> true
33.2         -> false
128239847    -> true
0.128239847  -> false
0            -> true
0.000000000  -> true
1.111111111  -> false
-3.1415926   -> false
-3           -> false

Pontuação

Assim como no , o envio mais curto vence. Boa sorte!


2
@StephenLeppik Não é mais fácil do que o desafio da paridade de baunilha, ou o Hello World, ou a Truth Machine. (Na verdade, é mais difícil do que a maioria das pessoas.)
MD XF

Podemos considerar a entrada como dois números, representando uma fração?
LyricLy

@LyricLy Não, isso seria muito mais fácil para alguns idiomas ou desnecessário para outros.
MD XF

Observe que números inteiros são números inteiros não negativos. Atualize sua primeira frase para refletir isso. E você pode adicionar casos de teste de números negativos se desejar mostrar como números inteiros não são negativos e saídas falsas para números negativos são válidas.
Thomas Ward

1
@ThomasWard, esse artigo da Wikipedia parece não concordar totalmente com você: "Os textos que excluem zero dos números naturais às vezes se referem aos números naturais junto com zero como números inteiros, mas em outros escritos, esse termo é usado para os números inteiros (incluindo números inteiros negativos) ". Eu li o título perguntando sobre números inteiros.
ilkkachu

Respostas:



16

Haskell , 27 16 bytes

Esta função verifica se xestá contida na lista de números inteiros não negativos que não são maiores que x.

f x=elem x[0..x]

Experimente online!




6

Casca , 3 bytes

£ΘN

Experimente online! O terceiro caso de teste atinge o tempo limite no TIO, então cortei alguns dígitos. Tentei executá-lo localmente, mas o matei após alguns minutos, pois estava usando mais de 6 GB de memória e meu computador começou a gaguejar. Teoricamente, deveria terminar em algum momento ...

Explicação

Isso corresponde à descrição do desafio diretamente.

£ΘN  Implicit input: a number.
  N  The infinite list [1,2,3,4...
 Θ   Prepend 0: [0,1,2,3,4...
£    Is the input an element of this list?

Como seria λx → floor(x) == abs(x)em Husk?
Lynn

@ Lynn Isso seria §=⌊a, então um byte a mais.
Zgarb 18/11/19


5

/// , 94 bytes, entrada codificada

/=/\/x://:/\/\///-0/-:.0/.:.|/|:-|/|:0=1=2=3=4=5=6=7=8=9=|x/|:||/true:x:/-:/.:/|/+:++/false/||

Experimente online!

Entrada entre as duas linhas verticais finais ( ||)

Tira -00...0e .00...0converte todos os dígitos restantes em xs e testa se o número restante ainda tem xs após .ou -não seguido por ..

Pode salvar até 7 bytes, dependendo do que é contado como truthy e falsey, já que esse idioma não possui valores nativos de truthy / falsey, está atualmente sendo exibido truee, falsemas pode mudar para, por exemplo, Te Fpara 87 bytes, se for permitido.


5

Oitava , 15 bytes

@(x)any(x==0:x)

Experimente online!

Este é baseado na abordagem usada na resposta Haskell do @ flawr .

Enquanto ele traz a contagem de bytes para 15, é vergonhosamente ineficiente (sem querer ofender), criando uma lista de cada número inteiro de 0para xe ver se xestá contido dentro.


Oitava , 18 bytes

@(x)fix(x)==abs(x)

Experimente online!

Recebe a entrada como um número de precisão dupla. Retorna verdadeiro se inteiro.

Verifica se a entrada quando arredondada é igual à magnitude da entrada. Este será apenas o caso quando o número for positivo e inteiro.


Oitava , 18 bytes

@(x)~mod(x,+(x>0))

Experimente online!

Uma solução alternativa para 18 bytes. Infelizmente, a modfunção no Octave não converte implicitamente a boolem a double; portanto, +( )é necessário em torno da comparação maior que a. Caso contrário, essa solução teria sido mais curta.


Oitava , 18 bytes

@(x)x>=0&~mod(x,1)

Experimente online!

E outro ... não consigo obter menos de 18 bytes . Tudo por ter que permitir que 0 seja verdadeiro com o >=invés de apenas >.



4

Aceto , 6 bytes

rfdi±=p
r agarra a entrada
f o converte em um flutuador
dei e duplica e converte-o para um número inteiro
± pressiona o valor absoluto (b / c não pode ser negativo)
= verifica se são iguais
p imprime o resultado

Experimente online!



4

QBIC , 17 bytes

?(:=int(a))*(a>0)

Explicação

?             PRINT
 (:=int(a))     if the input (: assigns the cmd line param to 'a') equals itself 
                cast to int, -1 else 0
 *              times
 (a>0)          if the input > 0, -1 else 0

Se uma das verificações falhar, isso retornará 0. Se ambas forem verdadeiras, retornará -1 x -1 = 1



4

C (gcc), 27 28 27 25 bytes

-2 graças a PrincePolka

#define g(f)!fmod(f,f>=0)

Experimente online!

Define uma macro "função" gque aceita um parâmetro f(de qualquer tipo). Em seguida, verifica se a conversão f mod 1é zero e se fnão é negativa.


Eu acho que você é obrigado a incluir o tamanho da includedirectiva na sua contagem de bytes, uma vez fmod é definida em math.h: vê lá
HatsuPointerKun

@HatsuPointerKun Ele funciona sem ele também
Mr. Xcoder

2
Eu não acho que você precisa -lm em distribuições Windows baseados em C (funciona na minha máquina)
Conor O'Brien

! 25, # define g (f) fmod (f, f> = 0)
PrincePolka

4

C #, Java: 43 bytes

-1 byte graças a Zacharý
-1 byte graças a TheLetalCoder

int w(float n){return(n==(int)n&&n>=0)?1:0;}

O C # possui uma otimização especial de 33 bytes que você não pode fazer em java:

bool w(float n){return(int)n==n;}

Para teste

Código c #:

class Program {
    int w(float n){return(n==(int)n&&n>=0)?1:0;}

    static void Main(string[] args)
    {
        var p = new Program();
        float[] fTab = new float[]{
            332,33.2f,128239847,0.128239847f,0,0.0000f,1.1111111111f,-3.1415926f,-3
        };
        foreach (float f in fTab) {
            Console.WriteLine(string.Format("{0} = {1}", f, (p.w(f) != 0).ToString()));
        }
        Console.ReadKey();
    }
}

Código Java:

public class MainApp {
    int w(float n){return(n==(int)n&&n>=0)?1:0;}

    public static void main(String[]a) {
        MainApp m = new MainApp();
        float testArr[] = new float[]{
                332,33.2f,128239847,0.128239847f,0,0.0000f,1.1111111111f,-3.1415926f,-3
        };

        for (float v : testArr) {
            System.out.println(v + " = " + String.valueOf(m.w(v)!=0));
        }
    }
}

Eu acho que você pode remover um espaço entre returne (.
Zacharý

retornar a boole não há necessidade do ternário.
TheLethalCoder

@TheLethalCoder boolnão existe em Java
HatsuPointerKun

Não conheço Java / C # tão bem, mas você consegue return(int)n==n? Ou isso seria n==num int e não apenas n?
Zachary

1
Você pode diminuir a resposta do Java 7 em 3 bytes, revertendo a verificação e alterando o operador booleano para um bit a bit: int w(float n){return(int)n!=n|n<0?0:1;}( 40 bytes ). Como o Java 8 lambda, é ainda mais curto: n->(int)n==n&n>=0( 17 bytes ) , e o mesmo se aplica à resposta em C # que lambda: n=>(int)n==n&n>=0(também 17 bytes ) .
Kevin Cruijssen 20/0318

4

Planilhas Google, 10 bytes

Função de planilha anônima que registra as entradas da célula A1e as saídas para a célula chamadora.

=A1=Int(A1


3

Ly , 35 47 bytes

ir"-"=[0u;]pr[["0"=![psp>l"."=[ppr!u;]p<2$]pp]]

Experimente online!

Ly tem suporte de flutuador, mas a única maneira de criar um flutuador atualmente é realizando divisão. Não há como usar um float como entrada, então tive que verificar manualmente a string.

Perdeu 13 bytes adicionando suporte para números negativos.


3

JavaScript, 14

n=>!(n<0||n%1)

13 bytes:n=>!(n-(n|0))
Ismael Miguel

@IsmaelMiguel. Não funciona para números negativos.

@ThePirateBay Qual número exato? Eu tentei com 5, 5.1, -5, -5.1, 0, 0.1 e -0.1.
Ismael Miguel

@IsmaelMiguel. (n=>!(n-(n|0)))(-3)retorna true, mas deve retornar false. Veja o último caso de teste.

Ah, você está certo nisso: / Eu li mal a pergunta: /
Ismael Miguel




3

C #, 40 37 29 bytes

bool z(float x)=>x%1==0&x>=0;

Guardado 8 bytes graças a @Dennis_E!

Resposta antiga (37 bytes)

bool z(float x){return x%1==0&&x>=0;}

Resposta antiga antiga (40 bytes):

bool z(float x){return (int)x==x&&x>=0;}

2
30 bytes: bool z(float x)=>x%1==0&&x>=0;e você pode usar um único &para 29 bytes
Dennis_E 20/11

@Dennis_E Thanks!
yummypasta

x=>x%1==0&x>=0é mais curto e compilação paraFunc<float, bool>
TheLethalCoder

3

JavaScript, 17 15 bytes

_=>_<0?0:_==~~_

_=>_<0?0:_==(_|0)

Obrigado a edc65 por detectar meus erros.


3

Sinclair ZX81 não expandido, 20 bytes

 1 INPUT A
 2 PRINT ABS A=INT A

20 bytes porque BASIC é tokenizado.

Simplesmente produzirá 1 (verdadeiro) se o número for positivo e o valor do número digitado for igual ao seu valor inteiro. As saídas 0 de qualquer uma dessas condições não são atendidas.


1
Esta é uma linguagem tokenizada? Se for, você deve indicar isso em sua resposta.
Taylor Scott

1
Desculpe, sim, a indexado, ou seja, a entrada é 1 byte de RAMs, como é PRINT e mesmo> = devido a uma ~ peculiaridade ~ característica pretendida de Sinclair BASIC
Shaun Bebbers

1
Especificamente, cada número de linha é 5 bytes + 1 newline( \r\nequivalente em ZX81), espaços em branco não contam como bytes, pois eles já estão incluídos nas palavras-chave geralmente devido ao sistema de entrada Sinclair 'one-key-press'. Em execução, serão necessários mais bytes, pois atribuirá o valor Aa var stack; Eu acho que cada valor numérico é sempre 5 bytes de memória.
Shaun Bebbers

1
e ZX Spectrum também
edc65 23/11

1
Tanto quanto sei, o modo de tokenização é exatamente o mesmo (o Spectrum tem mais códigos). E qualquer número literal é 6 bytes: um 'tag numérico' byte, seguido pelo valor codificado em um 5 bytes proprietária formato de ponto flutuante)
edc65

3

C, C ++: 38 37 bytes

-1 byte graças a Zacharý

-1 byte graças ao ceilingcat

int w(float n){return(int)n==n&n>=0;}

Para teste

C: Experimente online

Código C:

#include <stdio.h>
int main() {
    float f[] = { 332,33.2f,128239847,0.128239847f,0,0.0000f,1.1111111111f,-3.1415926f,-3 };
    int t;
    for ( t = 0; t < 9; ++t) {
        printf("%f = %s\n", f[t], w(f[t])?"true":"false");
    }
    return 0;
}

Código C ++:

#include <iostream>
int main() {
    std::initializer_list <std::pair<float,bool>> test{
        {332.f,true}, {33.2f,false}, {128239847.f,true}, {0.128239847f,false}, {0.f,true}, {0.000000f,true}, {1.111111f,false}, {-3.1415926f,false}, {-3.f,false}
    };

    for (const auto& a : test) {
        if (w(a.first) != a.second) {
            std::cout << "Error with " << a.first << '\n';
        }
    }
    return 0;
}

1
Isso só funcionará até INT_MAX. (Eu realmente não me importo, mas algumas pessoas fazem.)
MD XF

Mudá-lo para o return(int)n==n...trabalho?
Zachary

Você pode raspar um byte usando int não assinado em vez de um assinado (como você não precisa do >=0teste): return(unsigned)n==n; E em C, você pode omitir o tipo de retorno por mais 4 bytes.
Toby Speight

Você pode salvar mais 8 bytes:w(float n){n=n==(int)n&&n>=0;}
Johan du Toit




2

Python simbólico , 21 bytes

_=_%(_==_)==(_!=_)<=_

Experimente online!

Usa uma comparação encadeada:

  • _%(_==_) == (_!=_)verifica se n%1 == 0, somente verdadeiro sen não tiver parte decimal.
  • (_!=_) <= _verifica se 0 <= n, somente verdadeiro se o número inteiro não for negativo.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.