Apakah ini bilangan bulat?


26

Sejumlah adalah seluruh jika itu adalah bilangan bulat non-negatif dengan tidak ada bagian desimal. Jadi 0dan 8dan 233494.0utuh, sementara 1.1dan 0.001dan 233494.999tidak.


Memasukkan

Angka titik-mengambang dalam basis / pengodean default bahasa Anda.

Misalnya, representasi bilangan bulat default untuk Binary Lambda Calculus akan menjadi angka Gereja . Tetapi representasi integer default untuk Python adalah basis 10 desimal , bukan Unary .

Keluaran

Sebuah truthy nilai jika input keseluruhan, falsy nilai jika tidak.

Perhatikan bahwa jika bahasa Anda hanya mendukung presisi desimal, katakanlah, 8 tempat, 1.000000002dapat dianggap keseluruhan.

Input dan output dapat dilakukan melalui metode I / O standar apa pun .


Uji kasus

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

Mencetak gol

Seperti halnya , pengiriman terpendek menang. Semoga berhasil!


2
@StephenLeppik Tidak lebih mudah dari tantangan paritas vanilla, atau Hello World, atau Truth Machine. (Faktanya, ini lebih sulit daripada kebanyakan dari mereka.)
MD XF

Bisakah kita mengambil input sebagai dua angka, mewakili sebagian kecil?
LyricLy

@ LyricLy Tidak, itu bisa lebih mudah untuk beberapa bahasa atau tidak perlu untuk yang lain.
MD XF

Perhatikan bahwa bilangan bulat adalah bilangan bulat non-negatif. Harap perbarui kalimat pertama Anda untuk mencerminkan ini. Dan Anda dapat menambahkan dalam kasus uji angka negatif jika Anda ingin menunjukkan bagaimana seluruh angka tidak negatif dan output palsu untuk angka negatif valid.
Thomas Ward

1
@ThomasWard, artikel wikipedia itu tampaknya tidak sepenuhnya setuju dengan Anda: "Teks yang mengecualikan nol dari bilangan asli terkadang merujuk ke bilangan asli bersama dengan nol sebagai bilangan bulat, tetapi dalam tulisan lain, istilah itu digunakan sebagai ganti bilangan bulat (termasuk bilangan bulat negatif) ". Saya membaca judul ketika menanyakan tentang bilangan bulat.
ilkkachu

Jawaban:



16

Haskell , 27 16 byte

Fungsi ini memeriksa apakah xterdapat dalam daftar bilangan bulat tidak negatif yang tidak lebih besar dari x.

f x=elem x[0..x]

Cobalah online!



8

Pyth, 4 byte

qs.a

Suite uji

Apakah angka sama dengan ( q) ke lantai ( s) dari nilai absolutnya ( .a)?


6

Sekam , 3 byte

£ΘN

Cobalah online! Case test ketiga habis di TIO, jadi saya memotong beberapa digit. Saya mencoba menjalankannya secara lokal, tetapi membunuhnya setelah beberapa menit karena menggunakan lebih dari 6GB memori dan komputer saya mulai gagap. Secara teoritis harus selesai di beberapa titik ...

Penjelasan

Ini sesuai dengan deskripsi tantangan secara langsung.

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

Akan λx → floor(x) == abs(x)seperti apa kulit Husk?
Lynn

@ Lynn Itu §=⌊a, jadi satu byte lebih lama.
Zgarb


5

/// , 94 byte, masukan kode keras

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

Cobalah online!

Input antara dua garis vertikal terminating ( ||)

Strip -00...0dan .00...0, konversikan semua digit yang tersisa menjadi xs, lalu uji apakah angka yang tersisa masih xsetelah .atau -tidak diikuti oleh ..

Bisa menghemat hingga 7 byte tergantung pada apa yang dianggap sebagai kebenaran dan falsey karena bahasa ini tidak memiliki nilai-nilai kebenaran / falsey asli, saat ini menghasilkan truedan falsetetapi dapat berubah menjadi, misalnya, Tdan Funtuk 87 byte jika diizinkan.


5

Oktaf , 15 byte

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

Cobalah online!

