Вычислить Верхний Дивмод


13

задача

Указанные два положительных целых чисел (DIVID е й и Divis O г), вычислить Q uotient и г emainder.
Обычно это будет рассчитываться как e = o*q+rгде q*o<=eи 0<=r<o.
Для этого вызова это еще, e = o*q+rно q*o>=eи -o<r<=0.
Например, e=20и o=3, как правило, это будет 20/3 -> 20=3*6+2, так как 18<=20и0<=2<3 . Здесь будет 20/3 -> 20=3*7-1где 21>=20и-3<-1<=0

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

Input -> Output
20, 3 -> 7, -1
10, 5 -> 2, 0
7, 20 -> 1, -13
100, 13 -> 8, -4

Вам не нужно справляться o=0.


3
Называется это тривиальным вариантом обычного divmod.
Нил

Допустимо ли выводить rкак отрицание реального rдля языков, которые используют байты без знака для хранения данных или предполагают переполнение? ( -11/ 255)
Уриэль

@ Uriel да, но добавьте примечание об этом в ответе
Род

Ответы:


8

Python 3 , 39 26 байт

Мартин Эндер спас 13 байтов

lambda x,y:(-(x//-y),x%-y)

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

Python 2 , 25 байт

lambda x,y:(-(x/-y),x%-y)

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


Я думаю, что вы можете просто сделать, x%-yчтобы получить остаток.
Мартин Эндер

На самом деле, почему бы не пройти весь путь ...(-(x//-y),x%-y)
Мартин Эндер

@MartinEnder Это действительно хорошо
Halvard Hummel

@ Mr.Xcoder Включены оба
Халвард Хаммель

8

Желе , 3 байта

NdN

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

Как это устроено

Злоупотребление divmod снова \ o /. Смотри не юникод!

NdN - Полная программа / Диадическая цепь. | Пример: 7, 20

N - Отрицание первого ввода. | -7
 d - Дивмод по второму. | [-1, 13]
  N - Отрицать друг друга снова. | [1, -13]


5

Mathematica, 21 байт

{s=⌈#/#2⌉,#-#2s}&

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


Можете ли вы добавить объяснение, пожалуйста?
Род

2
@Rod ⌈#/#2⌉вычисляет потолок их деления и сохраняет его в переменной s, а затем вычитает аргумент 2 * s из аргумента 1.
Mr. Xcoder

1
@ Mr.Xcoder ты быстр!
J42161217

5

05AB1E , 4 байта

(s‰(

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

5 байт

(‰ćÄJ

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

Как они работают

Злоупотребления Python по модулю! \ О /

(s ‰ (| Полная программа. Пусть A и B - два входа. | Пример: 100, 13.

(| Вычислить -A. | -100
 с | Поменять местами (в этом случае обратный стек). | 13, -100
  ‰ | Divmod. | [-8, 4]
   (| Отрицательный (умножьте каждый на -1, в основном). | [8, -4]

-------------------------------------------------- -

(‰ ćÄJ | Полная программа. Принимает ввод в обратном порядке.

(| Отрицательный. Нажмите -A.
 ‰ | Divmod
  ć | Нажмите на извлеченную головку divmod (сделайте стек [частное, [остаток]].
   Ä | Абсолютное значение (действует на частное).
    J | Присоединяйтесь к стеку.

Ах да, забыл, что divmod работает с отрицательными числами :)
Emigna

А также, это новая функциональность, Jне так ли? Никогда раньше такого не видел. Определенно может быть полезным.
Emigna

@Emigna Это описано как Join. Нажмите '' .join (a), если a является списком; Иначе, нажмите '.join (стек) . Я думаю, что это новая функциональность, хотя я никогда раньше не использовал J: P
Mr. Xcoder

Это определенно новый. Попробовал на моей локальной версии с августа и 5)6выдает ['5']6:)
Emigna

4

Алиса , 15 байт

/O.
\io/R%e,R:R

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

объяснение

Целочисленное деление Руби и модуль (по которому реализованы Алисы) определены так, что использование отрицательного делителя уже делает то, что мы хотим. Если мы отрицаем делитель, мы автоматически получим правильное значение по модулю и получим минус необходимое нам соотношение. Так что самый простой способ решить эту проблему - отрицать несколько чисел:

/   Switch to Ordinal mode.
i   Read all input as a string "e o".
.   Duplicate the string.
/   Switch to Cardinal mode.
R   Implicitly convert the top string to the two integer values it
    contains and negate o.
%   Compute e%-o.
e,  Swap the remainder with the other copy of the input string. We can't
    use the usual ~ for swapping because that would convert the string 
    to the two numbers first and we'd swap e%-o in between e and o instead
    of to the bottom of the string.
R   Negate o again.
:   Compute e/-o.
R   Negate the result again.
\   Switch to Ordinal mode.
O   Output -(e/-o) with a trailing linefeed.
o   Output e%-o.

    The code now bounces through the code for a while, not doing much except
    printing a trailing linefeed when hitting O again. Eventually, the IP
    reaches : and attempts a division by zero which terminates the program.


3

Юлия , 18 байт

x$y=.-fldmod(-x,y)

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

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



2

J , 16 байт

([-]*a),~a=.>.@%

По сути, это решение Mathematica от Jenny_mathy, переписанное в J.

Как это устроено:

a=.>.@% Находит потолок деления левого и правого аргументов и сохраняет его в переменную a

,~ соединены (обращены)

([-]*a) вычитает * правый аргумент из левого аргумента

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



2

Common Lisp, 7 байт

Встроенная функция ceilingвозвращает два значения: верхний коэффициент и остаток для сопоставления:

$ clisp -q
[1]> (ceiling 20 7)
3 ;
-1

2

JavaScript (ES6), 37 31 29 27 25 байт

Сохранено 2 байта благодаря @Rod
Сохранено 2 байта благодаря @ETHproductions

Принимает ввод в синтаксисе карри. Возвращает [q, r] .

a=>b=>[q=~-a/b+1|0,a-q*b]

Контрольные примеры


Вы можете, вероятно, q=(a+b-1)/b+|0вместо этогоq=a/b+.9|0
Род

@ETHproductions Звучит как план. ;)
Арно


1

4 , 55 50 байт

3.711712114001231311141130013513213131211513115154

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

Представляет напоминание в виде отрицания ( 10вместо -10), поскольку язык использует байтовый ввод и вывод, который считается действительным в комментарии OP.









0

TXR: 8 bytes

Built-in function ceil-rem. E.g. (ceil-rem 20 7) yields (7 -1).



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