เป็นจำนวนเต็มหรือไม่


26

ตัวเลขเป็นจำนวนเต็มถ้าไม่ใช่จำนวนเต็มลบโดยไม่มีส่วนทศนิยม ดังนั้น0และ8และ233494.0มีทั้งในขณะที่1.1และ0.001และ233494.999ไม่ได้


อินพุต

หมายเลขเลขทศนิยมในฐาน / การเข้ารหัสภาษาเริ่มต้นของคุณ

ยกตัวอย่างเช่นการเป็นตัวแทนจำนวนเต็มเริ่มต้นสำหรับไบนารีแลมบ์ดาแคลคูลัสจะเป็นเลขคริสตจักร แต่การแสดงจำนวนเต็มเริ่มต้นสำหรับงูหลามเป็นฐาน 10 ทศนิยมไม่เอก

เอาท์พุต

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 หรือเครื่องสัจธรรม (อันที่จริงแล้วมันยากกว่าส่วนใหญ่)
MD XF

เราจะใส่ตัวเลขสองตัวแทนเศษส่วนได้ไหม
LyricLy

@LyricLy ไม่นั่นอาจจะง่ายกว่าสำหรับบางภาษาหรือไม่จำเป็นสำหรับผู้อื่น
MD XF

โปรดทราบว่าจำนวนเต็มไม่ใช่จำนวนเต็มลบ โปรดอัปเดตประโยคแรกของคุณเพื่อสะท้อนถึงสิ่งนี้ และคุณสามารถเพิ่มในกรณีทดสอบตัวเลขติดลบหากคุณต้องการแสดงให้เห็นว่าตัวเลขทั้งหมดไม่ใช่ลบและผลลัพธ์เท็จสำหรับตัวเลขลบนั้นถูกต้อง
โธมัสวอร์ด

1
@ThomasWard บทความ wikipedia ดูเหมือนจะไม่เห็นด้วยกับคุณอย่างเต็มที่: "ตำราที่ยกเว้นศูนย์จากจำนวนธรรมชาติบางครั้งอ้างถึงจำนวนธรรมชาติพร้อมกับศูนย์เป็นจำนวนเต็ม แต่ในงานเขียนอื่น ๆ คำนั้นใช้แทนเลขจำนวนเต็ม (รวมถึงจำนวนเต็มลบ) " ฉันอ่านชื่อเรื่องเพื่อถามเกี่ยวกับจำนวนเต็ม
ilkkachu

คำตอบ:


13

APL (Dyalog) 3 ไบต์

⌊≡|

ลองออนไลน์!

โปรดทราบว่าf←ได้รับการต่อเติมในลิงก์ TIO เนื่องจากข้อ จำกัด ทางเทคนิค แต่โดยทั่วไปไม่จำเป็นต้องใช้


นั่นคือสง่างาม! ผมไม่ทราบว่าทำไมฉันเพิ่มเพดานที่ไม่จำเป็นเพื่อคำตอบของฉัน ....
เลน Ivanov

4
@GalenIvanov floor(n) == abs(n)นี้เป็นเพียง
Erik the Outgolfer

16

Haskell , 27 16 ไบต์

ฟังก์ชันนี้ตรวจสอบว่าxมีอยู่ในรายการจำนวนเต็มที่ไม่ใช่ค่าลบที่ไม่มากกว่าxอยู่ในรายชื่อของจำนวนเต็มไม่ติดลบที่ไม่สูงกว่า

f x=elem x[0..x]

ลองออนไลน์!




6

Huskขนาด 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 แล้วทดสอบว่าจำนวนที่เหลือยังคงมีxหลังจาก.หรือไม่ตามมาด้วย-.

สามารถบันทึกได้มากถึง 7 ไบต์ขึ้นอยู่กับสิ่งที่นับว่าเป็นความจริงและเป็นเท็จเนื่องจากภาษานี้ไม่มีค่าความจริงดั้งเดิม / เท็จในขณะนี้กำลังแสดงผลtrueและfalseสามารถเปลี่ยนเป็นตัวอย่างเช่นTและF87 ไบต์หากอนุญาต


5

อ็อกเทฟ 15 ไบต์

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

ลองออนไลน์!

หนึ่งนี้จะขึ้นอยู่กับวิธีการที่ใช้ในการ@ flawr เป็นคำตอบ

ในขณะที่ทำให้จำนวนไบต์ลดลงเหลือ 15 แต่ก็ไม่มีประสิทธิภาพที่น่าละอาย (ไม่ได้มีจุดประสงค์ผิด) สร้างรายการของจำนวนเต็มทุกค่าจาก0ไปยังxและดูว่าxมีอยู่ภายในหรือไม่


อ็อกเทฟ , 18 ไบต์

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

ลองออนไลน์!

รับอินพุตเป็นตัวเลขที่มีความแม่นยำสองเท่า ผลตอบแทนจริงถ้าทั้งหมด

ตรวจสอบว่าอินพุตเมื่อถูกปัดเศษเท่ากับขนาดของอินพุตหรือไม่ กรณีนี้จะเกิดขึ้นเมื่อจำนวนเป็นบวกและเต็มจำนวน


อ็อกเทฟ , 18 ไบต์

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

ลองออนไลน์!

