Czy to liczba całkowita?


26

Liczba jest całkowita, jeśli jest nieujemną liczbą całkowitą bez części dziesiętnej. Więc 0i 8i 233494.0są w całości, natomiast 1.1a 0.001i 233494.999nie są.


Wkład

Liczba zmiennoprzecinkowa w domyślnej podstawie / kodowaniu twojego języka.

Na przykład domyślną reprezentacją liczb całkowitych dla Binary Lambda Calculus byłyby liczby kościelne . Ale domyślną reprezentacją liczb całkowitych dla Pythona jest dziesiętny dziesiętny , a nie Unary .

Wydajność

Truthy wartość jeśli wejście jest całość, falsy wartość, jeśli tak nie jest.

Pamiętaj, że jeśli twój język obsługuje tylko precyzję dziesiętną, powiedzmy 8 miejsc, 1.000000002można uznać za cały.

Wejścia i wyjścia można wykonać dowolnymi standardowymi metodami We / Wy .


Przypadki testowe

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

Punktacja

Podobnie jak w przypadku , wygrywa najkrótsza przesyłka. Powodzenia!


2
@StephenLeppik Nie jest to łatwiejsze niż waniliowe wyzwanie parzystości, Hello World lub Truth Machine. (W rzeczywistości jest to trudniejsze niż większość z nich.)
MD XF,

Czy możemy przyjmować dane wejściowe jako dwie liczby reprezentujące ułamek?
LyricLy,

@LyricLy Nie, byłoby to łatwiejsze dla niektórych języków lub niepotrzebne dla innych.
MD XF,

Zauważ, że liczby całkowite są nieujemnymi liczbami całkowitymi. Zaktualizuj swoje pierwsze zdanie, aby to odzwierciedlić. Możesz dodać liczby testowe liczb ujemnych, jeśli chcesz pokazać, że liczby całkowite nie są ujemne, a wyniki fałszowania liczb ujemnych są prawidłowe.
Thomas Ward,

1
@ThomasWard, ten artykuł na Wikipedii wydaje się nie do końca zgadzać z tobą: „Teksty, które wykluczają zero z liczb naturalnych, czasami odnoszą się do liczb naturalnych wraz z zero jako liczb całkowitych, ale w innych pismach ten termin jest używany zamiast liczb całkowitych (w tym ujemne liczby całkowite) ”. Czytam ten tytuł jako pytanie o liczby całkowite.
ilkkachu

Odpowiedzi:



16

Haskell , 27 16 bajtów

Ta funkcja sprawdza, czy xznajduje się na liście liczb całkowitych nieujemnych, które nie są większe niż x.

f x=elem x[0..x]

Wypróbuj online!




6

Łuska , 3 bajty

£ΘN

Wypróbuj online! Trzeci przypadek testowy kończy się w TIO, więc odciąłem kilka cyfr. Próbowałem uruchomić go lokalnie, ale zabiłem go po kilku minutach, ponieważ zużywał ponad 6 GB pamięci, a mój komputer zaczął się zacinać. W pewnym momencie powinien teoretycznie zakończyć się ...

Wyjaśnienie

Odpowiada to opisowi wyzwania całkiem bezpośrednio.

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

Jak λx → floor(x) == abs(x)wyglądałby Husk?
Lynn,

@ Lynn To by było §=⌊a, więc o jeden bajt dłużej.
Zgarb,


5

/// , 94 bajty, wejście zakodowane na stałe

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

Wypróbuj online!

Wejście między dwoma kończącymi się liniami pionowymi ( ||)

Paski -00...0i .00...0konwertuje wszystkie pozostałe cyfry na xs, a następnie sprawdza, czy pozostała liczba wciąż ma xs po, .czy -nie ..

Można zapisać maksymalnie 7 bajtów w zależności od tego, co jest traktowane jako truthy i falsey ponieważ język ten nie posiada natywne wartości truthy / falsey, obecnie jest wyprowadzanie truea falsejednak mogą się zmienić, na przykład, Ti Fdla 87 bajtów, jeśli to dozwolone.


5

Oktawa , 15 bajtów

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

Wypróbuj online!

Ten oparty jest na podejściu zastosowanym w odpowiedzi Haskell @ flawr .

