Круглий, як нуль


12

Мета

Враховуючи номер введення, округляйте його до найближчого числа однією значущою цифрою.

Вимоги

Вхідні дані

  • Номер з плаваючою комою.
  • Припустимо, що число введення призводить до виводу в межах типу даних (тобто ігнорувати помилки переповнення.)
  • 0 - недійсний вхід.
  • Числа, які не можуть бути точно представлені у типі даних плаваючої точки (наприклад "0.35", зберігаються як 0.3499999), не повинні підтримуватися.

Вихідні дані

  • Найближче число, яке складається з однієї ненульової цифри і будь-якої кількості нульових цифр.
  • Результат повинен підтримувати від’ємні числа та дробові числа.
  • Коли вхід лежить рівно між двома можливими виходами, округлюйте їх від нуля.

Презентація

Основна увага приділяється обчисленню, а не презентації. Вихідним може бути тип даних з плаваючою комою. Це може бути текст повністю або в науковій нотації. Якщо ви знайдете лазівку, де подання певним чином зменшує кількість байтів, кудо вам!

Приклади

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

Випробування

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

Оцінка балів

Код з найменшим числом байтів після тижня виграє.


3
Я думаю, що "одна значна цифра" - це фраза, яку ви шукаєте.
Стів Беннетт

2
Правило округлення для 0 досить дивне.
xnor

2
@xnor, ти маєш рацію. 0 ближче до 0,0001, ніж 1. Я думаю, що 0 просто повинен бути недійсним.
Hand-E-Food

1
Так, і це не відповідає заяві про мету.
Стів Беннетт

Відповіді:


6

MATL , 3 байти

1&V

Спробуйте в Інтернеті! Або перевірити всі тестові випадки .

Тестовий випадок 0.25не вдається для компілятора, що працює в Octave на TIO, але працює в Matlab в Windows:

введіть тут опис зображення

Інша поведінка обумовлена ​​функцією Октава / Матлаба, sprintfвикористовуючи округлення "банкіра" або ".5 від нуля", залежно від платформи. Більше інформації та тестів можна знайти тут .


Для 6 байт ,

1t3$Yo

працює як на Octave, так і на Matlab. Перевірте всі тестові випадки .


1
"Банківське округлення" - це майже те, що змусило мене видалити свою відповідь "Желе". > _ <
Ерік Аутгольфер

@EriktheOutgolfer Так, я зрозумів, що це теж причина. Мені пощастило, що Матлаб цього не робить :-D
Луїс Мендо


9

Javascript, 19 байт

x=>x.toPrecision(1)

Це не відповідає специфікації на 0або 25.
Anders Kaseorg

Цікаво. Специфікація для 0мене не має сенсу. Але 0.35справа ... схоже, Javascript намагається уникнути упередженості округлення, але специфікація хоче зміщення.
Стів Беннетт

Гей, ви змінили свій коментар - ви раніше 0.35не писали 25. Я думаю, що це задовольняє специфікації на 25 - він повертає "3e + 1", що мені здається правильним.
Стів Беннетт

Вибачте, я змінив його, 0.35оскільки 0.35не має точного подання з плаваючою комою. Поведінка повинна залежати від браузера; Я отримую 252e+1у Firefox.
Андерс Касеорг

Так, я отримую ці два різні результати в Chrome проти Firefox. Ого.
Стів Беннетт

4

Сітківка , 63 62 байт

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

Спробуйте в Інтернеті!


Мабуть, вам не доведеться хвилюватися з приводу нульових знаків, щоб ви могли повністю зняти останній етап (хоча мене це вражає, адже не кожен день ви бачите три знаки запитання у проміжку чотирьох символів).
Ніл

На жаль, ця відповідь виявляється невдалою 0.99.
Ніл

Також не виконується для 0.099т.д. Моя спроба лагодження: Спробуйте його в Інтернеті!
Ніл

Також не виконується для 99.99, 100.001...
Neil

Ще не так 0.099, вибачте. З точки зору світла, я думаю, що ви можете зняти +після ;третього рядка.
Ніл

2

PHP , 45 байт

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

Спробуйте в Інтернеті!

Той самий метод, що і моя відповідь python 2.

Також здається, що правильно поводитись 0.35, що також ставить його прив’язку до відповіді JS: D


Цікаво, що я думаю, що ваша видалена відповідь Python 3 може працювати в Python 2.
Anders Kaseorg

Перевірено, і це робить! Відредагував і
скасував

2

T-SQL, 27 байт

SELECT FORMAT(i,'G1')FROM t

Використовуючи той самий код форматування .Net, що і відповідь C # Карлоса Алехо . Введення здійснюється з поплавкового стовпця i в попередньо існуючій таблиці t , згідно з нашими стандартами введення-виведення

Тестові приклади:

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

(Досить зручно, що я можу попередньо завантажити таблицю вводу з усіма цими значеннями та запустити їх одразу.)


1

Python 2 , 62 байти

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

Спробуйте в Інтернеті!

Не використовується для гольф-пітонів, але це працює.

Не вдається 0.35внаслідок неточностей з плаваючою комою.

Дякуємо Андерсу Касеоргу за те, що він зазначив, що в Python 2 це правильно працює


Вихід для 0.25повинен бути 0.3.
Андерс Касеорг

@AndersKaseorg Я не впевнений, чому, але можу лише припустити, що це пов'язано з тими ж неточностями з плаваючою комою, що і відповідь Javascript.
Skidsdev

Хм чекати 25 має таку ж проблему ... дивно.
Skidsdev

Для всіх, хто цікавиться, Python 2 roundоб'їжджає з нуля, а Python 3 - до рівних, тому це працює в Py2, але не 3.
flornquake

ви можете грати в кілька байтів, використовуючи log(x,10)замість них log10(abs(x)).
Алікс Ейзенхардт


1

Excel, 14 байт

=ROUNDUP(A1,1)

Ласкаво просимо на сайт! Це хороша перша відповідь, чи є у вас посилання на те, що десь це можна перевірити, бажано в Інтернеті, щоб іншим користувачам не довелося завантажувати Excel?
caird coinheringaahing

На жаль, я не думаю, що існують безкоштовні сайти Microsoft через ліцензування, вибачте. Я бачив інші відповіді Excel щодо Code Golf, але я не впевнений, як вони перевірені, оскільки я новий!
REW

Це не працює для більшості тестових випадків. Це округлення до позиції "десятих". Це потрібно округлювати (не до), до якої б не було найзначнішої позиції.
Hand-E-Food



0

Четвертий (gforth) , 24 байти

: f 1 set-precision f. ;

Спробуйте в Інтернеті!

Вхід очікується на стеці з плаваючою комою. Вихідні дані - це stdout

Мені не подобається вносити зміни до глобальної (для цього випадку) точності функцій виведення з плаваючою точкою, але це економить багато байт, щоб не довелося відновлювати попереднє значення в кінці. Не виводиться з інженерних чи наукових позначень, незалежно від вкладених даних.

Примітка: З різних причин, тио перекладач зверненого 0.25до 0.2, в той час як моя місцевої новообращенная установки 0.25в 0.3. Я не зовсім впевнений, чому це так, але оскільки локально отримую правильний результат, я залишаю свою відповідь такою, яка є

: 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.