โซลูชันสำรองสำหรับ 18 ไบต์ เศร้าmodฟังก์ชั่นในคู่จะไม่ได้โดยปริยายแปลงboolไปdoubleดังนั้น+( )เป็นสิ่งจำเป็นรอบมากกว่าการเปรียบเทียบ มิฉะนั้นวิธีนี้จะสั้นกว่านี้


อ็อกเทฟ , 18 ไบต์

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

ลองออนไลน์!

และอีกคนหนึ่ง ... ฉันไม่สามารถดูเหมือนจะได้รับต่ำกว่า 18 ไบต์ ทั้งหมดเป็นเพราะมีการอนุญาตให้มีการ 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 มันใช้งานได้โดยไม่มีมัน
Mr. Xcoder

2
ผมไม่คิดว่าคุณต้อง -lm บน windows-based กระจาย C (ทำงานบนเครื่องของฉัน)
Conor โอไบรอัน

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

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 (
Zacharý

ส่งคืนboolและไม่มีความจำเป็นสำหรับผู้ประกอบการที่สาม
TheLethalCoder

@TheLethalCoder boolไม่มีอยู่ใน Java
HatsuPointerKun

ผมไม่ทราบว่า Java / C # ที่ดี แต่คุณสามารถทำให้มันreturn(int)n==n? หรือว่าจะส่งn==nไปยัง int มากกว่าเพียงแค่n?
Zacharý

1
คุณสามารถลดคำตอบ Java 7 ได้ 3 ไบต์โดยย้อนกลับการตรวจสอบและเปลี่ยนโอเปอเรเตอร์บูลีนให้เป็นบิตพุท: int w(float n){return(int)n!=n|n<0?0:1;}( 40 ไบต์ ) ในฐานะที่เป็น Java 8 แลมบ์ดาก็จะยิ่งสั้น: n->(int)n==n&n>=0( 17 ไบต์ )และเช่นเดียวกับคำตอบ C # เป็นแลมบ์ดา: n=>(int)n==n&n>=0(ยัง17 ไบต์ )
Kevin Cruijssen

4

Google ชีตขนาด 10 ไบต์

ฟังก์ชั่นแผ่นงานที่ไม่ระบุชื่อที่เล่าเรื่องอินพุตจากเซลล์A1และผลลัพธ์ไปยังเซลล์ที่โทร

=A1=Int(A1


3

Ly , 35 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ดูกรณีทดสอบล่าสุด

โอ้คุณพูดถูก: / ฉันอ่านคำถามผิด: /
อิสมาเอลมิเกล




3

C #, 40 37 29 ไบต์

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

บันทึกแล้ว 8 ไบต์ขอบคุณ @Dennis_E!

คำตอบเก่า (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

ซินแคลร์ ZX81 ที่ยังไม่ขยายที่ 20 ไบต์

 1 INPUT A
 2 PRINT ABS A=INT A

20 ไบต์เนื่องจากพื้นฐานเป็นโทเค็น

จะเอาท์พุท 1 (จริง) ถ้าจำนวนเป็นบวกและค่าของจำนวนที่ป้อนเท่ากับค่าจำนวนเต็ม เอาต์พุต 0 ไม่ตรงตามเงื่อนไขอย่างใดอย่างหนึ่ง


1
นี่เป็นภาษาโทเค็นหรือไม่ หากเป็นเช่นนั้นคุณควรระบุว่าในคำตอบของคุณ
เทย์เลอร์สกอตต์

1
ขออภัยใช่เพื่อโทเค็นเช่น INPUT คือ 1 ไบต์ของ RAM เช่นเดียวกับ PRINT และแม้กระทั่ง> = เนื่องจากมีคุณสมบัติที่ผิดพลาด ~ ตั้งใจของซินแคลร์พื้นฐาน
Shaun Bebbers

1
โดยเฉพาะอย่างยิ่งแต่ละหมายเลขบรรทัดคือ 5 ไบต์ + 1 newline( \r\nเทียบเท่าใน ZX81 พูด) ช่องว่างสีขาวไม่นับเป็นไบต์ตามที่รวมอยู่ในคำหลักมักจะเกิดจากระบบรายการ 'หนึ่งปุ่มกด' ซินแคลร์ ในการทำงานมันจะใช้เวลามากขึ้นในการไบต์ตามที่จะใส่ค่าAลงในvar stack; ฉันคิดว่าค่าตัวเลขแต่ละค่าจะมีหน่วยความจำ 5 ไบต์เสมอ
Shaun Bebbers

1
และ ZX Spectrum ด้วย
edc65

1
เท่าที่ฉันรู้ว่าโหมด tokenization เหมือนกันทุกประการ (Spectrum มีรหัสมากกว่า) และจำนวนตัวอักษรใด ๆ ที่เป็น 6 ไบต์: 'การตัวเลขแท็ก' ไบต์ตามค่าการเข้ารหัสใน 5 ไบต์เป็นกรรมสิทธิ์ลอยรูปแบบจุด)
edc65

3

C, C ++: 38 37 ไบต์

-1 ไบต์ขอบคุณZacharý

-1 ไบต์ขอบคุณไปที่แมว

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...งานได้ไหม
Zacharý

คุณสามารถโกนหนึ่งไบต์โดยใช้ 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ไม่มีส่วนทศนิยม
  • (_!=_) <= _ตรวจสอบว่า0 <= nเป็นจริงถ้าจำนวนเต็มไม่เป็นลบเท่านั้น
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.