Круглый п Сиг Инжир


20

Вызов

Задав число xи число n, округлите число xдо nзначащих цифр и выведите результат.

Значимые фигуры

Значимые цифры числа являются цифрами, которые несут значение, способствующее его разрешающей способности измерения. Это включает в себя все числа, кроме ведущих нулей.

Имейте в виду, что ведущие нули после десятичной точки по-прежнему незначительны .

При округлении цифры вы должны округлить от нуля, если следующая цифра больше или равна пяти.

Все конечные нули после десятичной точки считаются значимыми.

вход

Первое число будет xокругленным числом. Второе число n- количество значащих цифр, до которых вы должны округлить x.

xбудет числом (ваш код должен обрабатывать как целые числа, так и числа с плавающей запятой) в диапазоне от -1 000 000 000 до 1 000 000 000 включительно. nбудет положительным целым числом от 1 до 50 включительно. nникогда не будет больше, чем число цифр в x.

Ввод никогда не будет 0или какой-либо форме 0, например, 0.000или 000.

Примеры

Inputs: 2.6754, 2
Output: 2.7

Вывод 2.7000будет недействительным, потому что завершающие нули после десятичной точки считаются значащими цифрами.


Inputs: 0.00034551, 4
Output: 0.0003455

Inputs: 50237.1238, 3
Output: 50200

Обратите внимание, что это не должно иметь десятичную точку.


Inputs: 2374905, 1
Output: 2000000

Inputs: 543.0489, 4
Output: 543.0

Inputs: 15, 1
Output: 20

Inputs: 520.3, 3
Output: 520

Если вы хотите, вы можете вывести 520.вместо этого, но нет 520.0.


Inputs: -53.87, 2
Output: -54

Inputs: 0.0999, 2
Output: 0.10

правила

Встроенные функции и библиотеки, которые позволяют округлять число до nзначащих цифр, запрещены.

выигрыш

Самый короткий код в байтах побеждает.


4
Для Inputs: 520.3, 3, не десятичная точка в ответе 520.важно?
Грег Мартин

5
@GregMartin Я полагаю, что это так, потому что это единственное, что делает его 3 фиг фиг против 2
Suever

3
@ BetaDecay Нет, это не так. Для этого потребуется десятичная точка.
mbomb007

3
«200 считается иметь только одну значащую цифру» - chemistry.bd.psu.edu/jircitano/sigfigs.html
mbomb007

4
@DLosc Вот почему, если бы это был результат, вы бы на самом деле написали это 2.0 x 10^2, показывая 2 сигфига.
mbomb007

Ответы:


3

Python 3, 83 байта

(похоже на ответ PHP)

from math import *
def s(x,n):
 y=10**(ceil(log10(abs(x)))-n)
 return y*round(x/y)

Тестовые случаи:

tests = [(2.6754,2), (0.00034551, 4), (50237.1238, 3),
        (2374905, 1), (543.0489, 4), (15, 1), (520.3, 3), (-53.87, 2)]

print ([s(x,n) for x,n in tests])

Выход:

[2.7, 0.0003455, 50200, 2000000, 543.0, 20, 520, -54]

Помимо того, что я немного длиннее, я рассмотрел еще один подход:

from math import *
def s(x,n):
 z=ceil(log10(abs(x)))
 return "%.*f"%(n-z,10**z*round(x/10**z,n))

... выдает неправильный вывод для ввода (15, 1):

['2.7', '0.0003455', '50200', '2000000', '543.0', '10', '520', '-54']

... из-за неточности с плавающей точкой в round()функции. Мне кажется, что я мог бы найти контрольные примеры, которые сломали бы метод «округление до нуля», даже если бы я посмотрел достаточно усердно.

Таким образом, мне кажется, что мое решение, вероятно, не на 100% правильно для всех случаев и не будет, если оно не будет вычислено в десятичном виде. Следовательно, эта проблема может повлиять на решения на любом языке, использующем арифметику FP.


Сохраните несколько байтов, поместив тело в sтой же строке, а затем используйте точки с запятой. def s(x,n):y=10**(ceil(log10(abs(x)))-n);return y*round(x/y)
Cyoce

