Có phải là một số nguyên?


26

Một số là toàn bộ nếu nó là một số nguyên không âm không có phần thập phân. Vì vậy, 08233494.0là toàn bộ, trong khi 1.10.001233494.999không.


Đầu vào

Số dấu phẩy động trong cơ sở / mã hóa mặc định của ngôn ngữ của bạn.

Ví dụ: biểu diễn số nguyên mặc định cho Binary Lambda Tính sẽ là số Church . Nhưng biểu diễn số nguyên mặc định cho Pythonsố thập phân cơ sở 10 , không phải là Unary .

Đầu ra

Một truthy giá trị nếu đầu vào là toàn bộ, một falsy giá trị nếu nó không phải là.

Lưu ý rằng nếu ngôn ngữ của bạn chỉ hỗ trợ độ chính xác thập phân đến 8 vị trí, 1.000000002có thể được coi là toàn bộ.

Đầu vào và đầu ra có thể được thực hiện thông qua bất kỳ phương pháp I / O tiêu chuẩn nào .


Các trường hợp thử nghiệm

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

Chấm điểm

Như với , bài nộp ngắn nhất sẽ thắng. Chúc may mắn!


2
@StephenLeppik Không dễ hơn thử thách chẵn lẻ vani, hay Thế giới Hello, hay cỗ máy Sự thật. (Trên thực tế, nó khó hơn hầu hết những thứ đó.)
MD XF

Chúng ta có thể lấy đầu vào là hai số, đại diện cho một phân số không?
LyricLy

@LyricLy Không, điều đó sẽ dễ dàng hơn nhiều đối với một số ngôn ngữ hoặc không cần thiết cho những ngôn ngữ khác.
MD XF

Lưu ý rằng toàn bộ số là số nguyên không âm. Hãy cập nhật câu đầu tiên của bạn để phản ánh điều này. Và bạn có thể thêm vào các trường hợp kiểm tra số âm nếu bạn muốn hiển thị cách toàn bộ số không âm và đầu ra sai cho số âm là hợp lệ.
Thomas Ward

1
@ThomasWard, bài viết trên wikipedia đó dường như không hoàn toàn đồng ý với bạn: "Các văn bản loại trừ 0 khỏi các số tự nhiên đôi khi đề cập đến các số tự nhiên cùng với số 0 là toàn bộ số, nhưng trong các bài viết khác, thuật ngữ đó được sử dụng thay cho số nguyên (bao gồm các số nguyên âm) ". Tôi đọc tiêu đề như hỏi về số nguyên.
ilkkachu

Câu trả lời:





8

Bình thường, 4 byte

qs.a

Bộ kiểm tra

Là số bằng ( q) với sàn ( s) của giá trị tuyệt đối của nó ( .a)?


6

Husk , 3 byte

£ΘN

Hãy thử trực tuyến! Trường hợp thử nghiệm thứ ba lần ra trong TIO, vì vậy tôi đã cắt ra một vài chữ số. Tôi đã cố chạy nó cục bộ, nhưng đã giết nó sau vài phút kể từ khi nó sử dụng hơn 6GB bộ nhớ và máy tính của tôi bắt đầu nói lắp. Về mặt lý thuyết nó sẽ kết thúc tại một số điểm ...

Giải trình

Điều này tương ứng với mô tả thách thức khá trực tiếp.

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

Điều gì sẽ λx → floor(x) == abs(x)trông giống như ở Husk?
Lynn

@Lynn Điều đó sẽ là §=⌊a, vì vậy một byte dài hơn.
Zgarb


5

/// , 94 byte, đầu vào được mã hóa cứng

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

Hãy thử trực tuyến!

Đầu vào giữa hai đường thẳng đứng kết thúc ( ||)

Các dải -00...0.00...0, chuyển đổi tất cả các chữ số còn lại thành xs, sau đó kiểm tra xem số còn lại có còn xs sau .hay -không theo sau ..

Có thể tiết kiệm lên đến 7 byte tùy thuộc vào những gì đang tính là truthy và falsey từ ngôn ngữ này không có giá trị truthy / falsey bản địa, hiện đang xuất ra truefalsenhưng có thể thay đổi, ví dụ, TFcho 87 byte nếu đó là cho phép.


