Zaokrąglić od zera

24

Zaokrąglić od zera

Inspirowany Roundem w kierunku zera .

Biorąc pod uwagę liczbę wprowadzoną dowolną rozsądną metodą, zaokrąglij liczbę „od zera” - liczby dodatnie zaokrąglają w górę, a liczby ujemne zaokrąglają w dół.

Jeśli zamierzasz traktować dane wejściowe jako ciąg znaków (na przykład przez STDIN), powinieneś być w stanie obsługiwać liczby z przecinkiem dziesiętnym lub bez niego. Jeśli weźmiesz go jako liczbę, powinna przynajmniej być w stanie obsłużyć precyzję zmiennoprzecinkową (podwójna precyzja nie jest wymagana) lub liczby wymierne.

W razie potrzeby możesz wypisać liczbę zmiennoprzecinkową z przecinkiem dziesiętnym (np. 42,0). (Lub nawet mieć niektóre przypadki testowe wyjściowe zmiennoprzecinkowe i niektóre wyjściowe liczby całkowite, jeśli to skraca twoją odpowiedź.)

Standardowe luki nie są dozwolone itp.

Przypadki testowe

-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

Link do piaskownicy

Wartość tuszu
źródło
jeśli bierzemy liczby w kontekście łańcuchowym, takim jak STDIN, to czy musimy wspierać, .0jak sugerują przypadki testowe?
Jo King
@JoKing tak-- zaktualizuję pytanie, aby wyjaśnić. To był pierwotnie przypadek, ale potem ludzie w piaskownicy zasugerowali dodanie przypadków dziesiętnych, więc tutaj mamy jedno i drugie, przepraszam
Value Ink
Dobrze jest być inspirującym :)
connectyourcharger
To zabawne, że wszystkie języki, które tak dobrze w poprzednim starciu poprzez wejście całkowitą liczbą całkowitą i wyjścia nie będzie działać tak dobrze, ponieważ nie można odróżnić -0.1i0.1
Jo Król

Odpowiedzi:

15

Excel, 13 bajtów

=ROUNDUP(A1,)

Alternatywny

=EVEN(A1*2)/2
nwellnhof
źródło
4
EVEN, co za dziwna funkcja ..
tsh
13
@tsh Myślę, że masz na myśli „nieparzystą funkcję”.
ujemne siedem
2
@negativeseven Nazwa użytkownika sprawdza się. :-P
Veky
9

R, 32 bajty

x=scan()
sign(x)*ceiling(abs(x))
Ukarane
źródło
3
31 bajtów - bardzo ładna odpowiedź!
Giuseppe
25 bajtów
Robin Ryder
8

Galaretka , 4 bajty

ĊṠ¡Ḟ

Monadyczny link akceptujący liczbę, która daje liczbę całkowitą.

Wypróbuj online! Lub zobacz zestaw testowy .

W jaki sposób?

ĊṠ¡Ḟ - Link: number, N
  ¡  - repeat...
 Ṡ   - ...number of times: sign of N (repeating -1 is the same as 0 times)
Ċ    - ...action: ceiling
   Ḟ - floor (that)
Jonathan Allan
źródło
Jak dokładnie ¡działa liczba ujemna? Nie sądzę, żeby zostało to udokumentowane
Cairair coinheringaahing
1
Nie jest to udokumentowane na wiki Jelly, ale ¡powtarzalna natura jest zaimplementowana z for index in range(repetitions)pętlą w kodzie. range([stop=]-1)jest pusty, ponieważ startdomyślnie 0i stepdomyślnie 1oraz „W przypadku kroku dodatniego zawartość zakresu rjest określana przez formułę r[i] = start + step*igdzie i >= 0i r[i] < stop”. docs
Jonathan Allan
¡zachowanie zależy od zachowania Pythona rangei range(-1).__iter__().__next__()natychmiast rzuca StopIteration.
Niepowiązany ciąg
6

Python 3 , 23 bajty

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

Wypróbuj online!

-1 bajt dzięki xnor

Jitse
źródło
1
Możesz zrobić, (1|-(i>0))aby zaoszczędzić bajt (1,-1)[i>0].
xnor
@xnor Ładne znalezisko, dzięki!
Jitse
Dobra robota. Miałem go na 62 bajtach ಥ_ಥ:g=lambda r:0if r==0 else(int(r)+r/abs(r)if r/int(r)!=1 else r)
user14492
Co to jest „|” zanim '-'?
William
1
@jaaq Bardzo podoba mi się również to rozwiązanie! Moje początkowe podejście miało również 24 bajty.
Jitse
5

Galaretka , 5 4 bajtów

AĊ×Ṡ

Wypróbuj online!

Ten port rekursywnej odpowiedzi Stax na galaretkę, więc sprawdź tę odpowiedź dla wyjaśnienia.

-1 bajt dzięki Nickowi Kennedy'emu

Galaretka , 6 5 bajtów

ĊḞ>?0

Wypróbuj online!

-1 bajt dzięki Jonathan Allan

