Okrągły jak zero

12

Cel

Podaną liczbę wejściową zaokrąglić do najbliższej liczby jedną znaczącą cyfrą.

Wymagania

Wejście

  • Liczba zmiennoprzecinkowa.
  • Załóżmy, że liczba wejściowa powoduje, że dane wyjściowe mieszczą się w granicach typu danych (tj. Zignoruj ​​błędy przepełnienia).
  • 0 jest nieprawidłowym wejściem.
  • Liczby, których nie można dokładnie przedstawić w zmiennoprzecinkowym typie danych (np. "0.35"Przechowywane jako 0.3499999), nie muszą być obsługiwane.

Wynik

  • Najbliższa liczba składająca się z jednej niezerowej cyfry i dowolnej liczby cyfr zerowych.
  • Wynik musi obsługiwać liczby ujemne i liczby ułamkowe.
  • Gdy wejście leży dokładnie pomiędzy dwoma możliwymi wyjściami, zaokrąglić od zera.

Prezentacja

Nacisk kładziony jest na obliczenia, a nie na prezentację. Dane wyjściowe mogą być typu danych zmiennoprzecinkowych. Może to być tekst w całości lub w notacji naukowej. Jeśli znajdziesz lukę, w której przedstawienie określonego sposobu zmniejsza liczbę bajtów, pochwały dla Ciebie!

Przykłady

9
-3000
.2
0.2
-.2
7e12
5e-15
1e0

Przypadki testowe

Input     Output
1         1
10        10
17        20
99        100
54321     50000
56789     60000
-123      -100
-789      -800
0.23      0.2
0.25      0.3
-0.25     -0.3
4.56e23   5e23
4.56e-23  5e-23

Punktacja

Wygrywa kod z najmniejszą liczbą bajtów po tygodniu.

Hand-E-Food
źródło
3
Myślę, że „jedna znacząca liczba” to fraza, której szukasz.
Steve Bennett,
2
Zasada zaokrąglania dla 0 jest dość dziwna.
xnor
2
@xnor, masz rację. 0 jest bliższe 0,0001 niż 1. Myślę, że 0 powinno być po prostu nieprawidłowe.
Hand-E-Food
1
Tak, i nie pasuje do deklaracji celu.
Steve Bennett,

Odpowiedzi:

6

MATL , 3 bajty

1&V

Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .

Przypadek testowy 0.25kończy się niepowodzeniem dla kompilatora działającego w Octave na TIO, ale działa w Matlab w systemie Windows:

wprowadź opis zdjęcia tutaj

Odmienne zachowanie jest spowodowane przez sprintffunkcję Octave / Matlab, która używa albo „zaokrąglania bankiera”, albo „0,5 od zera”, w zależności od platformy. Więcej informacji i testów można znaleźć tutaj .


Do 6 bajtów ,

1t3$Yo

działa zarówno na Octave, jak i na Matlabie. Sprawdź wszystkie przypadki testowe .

Luis Mendo
źródło
1
„zaokrąglanie przez bankiera” jest właściwie tym, co spowodowało, że usunąłem moją odpowiedź Jelly. > _ <
Erik the Outgolfer
@EriktheOutgolfer Tak, zorientowałem się, że to też był powód. Mam szczęście, że Matlab tego nie robi:
Luis Mendo,
11

C # (.NET Core) , 19 bajtów

n=>n.ToString("G1")

Wypróbuj online!

Przykłady:

Input     Output
----------------
 54321     5E+04
-56789    -6E+04
 99        1E+02
 0.23      0.2
 0.25      0.3
-0.25     -0.3
 4.56e23   5E+23
 4.56e-23  5E-23
Charlie
źródło
9

JavaScript, 19 bajtów

x=>x.toPrecision(1)
Steve Bennett
źródło
To nie spełnia specyfikacji na 0lub 25.
Anders Kaseorg,
Ciekawy. Specyfikacja 0nie ma dla mnie sensu. Ale 0.35rzecz ... wygląda na to, że JavaScript próbuje uniknąć stronniczości w zaokrąglaniu, ale specyfikacja chce stronniczości.
Steve Bennett,
Hej, zmieniła swój komentarz - napisałeś 0.35nie 25wcześniej. Myślę, że spełnia specyfikację dla 25 - zwraca „3e + 1”, co wydaje mi się właściwe.
Steve Bennett,
Przepraszam, zmieniłem to, 0.35ponieważ 0.35nie ma dokładnej reprezentacji zmiennoprzecinkowej. Zachowanie musi być zależne od przeglądarki; Dostaję 252e+1w Firefoksie.
Anders Kaseorg,
Tak, otrzymuję te dwa różne wyniki w Chrome vs Firefox. Łał.
Steve Bennett,
4

Siatkówka , 63 62 bajty

1`[1-9]
$*#
#\.?[5-9]
#$&
T`d`0`#[\d.]+
0(\.?)#{10}
1$1
#+
$.0

Wypróbuj online!

