Rund weg von Null

24

Rund weg von Null

Inspiriert von Round gegen Null .

Runden Sie bei einer Zahleneingabe nach einer beliebigen vernünftigen Methode die Zahl "von Null weg" - positive Zahlen runden auf und negative Zahlen runden ab.

Wenn Sie die Eingabe als Zeichenfolge verwenden möchten (z. B. über STDIN), sollten Sie in der Lage sein, Zahlen mit oder ohne Dezimalpunkt zu verarbeiten. Wenn Sie es als Zahl nehmen, sollte es mindestens Gleitkomma-Genauigkeit (doppelte Genauigkeit nicht erforderlich) oder rationale Zahlen verarbeiten können.

Bei Bedarf können Sie eine Gleitkommazahl mit dem Dezimalpunkt (zB 42.0) ausgeben. (Oder lassen Sie einige Testfälle Fließkommazahlen und ganze Zahlen ausgeben, wenn dies Ihre Antwort verkürzt.)

Standardlücken sind nicht erlaubt, etc etc.

Testfälle

-99.9 => -100
-33.5 => -34
-7    => -7
-1.1  => -2
0     => 0
2.3   => 3
8     => 8
99.9  => 100
42.0  => 42
-39.0 => -39

Sandbox-Link

Wert Tinte
quelle
Wenn wir Zahlen in einem String-Kontext wie STDIN verwenden, müssen wir das unterstützen, .0wie es die Testfälle vermuten lassen?
Jo King
@JoKing yes-- Ich werde die Frage aktualisieren, um zu klären. Dies war eigentlich der ursprüngliche Fall, aber dann schlugen die Leute in der Sandbox vor, nicht-dezimale Testfälle hinzuzufügen, ähm, hier sind wir mit beiden, sorry
Value Ink
Fühlt sich gut an, inspirierend zu sein :)
connectyourcharger
Es ist schon komisch , dass alle die Sprachen , die so gut auf der vorherige Herausforderung haben durch ganzzahlige Eingabe nehmen und integer Ausgang nicht so gut funktionieren, da sie nicht dem Unterschied zwischen sagen können , -0.1und0.1
Jo König

Antworten:

15

Excel, 13 Bytes

=ROUNDUP(A1,)

Alternative

=EVEN(A1*2)/2
nwellnhof
quelle
4
EVEN, was für eine seltsame Funktion ..
tsh
13
@tsh Ich denke du meinst "ungerade Funktion".
negative sieben
2
@negativeseven Benutzername checkt aus. :-P
Veky
9

R, 32 Bytes

x=scan()
sign(x)*ceiling(abs(x))
Bestimmt
quelle
3
31 Bytes - sehr schöne Antwort!
Giuseppe
25 Bytes
Robin Ryder
8

Gelee , 4 Bytes

ĊṠ¡Ḟ

Ein monadischer Link, der eine Zahl akzeptiert, die eine Ganzzahl ergibt.

Probieren Sie es online! Oder sehen Sie sich eine Testsuite an .

Wie?

ĊṠ¡Ḟ - Link: number, N
  ¡  - repeat...
 Ṡ   - ...number of times: sign of N (repeating -1 is the same as 0 times)
Ċ    - ...action: ceiling
   Ḟ - floor (that)
Jonathan Allan
quelle
Wie genau funktioniert das ¡bei negativen Zahlen? Ich glaube nicht, dass es dokumentiert ist
Caird Coinheringaahing
1
Es ist nicht in Jellys Wiki dokumentiert, aber seine ¡Wiederholung wird mit einer for index in range(repetitions)Schleife im Code implementiert . range([stop=]-1)ist leer, da startstandardmäßig 0und stepstandardmäßig 1und "Bei einem positiven Schritt wird der Inhalt eines Bereichs rdurch die Formel r[i] = start + step*iwobei i >= 0und bestimmt r[i] < stop." docs
Jonathan Allan
¡Das Verhalten von stützt sich auf das von Python rangeund range(-1).__iter__().__next__()wirft sofort StopIteration.
Unrelated String
6

Python 3 , 23 Bytes

lambda i:i-i%(1|-(i>0))

Probieren Sie es online!

-1 Byte dank xnor

Jitse
quelle
1
Sie können tun (1|-(i>0)), um ein Byte zu speichern (1,-1)[i>0].
4.
@xnor Schöne Entdeckung, danke!
Jitse
Gut gemacht. Ich hatte es bei 62 Bytes ಥ_ಥ:g=lambda r:0if r==0 else(int(r)+r/abs(r)if r/int(r)!=1 else r)
user14492
Was ist das '|' Vor dem '-'?
William
1
@jaaq Diese Lösung gefällt mir auch sehr gut! Mein anfänglicher Ansatz war auch 24 Bytes.
Jitse,
5

Gelee , 5 4 Bytes

