Berechne den oberen Divmod


13

Aufgabe

Gegeben seien zwei positive ganze Zahlen (divid e nd und divis o r), berechnen die q uotient und die r emainder.
Normalerweise würde es als e = o*q+rwo q*o<=eund berechnet werden 0<=r<o.
Für diese Herausforderung gibt es e = o*q+raber noch q*o>=eund -o<r<=0.
Zum Beispiel e=20und o=3normalerweise wäre es 20/3 -> 20=3*6+2, da 18<=20und 0<=2<3. Hier wird es 20/3 -> 20=3*7-1wo 21>=20und sein-3<-1<=0

Testfälle

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

Du musst nicht damit umgehen o=0.


3
Nannte es eine triviale Variante des regulären Divmod.
Neil

Ist es akzeptabel, rals Negation des Realwerts rfür Sprachen auszugeben , die vorzeichenlose Bytes verwenden, um Daten zu speichern oder einen Überlauf anzunehmen? ( -11/ 255)
Uriel

@Uriel ja, aber fügen Sie einen Hinweis dazu in die Antwort ein
Rod

Antworten:



8

Gelee , 3 Bytes

NdN

Probieren Sie es online!

Wie es funktioniert

Missbrauche divmod nochmal \ o /. Schau ma 'kein Unicode!

NdN - Volles Programm / Dyadische Kette. | Beispiel: 7, 20

N - Negiere die erste Eingabe. | -7
 d - Divmod durch den zweiten. | [-1, 13]
  N - Negiere erneut. | [1, -13]


5

Mathematica, 21 Bytes

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

Probieren Sie es online!


Können Sie bitte eine Erklärung hinzufügen?
Rod

2
@Rod ⌈#/#2⌉berechnet die Obergrenze ihrer Division, speichert sie in einer Variablen sund subtrahiert dann Argument 2 * s von Argument 1.
Mr. Xcoder,

1
@ Mr.Xcoder du bist schnell!
J42161217

5

05AB1E , 4 Bytes

(s‰(

Probieren Sie es online!

5 Bytes

(‰ćÄJ

Probieren Sie es online!

Wie sie arbeiten

Missbrauch von Pythons Modulo! \Ö/

(s ‰ (| Volles Programm. Sei A und B die beiden Eingänge. | Beispiel: 100, 13.

(| Berechne -A. | -100
 s | Swap (in diesem Fall den Stapel umkehren). | 13, -100
  ‰ | Divmod. | [-8, 4]
   (| Negativ (im Grunde genommen jeweils mit -1 multiplizieren) | [8, -4]

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

(‰ ćÄJ | Volles Programm. Nimmt die Eingabe in umgekehrter Reihenfolge vor.

(| Negativ. Drücken Sie -A.
 ‰ | Divmod
  ć | Drücken Sie den mit dem Kopf extrahierten DivMod (machen Sie den Stapel [Quotient, [Rest]].
   Ä | Absolutwert (arbeitet mit dem Quotienten).
    J | Verbinden Sie den Stapel.

Ach ja, habe vergessen, dass der Divmod mit negativen Zahlen arbeitet :)
Emigna

Und das ist auch die neue Funktionalität von, Jnicht wahr ?. Das habe ich noch nie gesehen. Könnte auf jeden Fall nützlich sein.
Emigna

@Emigna Es wird als Join beschrieben. Drücken Sie '' .join (a), wenn a eine Liste ist. Andernfalls drücken Sie '' .join (Stapel) . Ich denke, es ist die neue Funktionalität, die ich noch nie benutzt habe J: P
Mr. Xcoder

Es ist definitiv neu. Versucht auf meine lokale Version von August und 5)6gibt ['5']6:)
Emigna

4

Alice , 15 Bytes

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

Probieren Sie es online!

Erläuterung

Rubys Integer Division und Modulo (auf denen Alice implementiert ist) sind so definiert, dass die Verwendung eines negativen Divisors bereits sozusagen das tut, was wir wollen. Wenn wir den Divisor negieren, erhalten wir automatisch das richtige Modulo und wir erhalten minus dem Quotienten, den wir wollen. Der einfachste Weg, dies zu lösen, besteht darin, eine Reihe von Zahlen zu negieren:

/   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 Bytes

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

Probieren Sie es online!

.-ist eine elementweise Negation und fldmodgibt ein Tupel aus den Ergebnissen der Bodendivision und den entsprechenden Resten zurück.


3

MATL , 5 4 Bytes

_&\_

Probieren Sie es online!

-1 Byte dank 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 Bytes

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

Dies ist im Wesentlichen die Mathematica-Lösung von Jenny_mathy, die in J umgeschrieben wurde.

Wie es funktioniert:

a=.>.@% Findet die Obergrenze der Aufteilung der linken und rechten Argumente und speichert sie in der Variablen a

,~ verkettet zu (umgekehrt)

([-]*a) Subtrahiert ein * rechtes Argument vom linken Argument

Probieren Sie es online!



2

Common Lisp, 7 Bytes

Die integrierte Funktion ceilinggibt zwei Werte zurück: die Obergrenze des Quotienten und den Rest der Übereinstimmung:

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

2

JavaScript (ES6), 37 31 29 27 25 Byte

2 Bytes dank @Rod
gespeichert 2 Bytes dank @ETHproductions gespeichert

Übernimmt Eingaben in der Currying-Syntax. Gibt [q, r] zurück .

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

Testfälle


Sie können wahrscheinlich q=(a+b-1)/b+|0stattdessenq=a/b+.9|0
Rod

@ETHproductions Klingt nach einem Plan. ;)
Arnauld


1

4 , 55 50 Bytes

3.711712114001231311141130013513213131211513115154

Probieren Sie es online!

Stellt die Erinnerung durch ihre Negation dar ( 10anstelle von -10), da die Sprache die Byte-Eingabe und -Ausgabe verwendet, die durch den OP-Kommentar als gültig erachtet wird.








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

Probieren Sie es online!

Nimmt als Eingabe E, dann Ogetrennt, durch eine neue Zeile und druckt Q, dann R, durch eine neue Zeile getrennt werden .


0

TXR: 8 Bytes

Eingebaute Funktion ceil-rem. ZB (ceil-rem 20 7)ergibt (7 -1).



Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.