Choć przynosi liczbę bajtów w dół do 15, to jest haniebnie nieefektywne (bez obrazy przeznaczone), tworząc listę wszystkich całkowitą od 0celu xi zobaczyć, czy xznajduje się wewnątrz.


Oktawa , 18 bajtów

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

Wypróbuj online!

Pobiera dane wejściowe jako liczbę podwójnej precyzji. Zwraca true, jeśli całość.

Sprawdza, czy wejście po zaokrągleniu jest równe wielkości wejścia. Będzie tak tylko wtedy, gdy liczba będzie dodatnia i całkowita.


Oktawa , 18 bajtów

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

Wypróbuj online!

Alternatywne rozwiązanie dla 18 bajtów. Niestety modfunkcja w Octave nie będzie domyślnie konwertować a boolna a double, więc +( )jest ona potrzebna wokół porównania większego niż. W przeciwnym razie to rozwiązanie byłoby krótsze.


Oktawa , 18 bajtów

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

Wypróbuj online!

I jeszcze jeden ... Nie mogę uzyskać mniej niż 18 bajtów . Wszystko z powodu konieczności dopuszczenia, aby 0 było prawdziwe z >=zamiast zamiast sprawiedliwego >.



4

Aceto , 6 bajtów

rfdi±=p
r pobiera dane wejściowe
f konwertuje go na liczbę zmiennoprzecinkową
d i i powiela to i konwertuje na liczbę całkowitą
± popycha wartość bezwzględną (b / c nie może być ujemna)
= sprawdza, czy są równe
p drukuje wynik

Wypróbuj online!



4

QBIC , 17 bajtów

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

Wyjaśnienie

?             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

Jeśli jedno z testów się nie powiedzie, to zwraca 0. Jeśli oba są prawdziwe, zwraca -1 x -1 = 1



4

C (gcc), 27 28 27 25 bajtów

-2 dzięki PrincePolka

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

Wypróbuj online!

Definiuje „funkcję” makra, gktóra przyjmuje parametr f(dowolnego typu). Następnie sprawdza, czy rzutowanie f mod 1wynosi zero, a jeśli fnie jest ujemny.


Myślę, że musisz podać rozmiar includedyrektywy w swojej liczbie bajtów, ponieważ fmod jest zdefiniowany w math.h: patrz
HatsuPointerKun,

@HatsuPointerKun To też działa bez tego
Mr. Xcoder

2
Nie sądzę, żebyś potrzebował -lm w dystrybucjach C opartych na systemie Windows (działa na moim komputerze)
Conor O'Brien

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

4

C #, Java: 43 bajty

-1 bajt dzięki Zacharý
-1 bajt dzięki TheLetalCoder

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

C # ma specjalną optymalizację 33 bajtów, której nie można wykonać w Javie:

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

Dla testów

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

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