Yang ini didasarkan pada pendekatan yang digunakan dalam jawaban Haskell @ flawr .

Sementara itu membawa hitungan byte ke 15, itu memalukan tidak efisien (tidak ada pelanggaran yang dimaksudkan), membuat daftar setiap bilangan bulat dari 0ke xdan melihat apakah xterdapat di dalamnya.


Oktaf , 18 byte

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

Cobalah online!

Mengambil input sebagai angka presisi ganda. Mengembalikan nilai true jika keseluruhan.

Cek apakah input ketika dibulatkan sama dengan besarnya input. Ini hanya akan menjadi kasus ketika jumlahnya positif dan utuh.


Oktaf , 18 byte

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

Cobalah online!

Solusi alternatif untuk 18 byte. Sayangnya modfungsi dalam Oktaf tidak akan secara implisit mengkonversi boolke double, jadi +( )diperlukan sekitar lebih besar daripada perbandingan. Kalau tidak, solusi ini akan lebih pendek.


Oktaf , 18 byte

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

Cobalah online!

Dan satu lagi ... Sepertinya saya tidak bisa mendapatkan lebih rendah dari 18 byte . Semua karena harus membiarkan 0 benar dengan >=bukan hanya >.



4

Aceto , 6 byte

rfdi±=p
r meraih input
f mengubahnya menjadi pelampung
d dan saya menduplikasinya dan mengubahnya menjadi integer
± mendorong nilai absolut dari itu (b / c tidak boleh negatif)
= memeriksa apakah mereka sama
p mencetak hasilnya

Cobalah online!



4

QBIC , 17 byte

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

Penjelasan

?             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

Jika salah satu centang gagal, ini mengembalikan 0. Jika keduanya benar, ia mengembalikan -1 x -1 = 1



4

C (gcc), 27 28 27 25 byte

Terima kasih kepada PrincePolka

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

Cobalah online!

Menentukan "fungsi" makro gyang mengambil parameter f(jenis apa pun). Kemudian periksa apakah casting f mod 1adalah nol, dan jika fnon-negatif.


Saya pikir Anda harus memasukkan ukuran includearahan dalam jumlah byte Anda, karena fmod didefinisikan dalam math.h: lihat di sana
HatsuPointerKun

@HatsuPointerKun Berhasil tanpa itu
Tn. Xcoder

2
Saya tidak berpikir Anda perlu -lm pada distribusi C berbasis windows (berfungsi pada mesin saya)
Conor O'Brien

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

4

C #, Jawa: 43 byte

-1 byte berkat Zacharý
-1 byte berkat TheLetalCoder

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

C # memiliki optimasi 33 byte khusus yang tidak dapat Anda lakukan di java:

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

Untuk pengujian

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

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

