Calculer le Divmod supérieur


13

Tâche

Étant donné deux entiers positifs (div e e et divis o r), calculez le q uotient et le r emainder.
Normalement, il serait calculé comme e = o*q+rq*o<=eet 0<=r<o.
Pour ce défi encore e = o*q+rmais q*o>=eet -o<r<=0.
Par exemple, e=20et o=3, normalement, ce serait 20/3 -> 20=3*6+2, depuis 18<=20et 0<=2<3. Ici ce sera 20/3 -> 20=3*7-121>=20et-3<-1<=0

Cas de test

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

Vous n'avez pas besoin de gérer o=0.


3
Appelé cela comme une variante triviale du divmod régulier.
Neil

Est-il acceptable de produire rcomme négation du réel rpour les langues qui utilisent des octets non signés pour stocker des données ou supposent un débordement? ( -11/ 255)
Uriel

@Uriel oui, mais ajoutez une note à ce sujet sur la réponse
Rod

Réponses:



8

Gelée , 3 octets

NdN

Essayez-le en ligne!

Comment ça fonctionne

Abuser à nouveau de divmod \ o /. Regardez ma pas unicode!

NdN - Programme complet / Chaîne dyadique. | Exemple: 7, 20

N - Annulez la première entrée. | -sept
 d - Divmod par le second. | [-1, 13]
  N - Niez chacun à nouveau. | [1, -13]


5

Mathematica, 21 octets

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

Essayez-le en ligne!


Pouvez-vous ajouter une explication, s'il vous plaît?
Rod

2
@Rod ⌈#/#2⌉calcule le plafond de leur division, et le stocke dans une variable s, puis soustrait l'argument 2 * de l'argument 1.
M. Xcoder

1
@ Mr.Xcoder vous êtes rapide!
J42161217

5

05AB1E , 4 octets

(s‰(

Essayez-le en ligne!

5 octets

(‰ćÄJ

Essayez-le en ligne!

Comment ils travaillent

Abuse le modulo de Python! \ o /

(s ‰ (| Programme complet. Soit A et B les deux entrées. | Exemple: 100, 13.

(| Calculer -A. | -100
 s | Swap (inversez la pile, dans ce cas). | 13, -100
  ‰ | Divmod. | [-8, 4]
   (| Négatif (multipliez chacun par -1, en gros). | [8, -4]

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

(‰ ćÄJ | Programme complet. Prend la saisie dans l'ordre inverse.

(| Négatif. Appuyez sur -A.
 ‰ | Divmod
  ć | Poussez le divmod extrait de la tête (faites la pile [quotient, [reste]].
   Ä | Valeur absolue (fonctionne sur le quotient).
    J | Rejoignez la pile.

Ah oui, j'ai oublié que le divmod fonctionne avec des nombres négatifs :)
Emigna

Et aussi, c'est une nouvelle fonctionnalité de Jn'est-ce pas?. Jamais vu ça auparavant. Cela pourrait certainement être utile.
Emigna

@Emigna Il est décrit comme Join. Appuyez sur '' .join (a) si a is list; Sinon, appuyez sur '' .join (pile) . Je pense que c'est la nouvelle fonctionnalité, bien que je n'ai jamais utilisé Jauparavant: P
M. Xcoder

C'est définitivement nouveau. Essayé sur ma version locale d'août et 5)6donne ['5']6:)
Emigna

4

Alice , 15 octets

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

Essayez-le en ligne!

Explication

La division entière de Ruby et le module (sur lequel Alice est implémenté) sont définis de telle sorte que l'utilisation d'un diviseur négatif fait déjà en quelque sorte ce que nous voulons. Si nous annulons le diviseur, nous obtenons automatiquement le bon module, et nous obtenons moins le quotient que nous voulons. Donc, la façon la plus simple de résoudre ce problème est de nier un tas de nombres:

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

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

Essayez-le en ligne!

.-est une négation élément par élément et fldmodrenvoie un tuple composé des résultats de la division au sol et du résidu correspondant.


3

MATL , 5 4 octets

_&\_

Essayez-le en ligne!

-1 octet grâce à 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 octets

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

Il s'agit essentiellement de la solution Mathematica de Jenny_mathy réécrite en J.

Comment ça fonctionne:

a=.>.@% Trouve le plafond de la division des arguments gauche et droit et le stocke dans la variable a

,~ concaténé en (inversé)

([-]*a) soustrait un argument * droit de l'argument gauche

Essayez-le en ligne!



2

Lisp commun, 7 octets

La fonction intégrée ceilingrenvoie deux valeurs: le plafond du quotient et le reste correspondant:

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

2

JavaScript (ES6), 37 31 29 27 25 octets

2 octets enregistrés grâce à @Rod
2 octets enregistrés grâce à @ETHproductions

Prend des entrées dans la syntaxe de curry. Renvoie [q, r] .

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

Cas de test


Vous pouvez probablement à la q=(a+b-1)/b+|0placeq=a/b+.9|0
Rod

@ETHproductions Sonne comme un plan. ;)
Arnauld


1

4 , 55 50 octets

3.711712114001231311141130013513213131211513115154

Essayez-le en ligne!

Représente le rappel par sa négation ( 10au lieu de -10), car le langage utilise des entrées et des sorties d'octets, jugées valides par le commentaire OP.






0

C (gcc) 41 octets

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

Cela peut être de la triche, en utilisant deux fonctions et cela peut échouer à d'autres tests?

Essayez-le en ligne



0

SNOBOL4 (CSNOBOL4) , 124 123 105 octets

 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

Essayez-le en ligne!

Prend l'entrée comme E, puis O, séparé par un retour à la ligne et imprime Q, puis R, séparé par un retour à la ligne.


0

TXR: 8 octets

Fonction intégrée ceil-rem. Par exemple, les (ceil-rem 20 7)rendements (7 -1).



En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.