Ist es eine ganze Zahl?

26

Eine Zahl ist ganz, wenn es sich um eine nicht negative Ganzzahl ohne Dezimalstelle handelt. So 0und 8und 233494.0sind ganz, während 1.1und 0.001und 233494.999nicht.


Eingang

Eine Gleitkommazahl in der Standardbasis / -codierung Ihrer Sprache.

Die standardmäßige Ganzzahldarstellung für die binäre Lambda-Rechnung wäre beispielsweise Church-Ziffern . Die standardmäßige Ganzzahldarstellung für Python ist jedoch eine Dezimalzahl zur Basis 10 , nicht Unary .

Ausgabe

Ein wahrer Wert, wenn die Eingabe vollständig ist, ein falscher Wert, wenn dies nicht der Fall ist.

Beachten Sie, dass eine Sprache, die nur eine Dezimalgenauigkeit von beispielsweise 8 Stellen unterstützt, 1.000000002als Ganzes betrachtet werden kann.

Die Ein- und Ausgabe kann über beliebige Standard-E / A-Methoden erfolgen .


Testfälle

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

Wertung

Wie beim gewinnt die kürzeste Einreichung. Viel Glück!

MD XF
quelle
2
@StephenLeppik Es ist nicht einfacher als die Vanille-Paritäts-Challenge oder die Hello World oder die Truth Machine. (Tatsächlich ist es schwieriger als die meisten anderen.)
MD XF
Dürfen wir die Eingabe als zwei Zahlen annehmen, die einen Bruch darstellen?
Text
@LyricLy Nein, das wäre entweder für einige Sprachen viel einfacher oder für andere unnötig.
MD XF
Beachten Sie, dass ganze Zahlen keine negativen ganzen Zahlen sind. Bitte aktualisieren Sie Ihren ersten Satz, um dies widerzuspiegeln. Sie können auch Testfälle für negative Zahlen hinzufügen, wenn Sie zeigen möchten, dass ganze Zahlen nicht negativ sind und falsche Ausgaben für negative Zahlen gültig sind.
Thomas Ward
1
@ThomasWard, dieser Wikipedia-Artikel scheint nicht ganz mit Ihnen übereinzustimmen: "Texte, die Null aus den natürlichen Zahlen ausschließen, beziehen sich manchmal auf die natürlichen Zahlen zusammen mit Null als ganze Zahlen, aber in anderen Schriften wird dieser Begriff stattdessen für die ganzen Zahlen verwendet (einschließlich negativer Ganzzahlen) ". Ich habe den Titel gelesen und nach ganzen Zahlen gefragt.
ilkkachu

Antworten:

13

APL (Dyalog) , 3 Bytes

⌊≡|

Probieren Sie es online!

Beachten Sie, dass f←der TIO-Link aus technischen Gründen vorangestellt wurde, aber normalerweise nicht benötigt wird.

Erik der Outgolfer
quelle
Das ist elegant! Ich weiß nicht, warum ich meiner Antwort eine unnötige Obergrenze hinzugefügt habe ...
Galen Ivanov,
4
@GalenIvanov Dies ist nur floor(n) == abs(n).
Erik der Outgolfer 18.11.17
16

Haskell , 27 16 Bytes

Diese Funktion prüft, ob xin der Liste der nichtnegativen ganzen Zahlen enthalten ist, die nicht größer als sind x.

f x=elem x[0..x]

Probieren Sie es online!

Fehler
quelle
8

Pyth, 4 Bytes

qs.a

Testsuite

Ist die Zahl gleich ( q) dem Floor ( s) seines absoluten Wertes ( .a)?

isaacg
quelle
6

Schale , 3 Bytes

£ΘN

Probieren Sie es online! Der dritte Testfall läuft in TIO ab, daher habe ich ein paar Ziffern abgeschnitten. Ich habe versucht, es lokal auszuführen, habe es aber nach ein paar Minuten beendet, da es mehr als 6 GB Speicher beanspruchte und mein Computer anfing zu ruckeln. Es sollte theoretisch irgendwann zu Ende sein ...

Erläuterung

Dies entspricht ziemlich direkt der Herausforderungsbeschreibung.

£Θ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?
Zgarb
quelle
Wie würde es λx → floor(x) == abs(x)in Husk aussehen?
Lynn
@Lynn Das wäre §=⌊aalso ein Byte länger.
Zgarb
5

/// , 94 Bytes, Eingabe fest codiert

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

Probieren Sie es online!

Eingabe zwischen den beiden vertikalen Abschlusslinien ( ||)

Entfernt -00...0und .00...0, konvertiert alle verbleibenden Ziffern in xs und prüft dann, ob die verbleibende Zahl noch xs nach .oder ein -nicht gefolgt von hat ..

