Круглий від нуля


24

Круглий від нуля

Натхненний Раундом до нуля .

З огляду на введення числа будь-яким розумним методом, округніть число "далеко від нуля" - додатні числа округлюються, а від'ємні числа - округлюються вниз.

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

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

Стандартні лазівки не дозволяються тощо

Тестові справи

-99.9 => -100
-33.5 => -34
-7    => -7
-1.1  => -2
0     => 0
2.3   => 3
8     => 8
99.9  => 100
42.0  => 42
-39.0 => -39

Пісочниця Посилання


якщо ми беремо цифри в рядковому контексті, наприклад STDIN, чи потрібно нам підтримувати те, .0як здається, тестові випадки?
Джо Кінг

@JoKing так - я оновлю питання, щоб уточнити. Це був насправді оригінальний випадок, але тоді люди в пісочниці запропонували додати недесяткові тестові випадки, так що, ось ми з обома, вибачте
Value Ink

Відчуває себе натхненним :)
підключіть свій зарядний пристрій

Смішно, що всі мови, які зробили так добре в попередньому виклику, взявши цілий вхід і цілий вихід, не будуть працювати так добре, оскільки вони не можуть визначити різницю між -0.1і0.1
Jo King

Відповіді:


15

Excel, 13 байт

=ROUNDUP(A1,)

Альтернатива

=EVEN(A1*2)/2

4
EVEN, яка дивна функція ..
tsh

13
@tsh Я думаю, ви маєте на увазі "непарна функція".
мінус сім

2
@negativeseven Ім'я користувача перевіряється. :-P
Veky


8

Желе , 4 байти

ĊṠ¡Ḟ

Монадична посилання, що приймає число, яке дає ціле число.

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

Як?

ĊṠ¡Ḟ - Link: number, N
  ¡  - repeat...
 Ṡ   - ...number of times: sign of N (repeating -1 is the same as 0 times)
Ċ    - ...action: ceiling
   Ḟ - floor (that)

То як саме ¡працює негативна кількість? Я не думаю, що це документально підтверджено
caird coinheringaahing

1
Це не зафіксовано у вікі Jelly, але ¡повторюваний характер реалізований за допомогою for index in range(repetitions)циклу в коді. range([stop=]-1)порожній, оскільки startза замовчуванням до 0та stepза замовчуванням до 1та "Для позитивного кроку вміст діапазону rвизначається формулою r[i] = start + step*iде i >= 0і r[i] < stop". docs
Джонатан Аллан

¡поведінка покладається на поведінку Python range, і range(-1).__iter__().__next__()негайно кидає StopIteration.
Непов’язана струна

6

Python 3 , 23 байти

lambda i:i-i%(1|-(i>0))

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

-1 байт завдяки xnor


1
Ви можете зробити, (1|-(i>0))щоб зберегти байт (1,-1)[i>0].
xnor

@xnor Приємна знахідка, дякую!
Jitse

Молодці. У мене було 62 байти tes_ಥ:g=lambda r:0if r==0 else(int(r)+r/abs(r)if r/int(r)!=1 else r)
user14492

Що таке "|" перед '-'?
Вільям

1
@jaaq Мені теж подобається це рішення! Мій початковий підхід також складав 24 байти.
Jitse

5

Желе , 5 4 байти

AĊ×Ṡ

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

Відповідь Stax цього рекурсивного порту в Jelly, тому перевірте цю відповідь для пояснення.

-1 байт завдяки Ніку Кеннеді

Желе , 6 5 байт

ĊḞ>?0

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

-1 байт завдяки Джонатану Аллану

Як це працює

ĊḞ>?0 - Monadic link. Takes a float, x, as argument

   ?  - If:
  > 0 -   x > 0
      - Then:
Ċ     -   ceil(x)
      - Else:
 Ḟ    -   floor(x)

ĊḞ>?0буде працювати, як ваші 6.
Джонатан Аллан

1
AĊ×Ṡє 4 і функціонально ідентичний вашій першій відповіді.
Нік Кеннеді

@NickKennedy та Jonathan, дякую за пропозиції, вони були відредаговані в
caird coinheringaahing

5

Java (JDK) , 18 байт

d->d.setScale(0,0)

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

Пояснення

Використовує a BigDecimalяк вхід і вихід. BigDecimalмає метод, setScaleякий встановлює масштаб числа. Перший параметр - це кількість цифр після крапкового роздільника, другий - режим округлення. ROUND_UPє округленням "від нуля" і має значення, 0тому я жорстко кодую це значення.


