Tam sayı mı?


26

Bir sayıdır bütün hiçbir ondalık kısmı ile negatif olmayan bir tamsayı ise. Yani 0ve 8ve 233494.0bütündür, süre 1.1ve 0.001ve 233494.999değillerdir.


Giriş

Dilinizin varsayılan temel / kodlamasındaki kayan nokta sayısı.

Örneğin, varsayılan tamsayı gösterimi İkili Lambda Calculus olacağını Kilise rakamları . Ama varsayılan tamsayı gösterimi Python olan taban 10 ondalık değil Unary .

Çıktı

Bir truthy girişi bütün ise değer, falsy bu değer değilse.

Diliniz yalnızca 8 basamak için ondalık hassasiyetini destekliyorsa, 1.000000002bütünün kabul edilebileceğini unutmayın.

Giriş ve çıkış, herhangi bir standart G / Ç yöntemi ile yapılabilir .


Test durumları

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

puanlama

ile olduğu gibi , en kısa teslim kazandı. İyi şanslar!


2
@StephenLeppik Vanilya paritesi mücadelesinden, Hello World'den veya Truth Machine'den daha kolay değil. (Aslında, çoğu kişiden daha zordur.)
MD XF

Bir kesriyi temsil eden iki sayı olarak girdi alabilir miyiz?
LyricLy

@LyricLy Hayır, bu bazı diller için çok daha kolay veya diğerleri için gereksizdir.
MD XF

Tam sayıların negatif olmayan tam sayılar olduğuna dikkat edin. Lütfen bunu yansıtmak için ilk cümlenizi güncelleyin. Ayrıca tam sayıların nasıl negatif olmadığını ve negatif sayıların yanlış çıktılarının geçerli olduğunu göstermek istiyorsanız negatif sayı test durumlarına ekleyebilirsiniz.
Thomas Ward

1
@ThomasWard, bu wikipedia makalesi seninle tamamen aynı fikirde görünmüyor gibi görünüyor: "Sıfırı doğal sayılardan hariç tutan metinler bazen doğal sayıları tam sayılarla sıfır ile birlikte gösterir, ancak diğer yazılarda bu tamsayılar yerine bu terim kullanılır. (negatif tamsayılar dahil) ". Başlığı tamsayılar hakkında sormak olarak okudum.
ilkkachu

Yanıtlar:






6

Kabuğu , 3 bayt

£ΘN

Çevrimiçi deneyin! Üçüncü test durumu TIO'da zaman aşımına uğradı, bu yüzden birkaç rakam kesildim. Yerel olarak çalıştırmaya çalıştım, ancak 6 dakikadan fazla hafıza kullandığından birkaç dakika sonra onu öldürdüm ve bilgisayarım kekemeye başladı. Teorik olarak bir noktada bitmeli ...

açıklama

Bu oldukça doğrudan meydan okuma açıklamasına karşılık gelir.

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

Ne olurdu λx → floor(x) == abs(x)Zurufundan gibi görünüyor?
Lynn

@ Lynn Bu §=⌊abir bayt daha uzun olacaktı.
Zgarb


5

/// , 94 bayt, girdi kodlanmış

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

Çevrimiçi deneyin!

İki bitişik dikey çizgi arasındaki giriş ( ||)

Şeritler -00...0ve .00...0üzere, dönüştürür geri kalan bütün basamak xs, ardından kalan sayısı hala sahip olup olmadığını test xsonra s .ya da -ardından değildir ..

Bu dil, doğal truthy / falsey değerlerine sahip olmadığından, şu anda çıkış yapıyor trueve falsebuna izin veriliyorsa , örneğin Tve F87 bayt olarak değişebileceğinden, truthy ve falsey olarak sayılan değere bağlı olarak 7 bayta kadar tasarruf sağlayabilir .


5

Oktav , 15 bayt

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

Çevrimiçi deneyin!

Bu, @ kusurunun Haskell'in cevabında kullanılan yaklaşıma dayanmaktadır .