AĊ×Ṡ

Probieren Sie es online!

Diese Portierung trägt die rekursive Stax-Antwort in Jelly ein. Überprüfen Sie diese Antwort auf eine Erklärung.

-1 Byte dank Nick Kennedy

Gelee , 6 5 Bytes

ĊḞ>?0

Probieren Sie es online!

-1 Byte danke an Jonathan Allan

Wie funktioniert das?

ĊḞ>?0 - Monadic link. Takes a float, x, as argument

   ?  - If:
  > 0 -   x > 0
      - Then:
Ċ     -   ceil(x)
      - Else:
 Ḟ    -   floor(x)
Caird Coinheringaahing
quelle
ĊḞ>?0würde funktionieren wie deine 6.
Jonathan Allan
1
AĊ×Ṡist 4 und funktional identisch mit Ihrer ersten Antwort.
Nick Kennedy
@ NickKennedy und Jonathan, danke für die Vorschläge, sie wurden in
caird coinheringaahing
5

Java (JDK) , 18 Byte

d->d.setScale(0,0)

Probieren Sie es online!

Erklärungen

Verwendet a BigDecimalals Ein- und Ausgang. BigDecimalhat eine Methode setScale, die die Skala der Zahl festlegt. Der erste Parameter ist die Anzahl der Stellen nach dem Punkttrennzeichen, der zweite ist der Rundungsmodus. ROUND_UPist die Rundung "von Null weg" und hat einen Wert von, 0so dass ich diesen Wert fest codiere.

Olivier Grégoire
quelle
5

Vim, 36 Bytes / Tastenanschläge

:s/-/-<Space>
:g/\..*[1-9]/norm <C-v><C-a>lD
:s/<Space><cr>

Probieren Sie es online! oder Überprüfen Sie alle Testfälle!

Erläuterung:

:s/             " Replace...
   -            "   A dash
    /-<Space>   "   With a dash and a space

:g/                             " On Every line matching this regex...
   \.                           "   A dot
     .*                         "   Followed By anything
       [1-9]                    "   Followed by a digit other than 0
            /norm               " Run the following keystrokes...
                  <C-v><C-a>    "   Increment the number by 1
                                "   This also conveniently places our cursor just before the dot
                            l   "   Move one character right
                             D  "   Delete everything after the cursor

:s/             " Replace...
   <Space>      "   A space
                "   (With nothing)
DJMcMayhem
quelle
Unter Verwendung $F-a <esc>anstelle der ersten Zeile und ein Makro mit /als bedingter statt :gund :normgibt 29 Byte tio.run/##HczBCoJAFEZhWva/QpuLCNbizoxalBXRInqJMpjGCYVwmkx7/...
Kritixi Lithos
4

C # (Visual C # -Compiler) , 41 Byte, 27 Byte, 24 Byte

s=>(int)s+Math.Sign(s%1)

Probieren Sie es online!

Erster Beitrag hier, viel Spaß damit, hoffe es gefällt euch. Ich hatte das Gefühl, dass C # hier leer ist

-14
tnx an @ abgelaufene Daten -3 tnx an @ night2

hessam hedieh
quelle
1
Willkommen auf der Seite und schöne erste Antwort! Ich hoffe, Sie genießen Code Golf!
Caird Coinheringaahing
27 Bytes ... Wahrscheinlich noch ein paar zu speichern
Abgelaufene Daten
@Expired, ja schön, war diese Art der Codierung auf dem ersten Blick so seltsam , dass , wie ich aussieht über ganze Bibliothek Sache vergessen, Geist es als eine Antwort zu schreiben
Hessam Hedieh
1
@ Night2, tnx für den Kommentar, ich habe nicht die ganze Antwort eingegeben, ich habe die Code golf submissionFunktionalität verwendet, habe nur ein bisschen von meinen eigenen Wörtern zum Ende hinzugefügt, aber zum Bearbeiten habe ich nur diese Codezeile geändert und genau dort habe ich vergessen Aktualisiere den Link, der uns zum ersten Schritt zurückbringt, um ihn nur einmal zu ändern, irgendwie FEST hier, jedenfalls danke für den Hinweis
hessam hedieh
1
Sie haben Ihren TIO-Link zur 24-Byte-Version bearbeitet, aber die Codezeile selbst ist immer noch die 27-Byte-Version.
Value Ink
4

Runenverzauberungen , 18 16 Bytes

1µ-i:'-A{*+'.A@

Probieren Sie es online!

"Addiert" (von Null weg) 0,999999 und unterbreitet das Ergebnis. µist in den Operatoren der Sprache dem Infinitesimalen am nächsten. Mit einem ordnungsgemäß funktionierenden Trunc(x)Befehl unterstützt answer jetzt 0als Eingabe.