5

Vim, 36 байт / натискання клавіш

:s/-/-<Space>
:g/\..*[1-9]/norm <C-v><C-a>lD
:s/<Space><cr>

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

Пояснення:

:s/             " Replace...
   -            "   A dash
    /-<Space>   "   With a dash and a space

:g/                             " On Every line matching this regex...
   \.                           "   A dot
     .*                         "   Followed By anything
       [1-9]                    "   Followed by a digit other than 0
            /norm               " Run the following keystrokes...
                  <C-v><C-a>    "   Increment the number by 1
                                "   This also conveniently places our cursor just before the dot
                            l   "   Move one character right
                             D  "   Delete everything after the cursor

:s/             " Replace...
   <Space>      "   A space
                "   (With nothing)

Використання $F-a <esc>замість першого рядка та макросу з /як умовного замість :gта :normдає 29 байт tio.run/##HczBCoJAFEZhWva/QpuLCNbizoxalBXRInqJMpjGCYVwmkx7/…
Kritixi Lithos


4

C # (Visual C # компілятор) , 41 байт 27 байт 24 байти

s=>(int)s+Math.Sign(s%1)

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

Перший пост тут, весело з ним, сподіваюся, вам сподобається. Ніби відчував, що C # тут порожнє

Від -14 tnx до даних, що минув,
-3 tnx до @ night2


1
Ласкаво просимо на сайт, і приємна перша відповідь! Сподіваюся, вам сподобався Code Golf!
caird coinheringaahing

27 байт ... Напевно, ще кілька, щоб зберегти
Термін дії минув

@Expired, так приємно, цей вид кодування був настільки дивним на перший погляд, що схоже на те, що я забув про цілу бібліотечну річ, пам'ятаю, щоб опублікувати це як відповідь
hessam hedieh

1
@ Night2, tnx для коментаря, я не вводив усю відповідь, я використав Code golf submissionфункціонал, Просто додав трохи власних слів до кінця, але для редагування я просто змінив цей рядок коду, і ур прямо там, я забув оновіть посилання, яке повертає нас до першого кроку, щоб змінити лише один раз, щось
подібне

1
Ви відредагували своє посилання TIO на 24-байтну версію, але сама кодова лінія все ще є 27-байтною версією.
Значення чорнила

4

Рунічні чари , 18 16 байт

1µ-i:'-A{*+'.A@

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

"Додає" (далеко від нуля) 0,999999 і додає результат. µє найближчим до нескінченного малого в операторах мови. За допомогою правильно функціонуючої Trunc(x)команди відповідь тепер підтримується 0як вхід.


1
@JoKing Oof. Хороший улов. Це робиться a, divide by inputщоб отримати "знак" вхідного значення, яке, звичайно, ділиться на 0, коли вхід дорівнює 0. Зараз немає жодного (хорошого) способу навколо цього. Потрібно спочатку зробити це . Я підкачу Деннісу (побічна вигода, відповідь буде коротшою).
Draco18s

1
@JoKing Відповідь зараз поводиться 0правильно.
Draco18s

3

Стакс , 6 байт

å├╪∙Bß

Запустіть і налагоджуйте його

Порядок:

  1. Абсолютне значення
  2. Стеля
  3. Помножте на оригінальний знак

Інструмент, який я використовую, говорить, що це 14 байт
Gust van de Wal

Ваш інструмент, ймовірно, не знає кодування символів stax . Якщо ви все ще не впевнені, у розділі "Інструменти" є посилання для завантаження, де ви можете фактично завантажити вихідний файл і перевірити його розмір для себе.
рекурсивна


2

Сітківка 0,8,2 , 38 байт

\.0+
.
\b9+\..
0$&
T`9d`d`.9*\..
\..*

Спробуйте в Інтернеті! Посилання включає тестові випадки. Пояснення:

\.0+
.

Видаліть нулі після десяткової крапки, щоб переконатися, що число не є цілим числом; наступні два поєдинки закінчуються невдачею, якщо після десяткової коми немає цифр.

\b9+\..
0$&

Якщо цілою частиною є всі 9s, префікс a, 0щоб дозволити приріст переповнювати.

T`9d`d`.9*\..

Збільшити цілу частину числа.

\..*

Видаліть дробову частину числа.



2

JavaScript (ES6), 20 байт

