От нуля


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как это показывают тестовые примеры?
Джо Кинг

@ Шучу да - я уточню вопрос, чтобы уточнить. На самом деле это был первоначальный случай, но затем люди в песочнице предложили добавить недесятичные контрольные примеры, так что вот мы с обоими, извините
Value Ink


Забавно , что все языки , которые сделали так хорошо по сравнению с предыдущим вызовом, принимая целое число вход и выход не будет работать так хорошо, так как они не могут отличить -0.1и0.1
Джо Кинг

Ответы:


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." документы
Джонатан Аллан

¡Поведение опирается на поведение 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 Отличная находка, спасибо!
Джитс

Отлично сработано. У меня было это в 62 байтах ಥ_ಥ:g=lambda r:0if r==0 else(int(r)+r/abs(r)if r/int(r)!=1 else r)
user14492

Что такое '|' перед '-'?
Уильям

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

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 и Джонатан, спасибо за предложения, они были отредактированы в
Caird coinheringaahing

5

Java (JDK) , 18 байт

d->d.setScale(0,0)

Попробуйте онлайн!

Пояснения

Использует 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 в @ expired data
-3 tnx в @ night2


1
Добро пожаловать на сайт и приятного первого ответа! Надеюсь, вам понравится Code Golf!
Caird coinheringaahing

27 байт ... Вероятно, еще несколько, чтобы сохранить
Истекшие данные

@Expired, да, хорошо, этот вид кодирования был на первый взгляд настолько странным, что похоже, что я забыл обо всем, что касается библиотеки,
подумайте над тем

1
@ Night2, tnx для комментария, я не набрал весь ответ, я использовал Code golf submissionфункциональность, просто добавил немного своих слов в конец, но для редактирования я просто изменил эту строку кода, и я тут же забыл: обновите ссылку, которая возвращает нас к первому шагу, чтобы изменить только один раз, вроде как SOLID здесь, во всяком случае, tnx для подсказки тоже
hessam hedieh

1
Вы отредактировали свою ссылку TIO на 24-байтовую версию, но сама строка кода все еще является 27-байтовой версией.
Стоимость чернил

4

Рунические чары , 18 16 байт

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

Попробуйте онлайн!

«Добавляет» (от нуля) 0.999999 и выводит результат. µэто самая близкая вещь к бесконечно малым в операторах языка. С правильно работающей Trunc(x)командой ответ теперь поддерживается в 0качестве ввода.


1
@ JoKing Oof. Хороший улов. Он делает, divide by inputчтобы получить «знак» входного значения, которое, конечно, делится на 0, когда ввод равен 0. Сейчас нет (хорошего) способа обойти это. Сначала нужно будет это сделать . Я буду тыкать Дениса (дополнительная выгода, ответ будет короче).
Draco18s

1
@JoKing Ответ теперь обрабатывается 0правильно.
Draco18s

3

Stax , 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/\..*$//

Ungolfed

#!/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 Вау, я понятия не имею, почему я написал +=, спасибо за указание на это
Стрелец

Вы все еще можете отбросить внешние скобки
Gust van de Wal

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

0

Perl 6 , 19 байт

{$_+|0+.sign*?/\./}

Попробуйте онлайн!

Не самое короткое решение, но я над этим работаю. В основном это усекает число, а затем добавляет единицу к нулю, если число не было целым для начала


0

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

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

Попробуйте онлайн!


3
Лямбда-функция может быть написана без использования явного returnвыражения.
Джоэл

@ Джоэл действительно прав. И вы можете сохранить 4 дополнительные байты изменения (int)a/a<1в a%1!=0: 30 байт
Kevin Cruijssen

Есть также BigDecimal.setScaleметод, который дает отличные результаты, как показывает мой ответ
Оливье Грегуар




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