O 15 aşağı bayt sayısını getirir rağmen, her tamsayı bir listesini oluşturarak, (hayır alınma) utanç verici verimsizdir 0için xve eğer gördükten xiçinde bulunur.


Octave , 18 bayt

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

Çevrimiçi deneyin!

Girişi çift duyarlıklı bir sayı olarak alır. Bütün ise doğru döndürür.

Yuvarlandığında girişin girişin büyüklüğüne eşit olup olmadığını kontrol eder. Bu sadece sayı pozitif ve bütün olduğunda geçerli olacaktır.


Octave , 18 bayt

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

Çevrimiçi deneyin!

18 bayt için alternatif bir çözüm. Ne yazık ki modOctave işlev dolaylı bir dönüştürmek olmayacak boolbir etmek doubleyüzden, +( )karşılaştırma Büyüktür etrafında gereklidir. Aksi takdirde bu çözüm daha kısa olurdu.


Octave , 18 bayt

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

Çevrimiçi deneyin!

Ve bir tane daha ... 18 bayttan daha düşük görünmüyor . Hepsi 0 >=yerine , bunun yerine gerçek olmasına izin vermek zorunda kaldı >.



4

Aseto , 6 bayt

rfdi±=p
r giriş kapmak
f onu bir şamandıraya dönüştürür
d ve i kopyalar ve bir tam sayıya dönüştürür
± mutlak değerini iter (b / c negatif olamaz)
= eşit olup olmadıklarını kontrol eder
p sonucu yazdırır

Çevrimiçi deneyin!



4

QBIC , 17 bayt

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

açıklama

?             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

Herhangi bir kontrol başarısız olursa, bu 0 değerini döndürür.



4

C (gcc), 27 28 27 25 bayt

-2 PrincePolka'ya teşekkürler

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

Çevrimiçi deneyin!

gParametre alan f("herhangi bir tür") bir makro "işlevi" tanımlar . Sonra dökümün f mod 1sıfır olup olmadığını ve fnegatif olup olmadığını kontrol eder .


Bence include, math.h
fmod

@HatsuPointerKun O da olmadan
Bay

2
Windows tabanlı C dağıtımlarına ihtiyacım olduğunu düşünmüyorum (makinemde çalışıyor)
Conor O'Brien

25, # tanım g (f)! Fmod (f, f> = 0)
PrincePolka

4

C #, Java: 43 bayt

Zacharý
sayesinde -1 bayt TheLetalCoder sayesinde -1 bayt sayesinde

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

C #, java'da yapamayacağınız özel bir 33 bayt optimizasyona sahiptir:

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

Test için

C # kodu:

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 Kodu:

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

