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

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]
Мистер Xcoder
источник
5

Mathematica, 21 байт

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

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

J42161217
источник
Можете ли вы добавить объяснение, пожалуйста?
Род
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 | Присоединяйтесь к стеку.
Мистер Xcoder
источник
Ах да, забыл, что 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возвращает кортеж, составленный из результатов промежуточного деления и соответствующего остатка.

Уриэль
источник
3

MATL , 5 4 байта

_&\_

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

-1 байт благодаря Луису Мендо

      # implicit input
_     # unary minus (negates first input, o)
&\    # alternative output mod, returns remainder, quotient, implicitly takes e
_     # unary minus, takes the opposite of the quotient.
      # implicit output, prints stack as remainder
                                         quotient

Giuseppe
источник
2

J , 16 байт

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

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

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

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

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

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

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

Гален Иванов
источник
2

R , 31 29 байт

-2 байта благодаря Джузеппе

function(e,o)-c(e%/%-o,-e%%o)

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

user2390246
источник
1
Я думаю, что вы можете сделать 29 байтов с-c(e%/%-o,-e%%o)
Джузеппе
2

Common Lisp, 7 байт

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

$ clisp -q
[1]> (ceiling 20 7)
3 ;
-1
Kaz
источник
2

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

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

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

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

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

Arnauld
источник
Вы можете, вероятно, q=(a+b-1)/b+|0вместо этогоq=a/b+.9|0
Род
@ETHproductions Звучит как план. ;)
Арно
1

4 , 55 50 байт

3.711712114001231311141130013513213131211513115154

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

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

Уриэль
источник
1

Commentator, 90 bytes

//
;{- -}
{-{-//-}e#<!-}
;{-{-{- -}-}-}
{-{-{-e#-}
;{-{- -}-}
{-%e#*/-}#          /*-}e#*/

Try it online!

Outputs the remainder, then the quotient, newline separated.

caird coinheringaahing
источник
0

C (gcc) 41 bytes

f(a,b){b=(a+b-1)/b;}g(a,b){b=a-f(a,b)*b;}

This may be cheating, using two functions and it may fail other tests?

Try it online

PrincePolka
источник
0

SNOBOL4 (CSNOBOL4), 124 123 105 bytes

 E =INPUT
 O =INPUT
 Q =E / O
 R =E - Q * O
 EQ(0,R) :S(A)
 R =R - O
 Q =Q + 1
A OUTPUT =Q
 OUTPUT =R
END

Try it online!

Takes input as E, then O, separated by a newline and prints out Q, then R, separated by a newline.

Giuseppe
источник
0

TXR: 8 bytes

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

Kaz
источник
0

Deorst, 23 bytes

@l0-%z]@l0-,l0-@l0-miE_

Try it online!

How it works

@                       - Swap the inputs
 l0-                    - Negate
    %                   - Modulo
     z]                 - Push the inputs
       @                - Swap
        l0-             - Negate
           ,            - Integer divide
            l0-         - Negate
               @        - Swap
                l0-     - Negate
                   miE_ - Print
caird coinheringaahing
источник