Jak to działa?

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

   ?  - If:
  > 0 -   x > 0
      - Then:
Ċ     -   ceil(x)
      - Else:
 Ḟ    -   floor(x)
Cairney Coheringaahing
źródło
ĊḞ>?0działałby tak jak twoja 6.
Jonathan Allan
1
AĊ×Ṡma 4 i jest funkcjonalnie identyczny z pierwszą odpowiedzią.
Nick Kennedy
@NickKennedy i Jonathan, dzięki za sugestie, zostały one edytowane w
Cairn coinheringaahing
5

Java (JDK) , 18 bajtów

d->d.setScale(0,0)

Wypróbuj online!

Objaśnienia

Wykorzystuje BigDecimaljako wejście i wyjście. BigDecimalma metodę setScaleokreślającą skalę liczby. Pierwszy parametr to liczba cyfr po separatorze kropek, drugi to tryb zaokrąglania. ROUND_UPjest zaokrągleniem „od zera” i ma wartość, 0więc ustalam na stałe tę wartość.

Olivier Grégoire
źródło
5

Vim, 36 bajtów / naciśnięć klawiszy

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

Wypróbuj online! lub Zweryfikuj wszystkie przypadki testowe!

Wyjaśnienie:

: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
źródło
Użycie $F-a <esc>zamiast pierwszego wiersza i makra /jako warunkowe zamiast :gi :normdaje 29 bajtów tio.run
##
4

C # (kompilator Visual C #) , 41 bajtów 27 bajtów 24 bajty

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

Wypróbuj online!

Pierwszy post tutaj, dobrze się bawiłem, mam nadzieję, że ci się spodoba. Trochę czułem, że C # miejsce jest tutaj puste

-14 tnx na @expired data
-3 tnx na @ night2

hessam hedieh
źródło
1
Witamy na stronie i fajna pierwsza odpowiedź! Mam nadzieję, że lubisz Code Golf!
caird coinheringaahing
27 bajtów ... Prawdopodobnie jeszcze kilka do zapisania
Data wygasła
@ Wygasło, tak, ładnie, ten rodzaj kodowania był tak dziwny na pierwszy rzut oka, że ​​wygląda na to, że zapomniałem o całej bibliotece,
zechciałbym
1
@ Night2, tnx dla komentarza, nie wpisałem całej odpowiedzi, skorzystałem z Code golf submissionfunkcji, dodałem tylko trochę moich własnych słów na końcu, ale do edycji właśnie zmieniłem ten wiersz kodu, a tam właśnie, zapomniałem zaktualizuj link, który prowadzi nas z powrotem do pierwszego kroku, aby zmodyfikować tylko raz, w
pewnym sensie
1
Edytowałeś swój link TIO do wersji 24-bajtowej, ale sama linia kodu jest nadal wersją 27-bajtową.
Wartość tuszu
4

Runiczne Zaklęcia , 18 16 bajtów

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

Wypróbuj online!

„Dodaje” (od zera) 0,999999 i podaje wynik poniżej. µjest najbliższą nieskończoności operatorom języka. Przy prawidłowo działającym Trunc(x)poleceniu odpowiedź obsługuje teraz 0jako dane wejściowe.

Draco18s
źródło
1
@JoKing Oof. Dobry chwyt Robi to, divide by inputaby uzyskać „znak” wartości wejściowej, która oczywiście dzieli się przez 0, gdy wartość wejściowa wynosi 0. W tej chwili nie ma (dobrego) sposobu na obejście tego. Najpierw będzie potrzebne to zatwierdzenie . Szturchnę Dennisa (korzyść dodatkowa, odpowiedź będzie krótsza).
Draco18s
1
@JoKing Odpowiedź teraz działa 0poprawnie.
Draco18s
3

Stax , 6 bajtów

å├╪∙Bß

Uruchom i debuguj

Procedura:

  1. Całkowita wartość
  2. Sufit
  3. Pomnóż przez oryginalny znak
rekurencyjny
źródło
Narzędzie, którego używam, mówi, że to 14 bajtów
Gust van de Wal
Twoje narzędzie prawdopodobnie nie jest świadome kodowania znaków stax . Jeśli nadal nie jesteś przekonany, w sekcji „Narzędzia” znajduje się link do pobrania, za pomocą którego możesz pobrać plik źródłowy i sprawdzić jego rozmiar.
rekursywny
3

C, 94 43 39 bajtów

dzięki pułapowi cat za 39 bajtów

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

TIO

girobuz
źródło
48
Tylko ASCII
2

Retina 0.8.2 , 38 bajtów

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

Wypróbuj online! Link zawiera przypadki testowe. Wyjaśnienie:

\.0+
.

Usuń zera po przecinku, aby upewnić się, że liczba nie jest liczbą całkowitą; następne dwa dopasowania kończą się niepowodzeniem, jeśli po przecinku nie ma cyfr.

\b9+\..
0$&

Jeśli częścią całkowitą są wszystkie 9s, przedrostek a 0pozwala przepełnić przyrost.

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

