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.

Barre
la source
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

Python 3 , 39 26 octets

Martin Ender économisé 13 octets

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

Essayez-le en ligne!

Python 2 , 25 octets

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

Essayez-le en ligne!

Halvard Hummel
la source
Je pense que vous pouvez simplement faire x%-ypour obtenir le reste.
Martin Ender
En fait, pourquoi ne pas aller jusqu'au bout ...(-(x//-y),x%-y)
Martin Ender
@MartinEnder C'est vraiment bien
Halvard Hummel
@ Mr.Xcoder Inclus les deux
Halvard Hummel
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]
M. Xcoder
la source
5

Mathematica, 21 octets

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

Essayez-le en ligne!

J42161217
la source
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.
M. Xcoder
la source
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.
Martin Ender
la source
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.

Uriel
la source
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

Giuseppe
la source
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!

Galen Ivanov
la source
2

R , 31 29 octets

-2 octets grâce à Giuseppe

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

Essayez-le en ligne!

user2390246
la source
1
Je pense que vous pouvez faire un 29 byter avec-c(e%/%-o,-e%%o)
Giuseppe
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
Kaz
la source
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

Arnauld
la source
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.

Uriel
la source
1

Commentateur , 90 octets

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

Essayez-le en ligne!

Sort le reste, puis le quotient, la nouvelle ligne est séparée.

caird coinheringaahing
la source
0

C (gcc) , 43 octets

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

Usage

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

Essayez-le en ligne!

Giacomo Garabello
la source
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

PrincePolka
la source
0

Swift , 47 octets

func f(a:Int,b:Int){print((a+b-1)/b,(a%b-b)%b)}
Herman L
la source
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.

Giuseppe
la source
0

TXR: 8 octets

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

Kaz
la source
0

Deorst , 23 octets

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

Essayez-le en ligne!

Comment ça fonctionne

@                       - Swap the inputs
 l0-                    - Negate
    %                   - Modulo
     z]                 - Push the inputs
       @                - Swap
        l0-             - Negate
           ,            - Integer divide
            l0-         - Negate
               @        - Swap
                l0-     - Negate
                   miE_ - Print
caird coinheringaahing
la source