Oblicz Upper Divmod

13

Zadanie

Biorąc pod uwagę dwie dodatnie liczby całkowite (divId e II i Divis O r) oblicz q uotient i r emainder.
Zwykle oblicza się to jako e = o*q+rgdzie q*o<=ei 0<=r<o.
Do tego wyzwania wciąż, e = o*q+rale q*o>=ei -o<r<=0.
Na przykład e=20i o=3zwykle byłoby tak 20/3 -> 20=3*6+2, ponieważ 18<=20i 0<=2<3. Tutaj będzie 20/3 -> 20=3*7-1gdzie 21>=20i-3<-1<=0

Przypadki testowe

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

Nie musisz się tym zajmować o=0.

Pręt
źródło
3
Nazwano to trywialnym wariantem zwykłego divmod.
Neil,
Czy jest akceptowalne wyjście rjako negacja języka rzeczywistego rdla języków, które używają niepodpisanych bajtów do przechowywania danych lub zakładają przepełnienie? ( -11/ 255)
Uriel
@Uriel tak, ale dodaj notatkę na ten temat do odpowiedzi
Rod

Odpowiedzi:

8

Python 3 , 39 26 bajtów

Martin Ender zapisał 13 bajtów

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

Wypróbuj online!

Python 2 , 25 bajtów

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

Wypróbuj online!

