是整数吗?


26

一个数字是整体如果是不带小数部分的非负整数。所以0and 8233494.0是整体,而1.1and 0.001233494.999不是。


输入项

语言的默认基本/编码形式的浮点数。

例如,二元Lambda演算的默认整数表示形式是教堂数字。但是Python的默认整数表示形式是以10基数的十进制,而不是Unary

输出量

truthy如果输入是全值,falsy值,如果它不是。

请注意,如果您的语言仅支持十进制精度(例如8位),1.000000002则可以视为整数。

输入和输出可以通过任何标准的I / O方法完成


测试用例

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

计分

,最短的提交将获胜。祝好运!


2
@StephenLeppik这比香草奇偶校验挑战,Hello World或Truth Machine容易。(实际上,这比大多数方法都难。)
MD XF

我们可以将输入作为两个数字表示一个分数吗?
LyricLy

@LyricLy不,对于某些语言而言,这会容易得多,而对于其他语言而言,则不必要。
MD XF

请注意,整数是非负整数。请更新您的第一句话以反映这一点。如果希望显示整数不是负数并且伪造负数输出有效,则可以添加负数测试用例。
托马斯·沃德,

1
@ThomasWard,该维基百科文章似乎与您完全不同意:“从自然数中排除零的文本有时将自然数与零一起指为整数,但是在其他著作中,该术语代替了整数(包括负整数)”。我读标题时是询问整数。
ilkkachu

Answers:






6

外壳,3个字节

£ΘN

在线尝试! 第三个测试用例在TIO中超时,因此我砍掉了两位数。我尝试在本地运行它,但是由于使用了超过6GB的内存并且计算机开始停顿了几分钟,因此将其杀死。理论上应该在某个时候结束...

说明

这与挑战说明非常直接对应。

£Θ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?

λx → floor(x) == abs(x)稻壳的外观是什么样?
林恩

@Lynn那将是§=⌊a,所以再增加一个字节。
Zgarb


5

///,94字节,输入为硬编码

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

在线尝试!

在两条垂直终止线(||)之间输入

剥离-00...0.00...0,将所有剩余的数字转换为xs,然后测试剩余的数字是否在xs之后.-后面没有.

能否达到取决于什么算作truthy和falsey,因为这种语言没有本地truthy / falsey价值,目前正在输出保存到7个字节truefalse,但可能会改变,例如,TF87个字节,如果这是允许的。


5

八度,15字节

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

在线尝试!

这是基于@flawr的Haskell答案中使用的方法。

虽然它将字节数减少到15,但效率低下(无意冒犯),创建了一个从0to到每个整数的列表,x并查看其中是否x包含该整数。


八度,18字节

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

在线尝试!

将输入作为双精度数字。如果为true,则返回true。

检查四舍五入后的输入是否等于输入的大小。仅当数字为正且为整数时,才会如此。


八度,18字节

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

在线尝试!

18字节的替代解决方案。遗憾的是mod,Octave中的函数不会将a隐式转换booldouble,因此+( )在大于比较周围需要。否则,该解决方案将更短。


八度,18字节

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

在线尝试!

还有一个... 我似乎不能低于18个字节。所有这些都是因为必须使用0 >=而不是just 来使0为真>



4

Aceto,6个字节

rfdi±=p
r获取输入
f将其转换为浮点数
d和我将其复制并将其转换为整数
±推动它的绝对值(b / c不能为负)
=检查它们是否相等
p打印结果

在线尝试!



4

QBIC,17个字节

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

说明

?             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

如果任何一项检查失败,则返回0。如果两者都为真,则返回-1 x -1 = 1



4

C(gcc),27 28 27 25个字节

-2感谢PrincePolka

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

在线尝试!

定义一个g带参数f(任何类型)的宏“函数” 。然后检查强制转换f mod 1是否为零,以及是否f为非负数。


我认为您必须include在字节数中包含指令的大小,因为fmod是在math.h以下位置定义的:参见
HatsuPointerKun

@HatsuPointerKun如果没有它,它也
Xcoder先生17年

2
我认为您不需要在基于Windows的C发行版上运行-lm(在我的计算机上运行)
Conor O'Brien

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

4

C#,Java:43个字节

-1个字节,感谢Zacharý
-1个字节,感谢TheLetalCoder

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