Кроме того, вы можете удалить пространство, import *чтобы сделать этоimport*
Cyoce

Ваш ответ для меня не в порядке, потому что правила гласят: «Встроенные функции и библиотеки, которые позволяют округлять число до n значащих цифр, запрещены». И вы используете функцию округления с n = 0
RosLuP

@RosLuP: round()функция округляет до nдесятичных разрядов, а не до nзначащих цифр, поэтому это было разрешено для этого события гольфа.
Саймон

5

PHP, 130 байт

<?=number_format($r=round($i=$argv[1],($n=$argv[2])-ceil(log(abs($i),10))),($d=(1+floor(log(abs($r),10))-$n))<0?abs($d):0,".","");

PHP, 133 байта работает со значениями <1 для значащих цифр

<?=number_format($r=round($i=$argv[1],($n=$argv[2])-floor(log(abs($i),10))-1),($d=(1+floor(log(abs($r),10))-$n))<0?abs($d):0,".","");

PHP, 56 байт работает, но пропускают ненужные нули

<?=round($i=$argv[1],$argv[2]-floor(log(abs($i),10))-1);

Кто-то украл или удалил функцию округления в PHP! Чтобы сделать задачу более интересной. 127 байт

<?=ceil($x=($i=$argv[1])*10**(($r=$argv[2])-($l=floor(log(abs($i),10))+1)))-$x<=0.5?ceil($x)*10**($l-$r):floor($x)*10**($l-$r);

Это пропускает и неестественные нули. Это версия, где я использую не родную функцию раунда в PHP только для шутки. Он принадлежит к 56-байтовой версии, которую я бы предпочел
Jörg Hülsermann

Хорошо, если не использовать библиотечный раунд ....
РосЛюП

3

Пакетный, 660 652 байта

@echo off
set m=%1.
set s=
if %m:~,1%==- set s=-&set m=%m:~1%
:m
if %m:~,1%==0 set m=%m:~1%&goto m
set d=%m:.=%
:d
if %d:~,1%==0 set d=%d:~1%&goto d
for /l %%i in (1,1,%2) do call set d=%%d%%0
call set r=%%d:~%2,1%%
call set d=%%d:~,%2%%
if %r% leq 4 goto r
set r=
:i
set/ai=1+%d:~-1%
set r=%i:~-1%%r%
set d=%d:~,-1%
if %i% leq 9 set d=%d%%r%&goto r
if not "%d%"=="" goto i
set d=1%r:~1%
set m=1%m%
set m=%m:1.0=.%
:r
if %m:~,2%==.0 set m=%m:.0=.%&set d=0%d%&goto r
set i=0
set p=.
:l
if %m:~,1%==. echo %s%%i%%p%%d%&exit/b
if %i%==0 set i=
if "%d%"=="" set d=0&set p=
set i=%i%%d:~,1%
set d=%d:~1%
set m=%m:~1%
goto l

Объяснение: Начинается с суффикса a .к параметру, если его еще нет, затем обрезает знак (который сохраняется) и любые начальные нули. Полученная переменная mсохраняется для последующего использования, поскольку она сообщит нам желаемую величину результата. Любые .s затем удаляются, что может привести к дальнейшим начальным нулям, поэтому они тоже удаляются. nк нулю добавляется суффикс, чтобы обеспечить достаточное количество цифр для округления, после чего извлекаются nпервая и nтретья цифры. Если число nth не равно 4 или меньше, мы утомительно добавляем 1в строку. Если строка переполняется, то мы увеличиваем величину, добавляя префикс a 1, но если она изначально была меньше, чем 0.1мы, удаляя 1только что добавленную нами, а также0после десятичной точки. Если значение все еще меньше, чем 1мы копируем нули после десятичной точки в результат, однако, если оно равно 1или больше, мы извлекаем целую часть ответа, добавляя дополнительные нули, если необходимо достичь десятичной точки (которая затем удаляется, так как это будет показывать неправильную точность). Наконец, знак, целая часть, десятичная точка и десятичная часть объединяются.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.