Wyzwanie
Biorąc pod uwagę liczbę x
i liczbę n
, zaokrąglaj liczbę x
do n
liczb znaczących i generuj wynik.
Znaczące liczby
Znaczącymi liczbami liczby są cyfry, które niosą znaczenie, przyczyniając się do jej rozdzielczości pomiaru. Dotyczy to wszystkich liczb oprócz zer wiodących.
Pamiętaj, że wiodące zera po przecinku są nadal nieistotnymi cyframi.
Zaokrąglając cyfrę, należy zaokrąglić od zera, jeśli następna cyfra jest większa lub równa pięć.
Wszystkie zera końcowe po przecinku są liczone jako znaczące.
Wejście
Pierwszą liczbą będzie x
liczba do zaokrąglenia. Druga liczba to n
liczba znaczących liczb, które należy zaokrąglić x
.
x
będzie liczbą (twój kod powinien obsługiwać zarówno liczby całkowite, jak i zmiennoprzecinkowe) od -1 000 000 000 do 1 000 000 000 włącznie. n
będzie dodatnią liczbą całkowitą od 1 do 50 włącznie. n
nigdy nie będzie większy niż liczba cyfr w x
.
Wkładem nigdy nie będzie 0
ani żadna forma 0
, np . 0.000
Lub 000
.
Przykłady
Inputs: 2.6754, 2
Output: 2.7
Wyjście 2.7000
byłoby niepoprawne, ponieważ końcowe zera po przecinku są liczone jako liczby znaczące.
Inputs: 0.00034551, 4
Output: 0.0003455
Inputs: 50237.1238, 3
Output: 50200
Pamiętaj, że nie może to być kropka dziesiętna.
Inputs: 2374905, 1
Output: 2000000
Inputs: 543.0489, 4
Output: 543.0
Inputs: 15, 1
Output: 20
Inputs: 520.3, 3
Output: 520
Jeśli chcesz, możesz 520.
zamiast tego wyświetlać dane wyjściowe 520.0
.
Inputs: -53.87, 2
Output: -54
Inputs: 0.0999, 2
Output: 0.10
Zasady
Wbudowane funkcje i biblioteki, które pozwalają zaokrąglić liczbę do n
znaczących liczb, są niedozwolone.
Zwycięski
Najkrótszy kod w bajtach wygrywa.
Inputs: 520.3, 3
czy przecinek dziesiętny w odpowiedzi nie jest520.
istotny?2.0 x 10^2
, pokazując 2 sigfigs.Odpowiedzi:
Python 3, 83 bajty
(podobny do odpowiedzi PHP)
Przypadki testowe:
Wynik:
Poza tym, że jestem nieco dłuższy, inne podejście, które rozważałem:
... produkuje niepoprawne wyjście dla wejścia (15, 1):
... z powodu niedokładności zmiennoprzecinkowej w
round()
funkcji. Wydaje mi się prawdopodobne, że mógłbym znaleźć przypadki testowe, które przełamałyby metodę „zaokrąglania do zera po przecinku”, także gdybym wystarczająco się starał.Tak więc wydaje mi się, że moje rozwiązanie prawdopodobnie nie jest w 100% poprawne dla wszystkich przypadków i nie byłoby, chyba że zostało obliczone w systemie dziesiętnym. Ten problem może zatem wpływać na rozwiązania w dowolnym języku wykorzystującym arytmetykę FP.
źródło
s
w tym samym wierszu, a następnie używając średników.def s(x,n):y=10**(ceil(log10(abs(x)))-n);return y*round(x/y)
import *
aby to zrobićimport*
round()
Funkcja zaokrągla don
miejsc po przecinku, a nie don
liczb znaczących, więc było dozwolone dla tego wydarzenia golfowego.PHP, 130 bajtów
PHP, 133 bajtów działa z wartościami <1 dla liczb znaczących
PHP, 56 bajtów działa, ale pomija niepotrzebne zerowanie
Ktoś ukradł lub usunął funkcję rundy w PHP! Aby wyzwanie było bardziej interesujące. 127 bajtów
źródło
Partia,
660652 bajtówObjaśnienie: Zaczyna się od sufiksu a
.
parametru w przypadku, gdy jeszcze go nie ma, a następnie przycina znak (który jest zapisany) i wszelkie zera wiodące. Wynikowa zmiennam
jest zapisywana na później, ponieważ powie nam pożądaną wielkość wyniku. Wszelkie.
s są następnie usuwane, co może skutkować dalszymi zerami wiodącymi, więc są one również usuwane.n
zera są sufiksowane, aby zapewnić wystarczającą liczbę cyfr do zaokrąglenia, a następnie wyodrębniane są cyfryn
th i pierwszen
cyfry. Jeślin
ta cyfra nie jest równa 4 lub mniej, nużąco dodajemy1
do łańcucha. Jeśli łańcuch się przepełnia, wówczas zwiększamy wielkość przez prefiks a1
, ale jeśli pierwotnie był mniejszy0.1
, robimy to przez usunięcie1
właśnie dodanego i a0
po przecinku. Jeśli jasność jest wciąż mniejsza niż1
wtedy, kopiujemy zera po przecinku do wyniku, jednak jeśli jest1
lub więcej, to wyodrębniamy część całkowitą odpowiedzi, dodając dodatkowe zera, jeśli to konieczne, aby osiągnąć przecinek dziesiętny (który jest wtedy usunięty, ponieważ pokazywałby nieprawidłową precyzję). Wreszcie znak, część całkowita, przecinek dziesiętny i część dziesiętna są łączone.źródło