TwiNight
źródło
Najwyraźniej nie musisz się martwić końcowymi zerami, więc możesz całkowicie usunąć ostatni etap (chociaż jestem pod wrażeniem, nie codziennie pojawiają się trzy znaki zapytania w przestrzeni czterech znaków).
Neil,
Niestety wydaje się, że ta odpowiedź zawodzi 0.99.
Neil,
Również się nie udaje 0.099itp. Moja próba naprawy: Wypróbuj online!
Neil,
Nie udaje się również za 99.99, 100.001...
Neil
Nadal źle 0.099, przepraszam. Z drugiej strony myślę, że można usunąć +po ;trzeciej linii.
Neil,
2

PHP , 45 bajtów

<?=round($x=$argv[1],-floor(log10(abs($x))));

Wypróbuj online!

Ta sama metoda, co moja odpowiedź na python 2.

Wydaje się również poprawnie obsługiwać 0.35, co powoduje, że jest to również kołek powyżej odpowiedzi JS: D

Skidsdev
źródło
Co ciekawe, myślę, że usunięta odpowiedź w Pythonie 3 może działać w Pythonie 2.
Anders Kaseorg,
Przetestowane i tak się dzieje! Zredagowałem i
usunęłem
2

T-SQL, 27 bajtów

SELECT FORMAT(i,'G1')FROM t

Korzystanie z tego samego kodu formatującego .Net, co odpowiedź C # Carlosa Alejo . Dane wejściowe pochodzą z pływającej kolumny i w istniejącej tabeli t , zgodnie z naszymi standardami we / wy

Przypadki testowe:

Input         Output
------------ --------
1             1
10            1E+01
17            2E+01
99            1E+02
54321         5E+04
56789         6E+04
-123         -1E+02
-789         -8E+02
0.23          0.2
0.25          0.3
-0.25        -0.3
4.56E+23      5E+23
4.56E-23      5E-23

(Bardzo przydatne, że mogę wstępnie załadować tabelę wejściową z tymi wszystkimi wartościami i uruchomić je jednocześnie).

BradC
źródło
1

Python 2 , 62 bajty

lambda x:round(x,-int(floor(log10(abs(x)))))
from math import*

Wypróbuj online!

Nie jest używany do gry w golfa w Pythonie, ale to działa.

Nie działa z 0.35powodu niedokładności zmiennoprzecinkowych.

Podziękowania dla Andersa Kaseorga za zwrócenie uwagi, że działa to poprawnie w Pythonie 2

Skidsdev
źródło
Dane wyjściowe 0.25powinny być 0.3.
Anders Kaseorg,
@AndersKaseorg Nie jestem pewien, dlaczego, ale mogę tylko założyć, że jest to spowodowane tymi samymi niedokładnościami zmiennoprzecinkowymi, co odpowiedź Javascript.
Skidsdev
Hmm, czekaj 25 ma ten sam problem ... dziwne.
Skidsdev
Dla każdego, kto zastanawia się, Python 2 roundzaokrągla od zera, podczas gdy Python 3 zaokrągla do parzystej, dlatego działa to w Py2, ale nie 3.
trzęsienie ziemi
możesz zagrać w golfa za pomocą kilku bajtów log(x,10)zamiast log10(abs(x)).
Alix Eisenhardt
1

Excel, 14 bajtów

=ROUNDUP(A1,1)
rew
źródło
Witamy na stronie! To ładna pierwsza odpowiedź, czy masz jakieś linki, które można gdzieś przetestować, najlepiej online, aby inni użytkownicy nie musieli pobierać programu Excel?
caird coinheringaahing
Niestety, nie sądzę, że są jakieś bezpłatne witryny Microsoft z powodu licencjonowania, przepraszam. Widziałem inne odpowiedzi Excela na Code Golf, ale nie jestem pewien, jak są one sprawdzane, ponieważ jestem nowy!
rew
To nie działa w przypadku większości przypadków testowych. Zaokrągla się w górę do pozycji „dziesiątych”. Musi zaokrąglić (nie w górę) do dowolnej najważniejszej pozycji.
Hand-E-Food,
0

Dalej (gforth) , 24 bajty

: f 1 set-precision f. ;

Wypróbuj online!

Dane wejściowe są oczekiwane na stosie zmiennoprzecinkowym. Wyjście jest na standardowe wyjście

Nie lubię wprowadzać zmian w globalnej (w tym przypadku) precyzji funkcji wyjściowych zmiennoprzecinkowych, ale oszczędza wiele bajtów, aby nie musieć przywracać poprzedniej wartości na końcu. Nie generuje w notacji inżynierskiej ani naukowej, niezależnie od danych wejściowych.

Uwaga: Z jakiegoś powodu interpreter tio konwertuje 0.25na 0.2, podczas gdy moja instalacja lokalna konwertuje 0.25na 0.3. Nie jestem do końca pewien, dlaczego tak jest, ale ponieważ otrzymuję poprawny wynik lokalnie, zostawiam swoją odpowiedź taką, jaka jest

: f                   \ start a new word definition
  1 set-precision     \ set the floating point output words to use 1 significant digit
  f.                  \ output the top of the floating point stack
;                     \ end the word definition
reffu
źródło