Kann bis zu 7 Bytes speichern , je nachdem , was als truthy und Falsey gezählt, seit dieser Sprache nicht heimisch truthy / Falsey Werte hat, gerade ausgibt trueund falseaber zu, zum Beispiel ändern könnte, Tund Ffür 87 Bytes , wenn das ist erlaubt.

Boboquack
quelle
5

Oktave , 15 Bytes

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

Probieren Sie es online!

Dieser basiert auf dem Ansatz, der in der Haskell-Antwort von @ flawr verwendet wurde .

Während es die Byteanzahl auf 15 senkt, ist es schändlich ineffizient (keine Straftat beabsichtigt), indem es eine Liste aller Ganzzahlen von 0bis erstellt xund prüft, ob sie xenthalten sind.


Oktave , 18 Bytes

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

Probieren Sie es online!

Nimmt die Eingabe als Zahl mit doppelter Genauigkeit. Gibt true zurück, wenn ganz.

Überprüft, ob die Eingabe beim Runden der Größe der Eingabe entspricht. Dies ist nur der Fall, wenn die Zahl positiv und ganz ist.


Oktave , 18 Bytes

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

Probieren Sie es online!

Eine alternative Lösung für 18 Bytes. Leider modkonvertiert die Funktion in Octave a nicht implizit boolin a double, daher +( )wird die Funktion um das Größere als den Vergleich benötigt. Andernfalls wäre diese Lösung kürzer gewesen.


Oktave , 18 Bytes

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

Probieren Sie es online!

Und noch eine ... Ich kann nicht unter 18 Bytes kommen . Alles nur, weil man zulassen muss, dass 0 wahr ist, >=anstatt nur >.

Tom Carpenter
quelle
4

Aceto , 6 Bytes

rfdi±=p
r erfasst die Eingabe
f wandelt es in einen float um
d und ich duplizieren es und konvertieren es in eine Ganzzahl
± drückt den absoluten Wert davon (b / c kann nicht negativ sein)
= prüft, ob sie gleich sind
p druckt das Ergebnis aus

Probieren Sie es online!

FantaC
quelle
4

QBIC , 17 Bytes

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

Erläuterung

?             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

Wenn eine der beiden Prüfungen fehlschlägt, wird 0 zurückgegeben. Wenn beide erfüllt sind, wird -1 x -1 = 1 zurückgegeben

steenbergh
quelle
4

C (gcc), 27 28 27 25 Bytes

-2 Dank an PrincePolka

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

Probieren Sie es online!

Definiert eine Makro- "Funktion" g, die einen Parameter f(eines beliebigen Typs) akzeptiert. Überprüft dann, ob das Casting f mod 1Null ist und ob fes nicht negativ ist.

MD XF
quelle
Ich denke, Sie müssen die Größe der includeDirektive in Ihre math.h
Byteanzahl einbeziehen
@ HatsuPointerKun Es funktioniert auch ohne es
Mr. Xcoder
2
Ich glaube nicht, dass Sie -lm auf Windows-basierten C-Distributionen benötigen (funktioniert auf meinem Computer)
Conor O'Brien
25, #define g (f)! Fmod (f, f> = 0)
PrincePolka
4

C #, Java: 43 Bytes

-1 Byte dank Zacharý
-1 Byte dank TheLetalCoder

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

C # hat eine spezielle 33-Byte-Optimierung, die Sie in Java nicht durchführen können:

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

Zum Prüfen