Draco18s
quelle
1
@JoKing Oof. Guter Fang. Es tut a divide by input, um das "Vorzeichen" des Eingabewerts zu erhalten, das natürlich durch 0 dividiert wird, wenn die Eingabe 0 ist. Daran führt derzeit kein (guter) Weg vorbei. Benötige dieses Commit zuerst. Ich werde Dennis stupsen (Nebeneffekt, die Antwort wird kürzer).
Draco18s
1
@JoKing Answer wird jetzt 0korrekt gehandhabt .
Draco18s
3

Stax , 6 Bytes

å├╪∙Bß

Führen Sie es aus und debuggen Sie es

Verfahren:

  1. Absolutwert
  2. Decke
  3. Mit Originalzeichen multiplizieren
rekursiv
quelle
Das Tool, das ich benutze, sagt, dass dies 14 Bytes sind
Gust van de Wal
Ihrem Tool ist die stax-Zeichenkodierung wahrscheinlich nicht bekannt . Wenn Sie immer noch nicht überzeugt sind, finden Sie im Abschnitt "Tools" einen Download-Link, über den Sie die Quelldatei herunterladen und ihre Größe selbst überprüfen können.
rekursiver
3

C 94 43 39 Bytes

danke an ceilingcat für 39 bytes

#define f(n)(int)(n>0?ceil(n):floor(n))

TIO

girobuz
quelle
48
Nur ASCII
2

Retina 0.8.2 , 38 Bytes

\.0+
.
\b9+\..
0$&
T`9d`d`.9*\..
\..*

Probieren Sie es online! Link enthält Testfälle. Erläuterung:

\.0+
.

Löschen Sie Nullen nach dem Dezimalpunkt, um sicherzustellen, dass es sich bei der Zahl nicht um eine Ganzzahl handelt. Die nächsten beiden Übereinstimmungen schlagen fehl, wenn keine Nachkommastellen vorhanden sind.

\b9+\..
0$&

Wenn der ganzzahlige Teil alle 9s ist, stellen Sie ein Präfix ein 0, damit das Inkrement überläuft.

T`9d`d`.9*\..

Erhöhen Sie den ganzzahligen Teil der Zahl.

\..*

Löschen Sie den Bruchteil der Zahl.

Neil
quelle
2

05AB1E , 6 Bytes

ÄîI.±*

Ein 5-Byte sollte auf jeden Fall möglich sein ..

Probieren Sie es online aus oder überprüfen Sie alle Testfälle .

Erläuterung:

Ä       # The absolute value of the (implicit) input,
 î      # ceiled
     *  # And then multiplied by
      # the signum
  I     # of the input
        # (after which the result is output implicitly)
Kevin Cruijssen
quelle
2

JavaScript (ES6), 20 Byte

n=>n%1?n<0?~-n:-~n:n

Probieren Sie es online!

Kommentiert

n =>        // n = input
  n % 1 ?   // if n is not an integer:
    n < 0 ? //   if n is negative:
      ~-n   //     return -(floor(-n) + 1) = -floor(-n) - 1
    :       //   else:
      -~n   //     return -(-(floor(n) + 1)) = floor(n) + 1
  :         // else:
    n       //   return n unchanged
Arnauld
quelle
Ich habe eine Antwort für meine 16-Byte-Antwort ( n=>(~~n-n%1)%1+n) geschrieben, bis ich herausgefunden habe, dass mein Code für Zahlen zwischen -1 und 1 nicht funktioniert. Möglicherweise können Sie herausfinden, wie dies mit den letzten 3 Bytes funktioniert links!
Gust van de Wal
2

Perl 6 , 18 Bytes

{$_-.abs%-1*.sign}

Probieren Sie es online!

Erläuterung

{                }  # Anonymous block
    .abs  # Absolute value
        %-1  # Modulo -1
           *.sign  # Multiply by sign
 $_-  # Subtract from original
nwellnhof
quelle
2

MathGolf , 5 Bytes

‼σ±ü*

Probieren Sie es online!

Erläuterung

Es ist schön, eine Verwendung für den Bediener zu finden .

‼       apply next two operators to (implicit) input
 σ      sign (-1, 0, or 1)
  ±     absolute value
   ü    ceiling of that absolute value
    *   multiply the rounded absolute value with the sign
maxb
quelle
2

PHP , 30 Bytes

<?=0^$argn-=0<=>fmod($argn,1);

Probieren Sie es online!

Wenn die Zahl keine Ganzzahl ist, wird basierend auf dem Vorzeichen -1 (für negative Dezimalstellen) oder 1 (für positive Dezimalstellen) eine Ganzzahl hinzugefügt und anschließend ein Teil der neuen Zahl gedruckt.


PHP , 32 Bytes

<?=[ceil,floor][$argn<0]($argn);

Probieren Sie es online!

Grundsätzlich Ausgänge floordes Eingangs, wenn es kleiner als 0 ist, sonst ceildavon.


