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


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

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


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)

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


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)

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


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)

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


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.


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



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.



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

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

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

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!





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.

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


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!


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




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]

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.