n=>n%1?n<0?~-n:-~n:n

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

Прокоментував

n =>        // n = input
  n % 1 ?   // if n is not an integer:
    n < 0 ? //   if n is negative:
      ~-n   //     return -(floor(-n) + 1) = -floor(-n) - 1
    :       //   else:
      -~n   //     return -(-(floor(n) + 1)) = floor(n) + 1
  :         // else:
    n       //   return n unchanged

Я писав відповідь на свою 16-байтну відповідь ( n=>(~~n-n%1)%1+n), поки не з’ясував, що мій код не працює для чисел від -1 до 1. Ви можете зрозуміти, як зробити цю роботу останніми 3 байтами ліворуч!
Густ ван де Валь


2

MathGolf , 5 байт

‼σ±ü*

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

Пояснення

Приємно знайти використання оператора.

‼       apply next two operators to (implicit) input
 σ      sign (-1, 0, or 1)
  ±     absolute value
   ü    ceiling of that absolute value
    *   multiply the rounded absolute value with the sign

2

PHP , 30 байт

<?=0^$argn-=0<=>fmod($argn,1);

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

Якщо число не ціле, на нього додається знак -1 (для від'ємних десяткових знаків) або 1 (для додатних десяткових знаків), після чого друкується ціла частина нового числа.


PHP , 32 байти

<?=[ceil,floor][$argn<0]($argn);

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

В основному виводи floorвводу, якщо він менше 0, в іншому випадку ceil.


PHP , 34 байти

<?=($argn>0?:-1)*ceil(abs($argn));

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





1

APL (Dyalog Unicode) , 15 байт

{⍎'⌈⌊'[0>⍵],⍕⍵}

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

Простий Dfn. Використання ⎕IO←0.

Як:

{⍎'⌈⌊'[0>⍵],⍕⍵}  Main function, argument ⍵.
            ⍕⍵   Stringified argument
           ,     Appended to
      [0>⍵]      This item... (0 if  is positive or 0, else 1)
  '⌈⌊'           of this string (which are the functions Ceiling and Floor, respectively)
                Executed as APL code.

1

sed, 131 байт + 2 байти для -rпрапора

/^-?[^.]*(\.0*)?$/bQ
s/^(-?)9/\109/
s/([0-8]9*)\..*$/_\1/
h
s/.*_//
y/0123456789/1234567890/
G
s/(.*)\n(.*)_(.*)/\2\1/
:Q
s/\..*$//

Безумовно

#!/bin/sed -rf

# identify integers
/^-?[^.]*(\.0*)?$/ b isInt

# add a leading 0 if we'll need it later
s/^(-?)9/\109/

# convert to format: -?[0-9]_[0-8]9*
s/([0-8]9*)\..*$/_\1/

# move the part that will remain constant into the hold buffer
h
s/.*_//

# [0-8]9* can be incremented via character substitution
y/0123456789/1234567890/

# reassemble parts
G
s/(.*)\n(.*)_(.*)/\2\1/

:isInt
# Get rid of anything after the decimal point
s/\..*$//


1

JavaScript (node.js), 30 23 21 байт

s=>~~s+Math.sign(s%1)

Натхненний відповіддю C #.

Завдяки @Value Ink та @Gust van de Wal за -7 байт!

Ще раз дякую, @Gust van de Wal, ще -2 байти!


Навіщо використовувати, +=коли +в цьому випадку робитимуть трюк? -1 байт
значення чорнила

Замість цього parseInt()я б просто скористався ~~на старті або іншим побітним оператором, як-то |0або ^0в кінці, щоб зберегти ще один шматок байтів
Gust van de Wal

@ValueInk Нічого собі не знаю, чому я написав +=, thx для його вказівки
Стрілець

Ви все ще можете скинути зовнішні дужки
Густ ван де Валь,

@GustvandeWal о, я цього не знав! спасибі
Стрілець


0

Java (OpenJDK 8) , 43 байти

a->{return(int)((int)a/a<1?a>0?a+1:a-1:a);}

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


3
Функція лямбда може бути записана без використання явного returnтвердження.
Джоель

@Joel справді має рацію. І ви можете зберегти 4 додаткові байти, змінивши (int)a/a<1на a%1!=0: 30 байт
Кевін Круїйсен

Існує також BigDecimal.setScaleметод, який дає чудові результати, як це демонструє моя відповідь
Олів'є Грегоар




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