Bence returnve arasındaki boşluğu kaldırabilirsin (.
Zacharý

bir geri dönüş boolve üçlüye gerek yok.
TheLethalCoder

@TheLethalCoder boolJava yok
HatsuPointerKun

Java / C # 'yı o kadar iyi tanımıyorum, fakat başarabilir misiniz return(int)n==n? Yoksa bu n==nsadece int değil nmi?
Zacharı

1
Java 7 cevabını 3 byte azaltabilir ve kontrolü tersine çevirerek boolean işlecini bit yönünde bir değerle değiştirebilirsiniz: int w(float n){return(int)n!=n|n<0?0:1;}( 40 byte ). Java 8 lambda olduğundan daha kısadır: n->(int)n==n&n>=0( 17 byte ) ve lambda olarak C # cevabı için de geçerlidir: n=>(int)n==n&n>=0(ayrıca 17 byte ) .
Kevin Cruijssen

4

Google Sayfaları, 10 Bayt

Hücreden girdi alan A1ve arayan hücreye çıkış yapan isimsiz çalışma fonksiyonu .

=A1=Int(A1


3

Ly , 35 47 bayt

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

Çevrimiçi deneyin!

Ly, şamandıra desteğine sahiptir, ancak şamandıra oluşturmanın tek yolu şu anda bölme yapmaktır. Float'ı giriş olarak almanın bir yolu olmadığından, dizeyi elle kontrol etmek zorunda kaldım.

Negatif sayılar için destek ekleyerek 13 bayt kaybetti.


3

JavaScript, 14

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

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

@IsmaelMiguel. Negatif sayılar için işe yaramaz.

@ThePirateBay Hangi kesin sayı? 5, 5.1, -5, -5.1, 0, 0.1 ve -0.1 ile denedim.
Ismael Miguel

@IsmaelMiguel. (n=>!(n-(n|0)))(-3)döner true, ancak geri dönmelidir false. Son test durumuna bakın.

Oh, haklısın: / Ben soruyu yanlış okudum: /
Ismael Miguel




3

C #, 40 37 29 bayt

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

@Dennis_E sayesinde 8 bayt kaydedildi!

Eski Cevap (37 bayt)

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

Eski eski cevap (40 bayt):

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

2
30 bayt: 29 bayt için bool z(float x)=>x%1==0&&x>=0;bir single kullanabilirsiniz&
Dennis_E

@Dennis_E Teşekkürler!
yummypasta

x=>x%1==0&x>=0daha kısa ve derlemeFunc<float, bool>
TheLethalCoder 20:17

3

JavaScript, 17 15 bayt

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

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

Hatalarımı yakaladığı için edc65'e teşekkür ederim.


3

Beklenmeyen Sinclair ZX81, 20 bayt

 1 INPUT A
 2 PRINT ABS A=INT A

20 bayt, çünkü BASIC belirtildi.

Sayı pozitifse ve girilen sayının değeri tamsayı değerine eşitse basitçe 1 (true) çıktısını alır. Bu koşullardan her ikisinin de 0 çıkışı karşılanmaz.


1
Belirlenmiş bir dil mi? Öyleyse cevabında bunu belirtmelisin.
Taylor Scott

1
Üzgünüz, evet, tokenize edildi, yani INPUT, PRINT ve hatta> = Sinclair BASIC'in hedeflenen bir özelliği olması nedeniyle 1 byte RAM
Shaun Bebbers 22:17

1
Özellikle, her satır numarası 5 bayt + 1'dir newline( \r\nZX81 konuşmasında eşdeğeri), beyaz boşluklar, genellikle Sinclair 'bir tuşa basma' giriş sistemi nedeniyle anahtar kelimelere dahil edildikleri için bayt sayılmaz. Çalışırken, değerine getireceği gibi daha fazla bayt Aalır var stack; Her sayısal değerin her zaman 5 bayt bellek olduğunu düşünüyorum.
Shaun Bebbers

1
ve ZX Spectrum da
edc65

1
Bildiğim kadarıyla tokenizasyon modu tamamen aynı (Spektrumda daha fazla kod var). Ve herhangi bir değişmez sayı 6 bayttır: bir 'sayısal etiket' bayt, ardından 5 bayt tescilli kayan nokta biçiminde kodlanan değer)
edc65

3

C, C ++: 38 37 bayt

Zacharý sayesinde -1 bayt

Ceilingcat sayesinde -1 bayt

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

Test için

C: Çevrimiçi deneyin

C kodu:

#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 ++ Kodu:

#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
Bu sadece işe yarayacak INT_MAX. (Gerçekten umrumda değil ama bazı insanlar bunu yapıyor.)
MD XF

return(int)n==n...Çalışmak için değiştirir miydin ?
Zacharý

İmzalı int yerine imzasız int kullanarak bir bayt tıraş edebilirsiniz (o zaman >=0sınava gerek duymazsınız): return(unsigned)n==n; Ve C'de, 4 bayt için geri dönüş türünü çıkartabilirsiniz.
Toby Speight

8 bayttan daha fazla tasarruf edebilirsiniz:w(float n){n=n==(int)n&&n>=0;}
Johan du Toit




2

Sembolik Python , 21 bayt

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

Çevrimiçi deneyin!

Zincirleme bir karşılaştırma kullanır:

  • _%(_==_) == (_!=_)kontrol eder n%1 == 0, sadece nondalık kısmı yoksa doğrudur .
  • (_!=_) <= _0 <= n, eğer tamsayı negatif değilse doğru olup olmadığını kontrol eder .
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.