Saya pikir Anda dapat menghapus spasi antara returndan (.
Zacharý

mengembalikan a booldan tidak perlu untuk ternary.
TheLethalCoder

@TheLethalCoder booltidak ada di Jawa
HatsuPointerKun

Saya tidak terlalu mengenal Java / C #, tetapi bisakah Anda membuatnya return(int)n==n? Atau akankah itu dilemparkan n==nke int daripada hanya n?
Zacharý

1
Anda dapat menurunkan jawaban Java 7 dengan 3 byte dengan membalikkan centang dan mengubah operator boolean menjadi yang bitwise: int w(float n){return(int)n!=n|n<0?0:1;}( 40 byte ). Sebagai Java 8 lambda itu bahkan lebih pendek: n->(int)n==n&n>=0( 17 byte ) , dan hal yang sama berlaku untuk jawaban C # seperti lambda: n=>(int)n==n&n>=0(juga 17 byte ) .
Kevin Cruijssen

4

Google Sheets, 10 Bytes

Fungsi lembar kerja anonim yang mengisahkan input dari sel A1dan output ke sel panggilan.

=A1=Int(A1


3

Ly , 35 47 byte

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

Cobalah online!

Ly memiliki dukungan float, tetapi satu-satunya cara untuk membuat float saat ini adalah dengan melakukan pembagian. Tidak ada cara untuk mengambil float sebagai input, jadi saya harus memeriksa string secara manual.

Kehilangan 13 byte menambahkan dukungan untuk angka negatif.


3

JavaScript, 14

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

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

@IsmaelMiguel. Itu tidak berfungsi untuk angka negatif.

@ThePirateBay Nomor persis mana? Saya mencoba dengan 5, 5.1, -5, -5.1, 0, 0.1 dan -0.1.
Ismael Miguel

@IsmaelMiguel. (n=>!(n-(n|0)))(-3)kembali true, tetapi harus kembali false. Lihat test case terakhir.

Oh, Anda benar tentang itu: / Saya salah membaca pertanyaan: /
Ismael Miguel




3

C #, 40 37 29 byte

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

Disimpan 8 byte berkat @Dennis_E!

Jawaban Lama (37 byte)

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

Jawaban lama lama (40 byte):

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

2
30 byte: bool z(float x)=>x%1==0&&x>=0;dan Anda dapat menggunakan satu &untuk 29 byte
Dennis_E

@Dennis_E Terima kasih!
yummypasta

x=>x%1==0&x>=0lebih pendek dan kompilasi keFunc<float, bool>
TheLethalCoder

3

JavaScript, 17 15 byte

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

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

Terima kasih kepada edc65 karena menangkap kesalahan saya.


3

Sinclair ZX81 yang tidak dikembangkan, 20 byte

 1 INPUT A
 2 PRINT ABS A=INT A

20 byte karena BASIC adalah tokenized.

Cukup akan menghasilkan 1 (benar) jika angka positif dan nilai angka yang dimasukkan sama dengan nilai integernya. Output 0 salah satu dari kondisi tersebut tidak terpenuhi.


1
Apakah ini bahasa tokenized? Jika ya, Anda harus mengindikasikannya dalam jawaban Anda.
Taylor Scott

1
Maaf, ya itu tokenized, yaitu, INPUT adalah 1 byte RAM, seperti PRINT dan even> = karena fitur ~ quirk ~ yang dimaksudkan dari Sinclair BASIC
Shaun Bebbers

1
Secara khusus, setiap nomor baris adalah 5 byte + 1 newline( \r\nsetara dengan ZX81 berbicara), spasi putih tidak dihitung sebagai byte karena sudah termasuk dalam kata kunci biasanya karena sistem entri Sinclair 'one-key-press' Sinclair. Saat berjalan, itu akan membutuhkan lebih banyak byte karena akan menempatkan nilai Ake var stack; Saya pikir setiap nilai numerik selalu 5 byte memori.
Shaun Bebbers

1
dan ZX Spectrum juga
edc65

1
Sejauh yang saya tahu mode tokenization persis sama (Spectrum memiliki lebih banyak kode). Dan setiap angka literal adalah 6 byte: byte 'tag numerik' diikuti oleh nilai yang dikodekan dalam format floating point berpemilik 5 byte)
edc65

3

C, C ++: 38 37 byte

-1 byte terima kasih kepada Zacharý

-1 byte berkat ceilingcat

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

Untuk Pengujian

C: Coba online

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

Kode 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
Ini hanya akan bekerja hingga INT_MAX. (Saya tidak terlalu peduli tetapi beberapa orang juga.)
MD XF

Apakah mengubahnya return(int)n==n...berfungsi?
Zacharý

Anda dapat mencukur satu byte dengan menggunakan unsigned int alih-alih yang sudah ditandatangani (karena Anda tidak perlu >=0pengujian): return(unsigned)n==n; Dan di C, Anda dapat menghilangkan tipe pengembalian untuk 4 byte lebih lanjut.
Toby Speight

Anda dapat menyimpan 8 byte lagi:w(float n){n=n==(int)n&&n>=0;}
Johan du Toit




2

Python Simbolik , 21 byte

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

Cobalah online!

Menggunakan perbandingan berantai:

  • _%(_==_) == (_!=_)memeriksa apakah n%1 == 0, hanya benar jika ntidak memiliki bagian desimal.
  • (_!=_) <= _memeriksa apakah 0 <= n, hanya benar jika bilangan bulat adalah non-negatif.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.