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


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не має точного подання з плаваючою комою. Поведінка повинна залежати від браузера; Я отримую 25↦ 2e+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.