Myślę, że możesz usunąć spację między returni (.
Zacharý

zwróć a booli nie ma potrzeby trójki.
TheLethalCoder,

@TheLethalCoder boolnie istnieje w Javie
HatsuPointerKun,

Nie znam tak dobrze Java / C #, ale dasz radę return(int)n==n? Czy może to rzuciłoby n==nsię na int, a nie tylko n?
Zacharý

1
Możesz obniżyć odpowiedź Java 7 o 3 bajty, cofając sprawdzanie i zmieniając operator logiczny na bitowy: int w(float n){return(int)n!=n|n<0?0:1;}( 40 bajtów ). Jako Java 8 lambda jest jeszcze krótszy: n->(int)n==n&n>=0( 17 bajtów ) , to samo dotyczy odpowiedzi C # jak lambda: n=>(int)n==n&n>=0(również 17 bajtów ) .
Kevin Cruijssen

4

Arkusze Google, 10 bajtów

Anonimowa funkcja arkusza roboczego, która bada dane wejściowe z komórki A1i dane wyjściowe do komórki wywołującej.

=A1=Int(A1


3

Ly , 35 47 bajtów

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

Wypróbuj online!

Ly ma obsługę float, ale obecnie jedynym sposobem na utworzenie float jest wykonanie podziału. Nie ma sposobu, aby wziąć zmiennoprzecinkowe jako dane wejściowe, więc zamiast tego musiałem ręcznie sprawdzić ciąg.

Utracono 13 bajtów, dodając obsługę liczb ujemnych.


3

JavaScript, 14

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

13 bajtów:n=>!(n-(n|0))
Ismael Miguel

@IsmaelMiguel. Nie działa dla liczb ujemnych.

@ThePirateBay Która dokładna liczba? Próbowałem z 5, 5.1, -5, -5,1, 0, 0,1 i -0,1.
Ismael Miguel

@IsmaelMiguel. (n=>!(n-(n|0)))(-3)zwraca true, ale powinien wrócić false. Zobacz ostatni przypadek testowy.

Och, masz rację: / Źle przeczytałem pytanie: /
Ismael Miguel




3

C #, 40 37 29 bajtów

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

Zaoszczędź 8 bajtów dzięki @Dennis_E!

Stara odpowiedź (37 bajtów)

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

Stara stara odpowiedź (40 bajtów):

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

2
30 bajtów: bool z(float x)=>x%1==0&&x>=0;możesz użyć jednego &dla 29 bajtów
Dennis_E,

@Dennis_E Dzięki!
yummypasta

x=>x%1==0&x>=0jest krótszy i można go kompilować doFunc<float, bool>
TheLethalCoder,

3

JavaScript, 17 15 bajtów

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

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

Dzięki edc65 za złapanie moich błędów.


3

Nierozwinięty Sinclair ZX81, 20 bajtów

 1 INPUT A
 2 PRINT ABS A=INT A

20 bajtów, ponieważ BASIC jest tokenizowany.

Po prostu wyświetli 1 (prawda), jeśli liczba jest dodatnia, a wartość wprowadzonej liczby jest równa jej wartości całkowitej. Wyjścia 0 jeden z tych warunków nie jest spełniony.


1
Czy to jest tokenizowany język? Jeśli tak, należy to zaznaczyć w swojej odpowiedzi.
Taylor Scott,

1
Przepraszamy, tak, tokenizowany, tzn. WEJŚCIE to 1 bajt pamięci RAM, podobnie jak DRUKOWANIE, a nawet> = ze względu na
dziwaczne

1
W szczególności, każdy numer linii to 5 bajtów + 1 newline( \r\nodpowiednik w mówieniu ZX81), białe znaki nie liczą się jako bajty, ponieważ są one już zawarte w słowach kluczowych, zwykle ze względu na system wprowadzania Sinclair „jednym naciśnięciem klawisza”. Podczas działania zajmie więcej bajtów, ponieważ umieści wartość Ana var stack; Myślę, że każda wartość liczbowa to zawsze 5 bajtów pamięci.
Shaun Bebbers

1
i ZX Spectrum też
edc65

1
O ile wiem tryb tokenizacji jest dokładnie taki sam (Spectrum ma więcej kodów). A każda dosłowna liczba to 6 bajtów: bajt „znacznika numerycznego”, po którym następuje wartość zakodowana w 5
bajtowym

3

C, C ++: 38 37 bajtów

-1 bajt dzięki Zacharý

-1 bajt dzięki pułapkowi cat

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

Dla testów

C: Wypróbuj online

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

Kod 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
To zadziała tylko do INT_MAX. (Nie obchodzi mnie to, ale niektórzy to robią.)
MD XF,

Czy zmiana go by return(int)n==n...działała?
Zacharý

Możesz ogolić jeden bajt, używając unsigned int zamiast podpisanego (ponieważ nie potrzebujesz >=0testu): return(unsigned)n==n; A w C możesz pominąć typ zwrotu dla kolejnych 4 bajtów.
Toby Speight

Możesz zapisać jeszcze 8 bajtów:w(float n){n=n==(int)n&&n>=0;}
Johan du Toit,




2

Symboliczny Python , 21 bajtów

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

Wypróbuj online!

Wykorzystuje powiązane porównanie:

  • _%(_==_) == (_!=_)sprawdza, czy n%1 == 0tylko prawda, jeśli nnie ma części dziesiętnej.
  • (_!=_) <= _sprawdza, czy jest 0 <= nprawdą tylko wtedy, gdy liczba całkowita jest nieujemna.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.