Halvard Hummel
źródło
Myślę, że możesz zrobić, x%-yżeby zdobyć resztę.
Martin Ender,
Właściwie dlaczego nie pójść na całość ...(-(x//-y),x%-y)
Martin Ender,
@MartinEnder To naprawdę dobre
Halvard Hummel,
@ Mr.Xcoder Zawiera oba
Halvard Hummel
8

Galaretka , 3 bajty

NdN

Wypróbuj online!

Jak to działa

Ponownie nadużywam divmod \ o /. Spójrz, nie ma unicode!

NdN - Pełny program / Łańcuch dynamiczny. | Przykład: 7, 20

N - Negacja pierwszego wejścia. | -7
 d - Divmod przez drugi. | [-1, 13]
  N - Neguj ponownie. | [1, -13]
Pan Xcoder
źródło
5

Mathematica, 21 bajtów

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

Wypróbuj online!

J42161217
źródło
Czy możesz dodać wyjaśnienie?
Rod
2
@Rod ⌈#/#2⌉oblicza pułap swojego podziału i przechowuje go w zmiennej s, a następnie odejmuje argument 2 * s od argumentu 1.
Pan Xcoder
1
@ Mr.Xcoder jesteś szybki!
J42161217,
5

05AB1E , 4 bajty

(s‰(

Wypróbuj online!

5 bajtów

(‰ćÄJ

Wypróbuj online!

Jak oni pracują

Nadużywa modulo Pythona! \ o /

(s ‰ (| Pełny program. Niech A i B będą dwoma wejściami. | Przykład: 100, 13.

(| Oblicz -A. | -100
 s | Zamień (w tym przypadku odwróć stos). | 13, -100
  ‰ | Divmod. | [-8, 4]
   (| Ujemne (w zasadzie pomnóż każdy przez -1). | [8, -4]

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

(‰ ćĘJ | Pełny program. Pobiera dane wejściowe w odwrotnej kolejności.

(| Negatywne. Naciśnij -A.
 ‰ | Divmod
  ć | Naciśnij głowę wyodrębniony divmod (ułóż stos [iloraz, [reszta]].
   Ę | Wartość bezwzględna (działa na ilorazie).
    J | Dołącz do stosu.
Pan Xcoder
źródło
Ach tak, zapomniałem, że divmod działa z liczbami ujemnymi :)
Emigna
A także, to nowa funkcjonalność, Jprawda? Nigdy wcześniej tego nie widziałem. Zdecydowanie może się przydać.
Emigna
@Emigna Jest opisany jako Dołącz. Naciśnij '' .join (a) jeśli lista jest listą; W przeciwnym razie wciśnij „.join (stos) . Myślę, że jest to nowa funkcjonalność, chociaż nigdy wcześniej jej nie używałem J: P
Mr. Xcoder
To zdecydowanie nowe. Próbowałem na mojej lokalnej wersji od sierpnia i 5)6daje ['5']6:)
Emigna
4

Alice , 15 bajtów

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

Wypróbuj online!

Wyjaśnienie

Podział liczb całkowitych i moduł Rubiego (na których zaimplementowane są Alicja) są zdefiniowane w taki sposób, że użycie dzielnika ujemnego już robi to, co chcemy. Jeśli zanegujemy dzielnik, automatycznie otrzymujemy poprawne modulo i otrzymujemy minus pożądany iloraz. Najłatwiejszym sposobem na rozwiązanie tego problemu jest zanegowanie szeregu liczb:

/   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.
Martin Ender
źródło
3

Julia , 18 bajtów

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

Wypróbuj online!

.-jest elementarną negacją i fldmodzwraca krotkę złożoną z wyników dywizji floored i odpowiadającej jej pozostałości.

Uriel
źródło
3

MATL , 5 4 bajtów

_&\_

Wypróbuj online!

-1 bajt dzięki Luis Mendo

      # 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
źródło
2

J , 16 bajtów

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

Jest to zasadniczo rozwiązanie Mathematica Jenny_mathy's przepisane w J.

Jak to działa:

a=.>.@% Znajduje pułap podziału argumentów lewego i prawego i przechowuje go w zmiennej a

,~ konkatenowane do (odwrócone)

([-]*a) odejmuje * lewy argument od prawego argumentu

Wypróbuj online!

Galen Iwanow
źródło
2

R , 31 29 bajtów

-2 bajty dzięki Giuseppe

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

Wypróbuj online!

użytkownik2390246
źródło
1
Myślę, że możesz zrobić 29 bajtów z-c(e%/%-o,-e%%o)
Giuseppe,
2

Common Lisp, 7 bajtów

Wbudowana funkcja ceilingzwraca dwie wartości: pułap ilorazu, a resztę dopasowuje:

$ clisp -q
[1]> (ceiling 20 7)
3 ;
-1
Kaz
źródło
2

JavaScript (ES6), 37 31 29 27 25 bajtów

Zaoszczędzono 2 bajty dzięki @Rod
Zaoszczędzono 2 bajty dzięki @ETHproductions

Pobiera dane wejściowe w składni curry. Zwraca [q, r] .

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

Przypadki testowe

Arnauld
źródło
Prawdopodobnie możesz q=(a+b-1)/b+|0zamiast tegoq=a/b+.9|0
Rod
@ETHproductions Brzmi jak plan. ;)
Arnauld,
1

4 , 55 50 bajtów

3.711712114001231311141130013513213131211513115154

Wypróbuj online!

Reprezentuje przypomnienie przez negację ( 10zamiast -10), ponieważ język używa bajtów na wejściu i wyjściu, uznanych za poprawne przez komentarz OP.

Uriel
źródło
1

Komentator , 90 bajtów

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

Wypróbuj online!

Zwraca resztę, a następnie iloraz nowej linii oddzielony.

Cairney Coheringaahing
źródło
0

C (gcc) , 43 bajty

f(x,y,z)int*x;{for(z=0;*x>0;*x-=y)z++;y=z;}

Stosowanie

main(){
    int a=7,b=20,c; 
    c=f(&a,b); 
    printf("%d %d\n",c,a);
}

Wypróbuj online!

Giacomo Garabello
źródło
0

C (gcc) 41 bajtów

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

Może to być oszustwo, korzystanie z dwóch funkcji i może nie powieść się w innych testach?

Wypróbuj online

PrincePolka
źródło
0

Szybki , 47 bajtów

func f(a:Int,b:Int){print((a+b-1)/b,(a%b-b)%b)}
Herman L.
źródło
0

SNOBOL4 (CSNOBOL4) , 124 123 105 bajtów

 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

Wypróbuj online!

Staje się jako wejście E, a następnie O, oddzielona od nowej linii i drukuje na zewnątrz Q, a następnie Roddzielone linią.

Giuseppe
źródło
0

TXR: 8 bajtów

Wbudowana funkcja ceil-rem. Np . (ceil-rem 20 7)Plony (7 -1).

Kaz
źródło
0

Najgorsze , 23 bajty

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

Wypróbuj online!

Jak to działa

@                       - Swap the inputs
 l0-                    - Negate
    %                   - Modulo
     z]                 - Push the inputs
       @                - Swap
        l0-             - Negate
           ,            - Integer divide
            l0-         - Negate
               @        - Swap
                l0-     - Negate
                   miE_ - Print
Cairney Coheringaahing
źródło