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.


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

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]



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.

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.


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.


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


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!



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

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


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.






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



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ą.


0

TXR: 8 bajtów

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



Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.