5

Octave , 15 byte

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

Hãy thử trực tuyến!

Cách này dựa trên cách tiếp cận được sử dụng trong câu trả lời Haskell của @ flawr .

Mặc dù nó làm giảm số byte xuống còn 15, nhưng nó không hiệu quả một cách đáng xấu hổ (không có ý định vi phạm), tạo ra một danh sách mọi số nguyên từ 0đến xvà xem nếu xcó trong đó.


Octave , 18 byte

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

Hãy thử trực tuyến!

Lấy đầu vào là một số chính xác kép. Trả về đúng nếu toàn bộ.

Kiểm tra xem đầu vào khi làm tròn có bằng độ lớn của đầu vào không. Điều này sẽ chỉ là trường hợp khi số dương và toàn bộ.


Octave , 18 byte

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

Hãy thử trực tuyến!

Một giải pháp thay thế cho 18 byte. Đáng buồn thay, modhàm trong Octave sẽ không chuyển đổi hoàn toàn boolthành a double, do đó, +( )cần thiết xung quanh lớn hơn so với so sánh. Nếu không thì giải pháp này sẽ ngắn hơn.


Octave , 18 byte

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

Hãy thử trực tuyến!

Và một số khác ... Tôi dường như không thể nhận được thấp hơn 18 byte . Tất cả chỉ vì phải cho phép 0 là đúng với >=thay vì chỉ >.



4

Aceto , 6 byte

rfdi±=p
r lấy đầu vào
f chuyển đổi nó thành một float
d và tôi nhân đôi nó và chuyển đổi nó thành một số nguyên
± đẩy giá trị tuyệt đối của nó (b / c không thể âm)
= kiểm tra nếu chúng bằng nhau
p in ra kết quả

Hãy thử trực tuyến!



4

QBIC , 17 byte

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

Giải trình

?             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

Nếu một trong hai kiểm tra không thành công, điều này trả về 0. Nếu cả hai đều đúng, nó sẽ trả về -1 x -1 = 1



4

C (gcc), 27 28 27 25 byte

-2 cảm ơn PrincePolka

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

Hãy thử trực tuyến!

Xác định một "hàm" macro glấy tham số f(thuộc bất kỳ loại nào). Sau đó kiểm tra xem việc truyền f mod 1có bằng không và nếu fkhông âm.


Tôi nghĩ rằng bạn được yêu cầu bao gồm kích thước của lệnh includetrong số byte của bạn, vì fmod được định nghĩa trong math.h: xem ở đó
HatsuPulumKun

@HatsuPulumKun Nó cũng hoạt động mà không cần nó
Ông Xcoder

2
Tôi không nghĩ bạn cần -lm trên các bản phân phối C dựa trên cửa sổ (hoạt động trên máy của tôi)
Conor O'Brien

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

4

C #, Java: 43 byte

-1 byte nhờ Zacharý
-1 byte nhờ TheLetalCoder

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

C # có tối ưu hóa 33 byte đặc biệt mà bạn không thể thực hiện trong java:

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

Để thử nghiệm

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

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

