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


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

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


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)

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


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)

ĊḞ>?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.


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)

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


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.


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

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


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.



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

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

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

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!





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.

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/\..*$//


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!


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




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]

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.