PHP , 34 Bytes

<?=($argn>0?:-1)*ceil(abs($argn));

Probieren Sie es online!

Night2
quelle
1

Brachylog , 7 Bytes

⌋₁ℤ₁|⌉₁

Probieren Sie es online!

oder ⌉₁ℕ₁|⌋₁.

⌋₁         The input rounded down
  ℤ₁       is an integer less than -1
    |      and the output, or, the input
     ⌉₁    rounded up is the output.
Nicht verwandte Zeichenfolge
quelle
1

APL (Dyalog Unicode) , 15 Byte

{⍎'⌈⌊'[0>⍵],⍕⍵}

Probieren Sie es online!

Simple Dfn. Verwendet ⎕IO←0.

Wie:

{⍎'⌈⌊'[0>⍵],⍕⍵}  Main function, argument ⍵.
            ⍕⍵   Stringified argument
           ,     Appended to
      [0>⍵]      This item... (0 if  is positive or 0, else 1)
  '⌈⌊'           of this string (which are the functions Ceiling and Floor, respectively)
                Executed as APL code.
J. Sallé
quelle
1

sed, 131 Bytes + 2 Bytes für -rflag

/^-?[^.]*(\.0*)?$/bQ
s/^(-?)9/\109/
s/([0-8]9*)\..*$/_\1/
h
s/.*_//
y/0123456789/1234567890/
G
s/(.*)\n(.*)_(.*)/\2\1/
:Q
s/\..*$//

Ungolfed

#!/bin/sed -rf

# identify integers
/^-?[^.]*(\.0*)?$/ b isInt

# add a leading 0 if we'll need it later
s/^(-?)9/\109/

# convert to format: -?[0-9]_[0-8]9*
s/([0-8]9*)\..*$/_\1/

# move the part that will remain constant into the hold buffer
h
s/.*_//

# [0-8]9* can be incremented via character substitution
y/0123456789/1234567890/

# reassemble parts
G
s/(.*)\n(.*)_(.*)/\2\1/

:isInt
# Get rid of anything after the decimal point
s/\..*$//
Strahl
quelle
1

Perl 5 -pF/\./ , 35 Bytes

$_&&=$F[0]+($_!=int&&$_*(@F-1)/abs)

Probieren Sie es online!

Xcali
quelle
scheitert 3.0. Für Schalter -pF\.ist ausreichend: die //sind optional.
Oh meine Güte
Auch 0.0ist wahr
Oh meine Güte
Beides behoben.
Xcali
1

JavaScript (node.js), 30 23 21 Bytes

s=>~~s+Math.sign(s%1)

Inspiriert von der C # Antwort.

Vielen Dank an @Value Ink und @Gust van de Wal für -7 Bytes!

Nochmals vielen Dank, @Gust van de Wal für weitere -2 Bytes!

Schütze
quelle
Warum verwenden, +=wenn +dies der Fall ist? -1 Byte
Wert Tinte
Stattdessen parseInt()würde ich einfach ~~am Anfang oder einem anderen bitweisen Operator wie |0oder ^0am Ende verwenden, um einen weiteren Teil der Bytes zu speichern
Gust van de Wal,
@ValueInk wow, ich habe keine Ahnung, warum ich geschrieben habe +=, danke für den Hinweis
Schütze
Sie können immer noch die äußeren Klammern fallen lassen
Gust van de Wal
@GustvandeWal oh, das wusste ich nicht! Danke
Schütze
0

Perl 6 , 19 Bytes

{$_+|0+.sign*?/\./}

Probieren Sie es online!

Nicht die kürzeste Lösung, aber ich arbeite daran. Im Grunde schneidet dies die Zahl ab und addiert dann eins von null weg, wenn die Zahl von Anfang an nicht ganz war

Scherzen
quelle
0

Java (OpenJDK 8) , 43 Byte

a->{return(int)((int)a/a<1?a>0?a+1:a-1:a);}

Probieren Sie es online!

X1M4L
quelle
3
Die Lambda-Funktion kann ohne explizite returnAnweisung geschrieben werden.
Joel
@ Joel ist in der Tat richtig. Und Sie können 4 zusätzliche Bytes speichern, (int)a/a<1a%1!=0
indem Sie den Wert
Es gibt auch die BigDecimal.setScaleMethode, die hervorragende Ergebnisse liefert, wie meine Antwort zeigt
Olivier Grégoire,
33 Bytes
Ceilingcat
0

Rot , 46 Bytes

func[n][(pick[0 1]n = t: to 0 n)*(sign? n)+ t]

Probieren Sie es online!

Die etwas besser lesbare Version ist 2 Byte länger (diese langen Funktionsnamen!):

func[n][to 1(sign? n)* round/ceiling absolute n]
Galen Ivanov
quelle