Tôi nghĩ bạn có thể loại bỏ một khoảng trống giữa return(.
Zacharý

trả lại một boolvà không cần cho chim nhạn.
TheLethalCoder

@TheLethalCoder boolkhông tồn tại trong Java
HatsuPulumKun

Tôi không biết rõ về Java / C #, nhưng bạn có thể làm được return(int)n==nkhông? Hay điều đó sẽ n==nchuyển sang một int chứ không chỉ n?
Zacharý

1
Bạn có thể hạ thấp câu trả lời Java 7 xuống 3 byte bằng cách đảo ngược kiểm tra và thay đổi toán tử boolean thành một bitwise: int w(float n){return(int)n!=n|n<0?0:1;}( 40 byte ). Như lambda Java 8, nó thậm chí còn ngắn hơn: n->(int)n==n&n>=0( 17 byte ) và áp dụng tương tự cho câu trả lời C # là lambda: n=>(int)n==n&n>=0(cũng 17 byte ) .
Kevin Cruijssen 20/03/18

4

Google Sheets, 10 byte

Hàm bảng tính ẩn danh điều khiển đầu vào từ ô A1và xuất ra ô gọi.

=A1=Int(A1


3

Ly , 35 47 byte

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

Hãy thử trực tuyến!

Ly có hỗ trợ float, nhưng cách duy nhất để tạo float hiện tại là thực hiện chia. Không có cách nào để lấy float làm đầu vào, vì vậy tôi phải tự kiểm tra chuỗi.

Mất 13 byte thêm hỗ trợ cho số âm.


3

JavaScript, 14

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

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

@IsmaelMiguel. Nó không hoạt động cho các số âm.

@ThePirateBay Con số chính xác nào? Tôi đã thử với 5, 5.1, -5, -5.1, 0, 0.1 và -0.1.
Ismael Miguel

@IsmaelMiguel. (n=>!(n-(n|0)))(-3)trả lại true, nhưng nên trả lại false. Xem trường hợp thử nghiệm cuối cùng.

Ồ, bạn đã đúng về điều đó: / Tôi đã đọc sai câu hỏi: /
Ismael Miguel




3

C #, 40 37 29 byte

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

Đã lưu 8 byte nhờ @Dennis_E!

Câu trả lời cũ (37 byte)

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

Câu trả lời cũ (40 byte):

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

2
30 byte: bool z(float x)=>x%1==0&&x>=0;và bạn có thể sử dụng một đơn &cho 29 byte
Dennis_E

@Dennis_E Cảm ơn!
yummypasta

x=>x%1==0&x>=0ngắn hơn và được biên dịch thànhFunc<float, bool>
TheLethalCoder

3

JavaScript, 17 15 byte

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

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

Cảm ơn edc65 đã bắt lỗi của tôi.


3

Sinclair ZX81 chưa được mở rộng, 20 byte

 1 INPUT A
 2 PRINT ABS A=INT A

20 byte vì BASIC được mã hóa.

Đơn giản là sẽ xuất 1 (true) nếu số dương và giá trị của số được nhập bằng giá trị nguyên của nó. Đầu ra 0 một trong những điều kiện không được đáp ứng.


1
Đây có phải là một ngôn ngữ token hóa? Nếu đó là bạn nên chỉ ra rằng trong câu trả lời của bạn.
Taylor Scott

1
Xin lỗi, vâng, nó đã được token hóa, tức là INPUT là 1 byte RAM, cũng như IN và thậm chí> = do tính năng ~ quirk ~ dự định của Sinclair BASIC
Shaun Bebbers

1
Cụ thể, mỗi số dòng là 5 byte + 1 newline( \r\ntương đương trong ZX81 speak), các khoảng trắng không được tính là byte vì chúng được bao gồm trong các từ khóa thường là do hệ thống nhập 'một phím bấm' của Sinclair. Khi chạy, nó sẽ mất nhiều byte hơn vì nó sẽ đặt giá trị của Alên var stack; Tôi nghĩ rằng mỗi giá trị số luôn là 5 byte bộ nhớ.
Shaun Bebbers

1
và ZX Spectrum cũng vậy
edc65

1
Theo như tôi biết thì chế độ mã thông báo hoàn toàn giống nhau (Spectrum có nhiều mã hơn). Và bất kỳ số chữ nào là 6 byte: một byte 'thẻ số' theo sau là giá trị được mã hóa theo định dạng dấu phẩy động độc quyền 5 byte)
edc65

3

C, C ++: 38 37 byte

-1 byte nhờ Zacharý

-1 byte nhờ trần

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

Để thử nghiệm

C: Hãy thử trực tuyến

Mã 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;
}

Mã 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
Điều này sẽ chỉ làm việc lên đến INT_MAX. (Tôi không thực sự quan tâm nhưng một số người làm.)
MD XF

Sẽ thay đổi nó để return(int)n==n...làm việc?
Zacharý

Bạn có thể cạo một byte bằng cách sử dụng int unsign thay vì một ký đã ký (vì khi đó bạn không cần >=0kiểm tra): return(unsigned)n==n; Và trong C, bạn có thể bỏ qua kiểu trả về để có thêm 4 byte.
Toby Speight

Bạn có thể lưu thêm 8 byte:w(float n){n=n==(int)n&&n>=0;}
Johan du Toit




Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.