Zwiększ część całkowitą liczby.

\..*

Usuń ułamkową część liczby.

Neil
źródło
2

05AB1E , 6 bajtów

ÄîI.±*

5-bajtowy zdecydowanie powinien być możliwy.

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

Ä       # 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
źródło
2

JavaScript (ES6), 20 bajtów

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

Wypróbuj online!

Skomentował

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
źródło
Pisałem odpowiedź na moją 16-bajtową odpowiedź ( n=>(~~n-n%1)%1+n), dopóki nie dowiedziałem się, że mój kod nie działa na liczbach od -1 do 1. Być może będziesz w stanie dowiedzieć się, jak sprawić, by działał z 3 ostatnimi bajtami lewo!
Gust van de Wal
2

Perl 6 , 18 bajtów

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

Wypróbuj online!

Wyjaśnienie

{                }  # Anonymous block
    .abs  # Absolute value
        %-1  # Modulo -1
           *.sign  # Multiply by sign
 $_-  # Subtract from original
nwellnhof
źródło
2

MathGolf , 5 bajtów

‼σ±ü*

Wypróbuj online!

Wyjaśnienie

Miło jest znaleźć zastosowanie dla operatora.

‼       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
źródło
2

PHP , 30 bajtów

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

Wypróbuj online!

Jeśli liczba nie jest liczbą całkowitą, do niej dodaje się znak -1 (dla liczb dziesiętnych ujemnych) lub 1 (dla liczb dziesiętnych dodatnich), a następnie drukowana jest część całkowita nowej liczby.


PHP , 32 bajty

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

Wypróbuj online!

Zasadniczo wyjścia floordanych wejściowych, jeśli jest mniejsza niż 0, ceilw przeciwnym razie.


PHP , 34 bajty

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

Wypróbuj online!

Noc 2
źródło
1

Brachylog , 7 bajtów

⌋₁ℤ₁|⌉₁

Wypróbuj online!

lub ⌉₁ℕ₁|⌋₁.

⌋₁         The input rounded down
  ℤ₁       is an integer less than -1
    |      and the output, or, the input
     ⌉₁    rounded up is the output.
Niepowiązany ciąg
źródło
1

APL (Dyalog Unicode) , 15 bajtów

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

Wypróbuj online!

Prosty Dfn. Używa⎕IO←0 .

W jaki sposób:

{⍎'⌈⌊'[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é
źródło
1

sed, 131 bajtów + 2 bajty na -rflagę

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

Bez golfa

#!/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/\..*$//
Promień
źródło
1

Perl 5 -pF/\./ , 35 bajtów

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

Wypróbuj online!

Xcali
źródło
zawodzi 3.0. W przypadku przełączników -pF\.wystarczy: //są opcjonalne.
Oh My Goodness
również 0.0jest prawdą
Oh My Goodness
Naprawiono oba z nich.
Xcali
1

JavaScript (node.js), 30 23 21 bajtów

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

Inspirowany odpowiedzią C #.

Dzięki @Value Ink i @Gust van de Wal za -7 bajtów!

Jeszcze raz dziękuję, @ust van de Wal za kolejne -2 bajty!

Strzelec
źródło
Po co korzystać, +=kiedy +zrobi lewę w tym przypadku? -1 bajt
wartość tuszu
Zamiast tego po parseInt()prostu użyję ~~na początku lub innego operatora bitowego, takiego jak |0lub ^0na końcu, aby zaoszczędzić kolejny kawałek bajtów
Gust van de Wal
@ValueInk wow, nie mam pojęcia, dlaczego napisałem +=, dziękuję za wskazanie
Sagittarius
Nadal możesz upuścić zewnętrzne nawiasy
Gust van de Wal
@GustvandeWal och, nie wiedziałem o tym! dzięki
Strzelec
0

Perl 6 , 19 bajtów

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

Wypróbuj online!

Nie najkrótsze rozwiązanie, ale pracuję nad tym. Zasadniczo powoduje to obcięcie liczby, a następnie dodaje jeden od zera, jeśli liczba nie była całkowita na początek

Jo King
źródło
0

Java (OpenJDK 8) , 43 bajty

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

Wypróbuj online!

X1M4L
źródło
3
Funkcję lambda można napisać bez użycia jawnej returninstrukcji.
Joel
@Jel ma rzeczywiście rację. I można zaoszczędzić dodatkowe 4 bajty zmianę (int)a/a<1do a%1!=0: 30 bajtów
Kevin Cruijssen
Jest też BigDecimal.setScalemetoda, która daje doskonałe wyniki, jak pokazuje moja odpowiedź
Olivier Grégoire
33 bajty
ceilingcat
0

Czerwony , 46 bajtów

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

Wypróbuj online!

Nieco bardziej czytelna wersja jest dłuższa o 2 bajty (te długie nazwy funkcji!):

func[n][to 1(sign? n)* round/ceiling absolute n]
Galen Iwanow
źródło