C#具有33字节的特殊优化功能,您无法在java中进行优化:

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

供测试用

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();
    }
}

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));
        }
    }
}

我认为您可以在return和之间删除空格(
扎卡里

返回a bool,则不需要三进制。
TheLethalCoder

@TheLethalCoder bool在Java中不存在
HatsuPointerKun

我不太了解Java / C#,但是您能做到return(int)n==n吗?还是将其n==n转换为int而不是仅仅是n
扎卡里

1
:您可以通过翻转检查和改变布尔运算符,按位一个由3个字节降低了Java 7的答案int w(float n){return(int)n!=n|n<0?0:1;}40个字节)。从Java 8拉姆达它甚至更短:n->(int)n==n&n>=017字节,并同样适用于C#的答案拉姆达:n=>(int)n==n&n>=0(也是17个字节
凯文·克鲁伊森

4

Google表格,10字节

匿名工作表函数,用于描述单元格中的输入A1并输出到调用单元格。

=A1=Int(A1


3

Ly35 47字节

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

在线尝试!

Ly具有浮动支持,但是当前创建浮动的唯一方法是执行除法。没有办法将浮点数作为输入,因此我不得不手动检查字符串。

丢失13个字节,增加了对负数的支持。


3

JavaScript,14

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

13个字节:n=>!(n-(n|0))
Ismael Miguel

@IsmaelMiguel。它不适用于负数。

@ThePirateBay哪个确切的数字?我尝试使用5、5.1,-5,-5.1、0、0.1和-0.1。
Ismael Miguel

@IsmaelMiguel。(n=>!(n-(n|0)))(-3)返回true,但应该返回false。请参阅最后一个测试用例。

哦,您是对的:/我误读了这个问题:/
Ismael Miguel




3

C#,40 37 29字节

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

感谢@Dennis_E,节省了8个字节!

旧答案(37个字节)

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

旧的旧答案(40个字节):

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

2
30个字节:bool z(float x)=>x%1==0&&x>=0;您可以将一个&字节用于29个字节
Dennis_E

@Dennis_E谢谢!
yummypasta

x=>x%1==0&x>=0更短并编译为Func<float, bool>
TheLethalCoder

3

JavaScript,17个 15字节

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

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

感谢edc65捕获我的错误。


3

未扩展的Sinclair ZX81,20字节

 1 INPUT A
 2 PRINT ABS A=INT A

20个字节,因为BASIC被标记。

如果number为正且输入的数字的值等于其整数值,则简单地将输出1(true)。这些条件之一的输出0不满足。


1
这是标记语言吗?如果是,则应在答案中指出。
泰勒·斯科特

1
抱歉,是的,要令牌化,即INPUT是RAM的1个字节,PRINT也是> =,这是由于Sinclair BASIC的“怪异”预期特性
Shaun Bebbers

1
具体来说,每个行号都是5字节+1 newline\r\n相当于ZX81),空格通常不算作字节,因为通常由于Sinclair的“一键式”输入系统,空格已包含在关键字中。在运行时,它将花费更多的字节,因为它将把的值A放到var stack; 上。我认为每个数字值始终是5个字节的内存。
Shaun Bebbers

1
和ZX Spectrum一样
edc65 '17

1
据我所知,令牌化模式完全相同(Spectrum具有更多代码)。并且任何文字数字都是6个字节:“数字标签”字节,后跟以5个字节专有浮点格式编码的值)
edc65

3

C,C ++:38 37字节

-1个字节,感谢Zacharý

-1个字节,感谢ceilingcat

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

供测试用

C:在线尝试

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 ++代码:

#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
这只会工作到INT_MAX。(我并不在乎,但有些人在乎。)
MD XF

更改它可以return(int)n==n...工作吗?
扎卡里

您可以通过使用unsigned int而不是有符号的int来剃除一个字节(因为这样就不需要>=0测试):return(unsigned)n==n; 在C语言中,您可以将返回类型省略另外4个字节。
Toby Speight

您可以再保存8个字节:w(float n){n=n==(int)n&&n>=0;}
Johan du Toit




2

符号Python,21字节

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

在线尝试!

使用链式比较:

  • _%(_==_) == (_!=_)检查是否为n%1 == 0,如果n没有小数部分则为true 。
  • (_!=_) <= _检查是否为0 <= n,仅当整数为非负数时才为true。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.