C # -Code:

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

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));
        }
    }
}
HatsuPointerKun
quelle
Ich denke, Sie können ein Leerzeichen zwischen returnund entfernen (.
Zacharý
kehre a zurück boolund es besteht keine Notwendigkeit für den Dreistoff.
TheLethalCoder 20.11.17
@TheLethalCoder boolexistiert nicht in Java
HatsuPointerKun
Ich kenne Java / C # nicht so gut, aber können Sie es schaffen return(int)n==n? Oder würde das n==neher zu einem int als nur umgewandelt werden n?
Zacharý
1
Sie können die Java 7-Antwort um 3 Byte verringern, indem Sie die Prüfung umkehren und den booleschen Operator in einen bitweisen Operator ändern: int w(float n){return(int)n!=n|n<0?0:1;}( 40 Byte ). Als Java 8 Lambda ist es sogar noch kürzer: n->(int)n==n&n>=0( 17 Bytes ) , und dasselbe gilt für die C # -Antwort als Lambda: n=>(int)n==n&n>=0(ebenfalls 17 Bytes ) .
Kevin Cruijssen
4

Google Sheets, 10 Bytes

Anonyme Arbeitsblattfunktion, die Eingaben aus der Zelle A1und Ausgaben in die aufrufende Zelle protokolliert.

=A1=Int(A1
Taylor Scott
quelle
3

Ly , 35 47 Bytes

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

Probieren Sie es online!

Ly hat Float-Unterstützung, aber die einzige Möglichkeit, einen Float zu erstellen, besteht derzeit darin, eine Division durchzuführen. Es gibt keine Möglichkeit, ein Float als Eingabe zu verwenden, daher musste ich stattdessen die Zeichenfolge manuell überprüfen.

13 Bytes verloren, die Unterstützung für negative Zahlen hinzufügen.

Textlich
quelle
3

JavaScript, 14

n=>!(n<0||n%1)
edc65
quelle
13 Bytes:n=>!(n-(n|0))
Ismael Miguel
@IsmaelMiguel. Bei negativen Zahlen funktioniert das nicht.
@ThePirateBay Welche genaue Nummer? Ich habe es mit 5, 5.1, -5, -5.1, 0, 0.1 und -0.1 versucht.
Ismael Miguel
@IsmaelMiguel. (n=>!(n-(n|0)))(-3)kehrt zurück true, sollte aber zurückkehren false. Siehe den letzten Testfall.
Oh, da hast du recht: / Ich habe die Frage falsch gelesen: /
Ismael Miguel
3

Perl 5, 11 + 1 (-p) Bytes

$_=abs==int

Der -lSchalter wird nicht mitgezählt, da für Tests angezeigt

versuche es online

Nahuel Fouilleul
quelle
3

C #, 40 37 29 Bytes

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

8 Bytes gespart dank @Dennis_E!

Alte Antwort (37 Bytes)

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

Alte alte Antwort (40 Bytes):

bool z(float x){return (int)x==x&&x>=0;}
Yummypasta
quelle
2
30 Bytes: bool z(float x)=>x%1==0&&x>=0;und Sie können eine Single &für 29 Bytes verwenden
Dennis_E
@Dennis_E Danke!
Yummypasta
x=>x%1==0&x>=0ist kürzer und kompilierenFunc<float, bool>
TheLethalCoder
3

JavaScript, 17-15 Bytes

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

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

Vielen Dank an edc65, dass du meine Fehler abgefangen hast.

ericw31415
quelle
3

Nicht erweiterter Sinclair ZX81, 20 Byte

 1 INPUT A
 2 PRINT ABS A=INT A

20 Bytes, da BASIC tokenisiert ist.

Wird einfach 1 (wahr) ausgeben, wenn die Zahl positiv ist und der Wert der eingegebenen Zahl dem ganzzahligen Wert entspricht. Ausgang 0 eine dieser Bedingungen ist nicht erfüllt.

Shaun Bebbers
quelle
1
Ist das eine symbolisierte Sprache? Wenn ja, sollten Sie dies in Ihrer Antwort angeben.
Taylor Scott
1
Sorry, ja, es ist tokenized, dh INPUT ist 1 Byte RAM, genauso wie PRINT und sogar> = aufgrund einer ~ skurrilen ~ beabsichtigten Funktion von Sinclair BASIC
Shaun Bebbers
1
Insbesondere beträgt jede Zeilennummer 5 Byte + 1 newline( \r\nentspricht ZX81). Leerzeichen zählen nicht als Byte, da diese bereits in den Schlüsselwörtern enthalten sind, die normalerweise aufgrund des Sinclair-Eintasten-Eingabesystems verwendet werden. Während der Ausführung werden mehr Bytes benötigt, da der Wert von Aauf var stack; gesetzt wird. Ich denke, jeder numerische Wert ist immer 5 Bytes Speicher.
Shaun Bebbers
1
und ZX Spectrum auch
edc65
1
Soweit ich weiß, ist der Tokenisierungsmodus genau der gleiche (Spectrum hat mehr Codes). Und jede literale Zahl ist 6 Bytes: a 'numerische Tag' Byte gefolgt von dem Wert in einem 5 - Bytes codiert Proprietary Gleitpunktformat)
edc65
3

C, C ++: 38 37 Bytes

-1 Byte dank Zacharý

-1 byte dank ceilingcat

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

Zum Prüfen

C: Probieren Sie es online

C-Code:

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

#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;
}
HatsuPointerKun
quelle
1
Dies funktioniert nur bis zu INT_MAX. (Es interessiert mich nicht wirklich, aber einige Leute tun es.)
MD XF
Würde es return(int)n==n...funktionieren?
Zacharý
Sie können ein Byte rasieren, indem Sie unsigned int anstelle eines signierten verwenden (da Sie das nicht benötigen) >=0 Test ): return(unsigned)n==n; In C können Sie den Rückgabetyp für weitere 4 Byte weglassen.
Toby Speight
Sie können 8 weitere Bytes speichern:w(float n){n=n==(int)n&&n>=0;}
Johan du Toit
2

Symbolisches Python , 21 Bytes

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

Probieren Sie es online!

Verwendet einen verketteten Vergleich:

  • _%(_==_) == (_!=_)prüft ob n%1 == 0, nur wahr wenn nkein Dezimalteil vorhanden ist.
  • (_!=_) <= _prüft ob 0 <= n, nur wahr wenn die ganze Zahl nicht negativ ist.
FlipTack
quelle