Calcular o Divmod superior

13

Tarefa

Dado dois inteiros positivos (divid e nd e divis de o r), calcular o q uotient e o r emainder.
Normalmente, seria calculado como e = o*q+ronde q*o<=ee 0<=r<o.
Para este desafio ainda, e = o*q+rmas q*o>=ee -o<r<=0.
Por exemplo e=20e o=3, normalmente 20/3 -> 20=3*6+2, desde 18<=20e 0<=2<3. Aqui será 20/3 -> 20=3*7-1onde 21>=20e-3<-1<=0

Casos de teste

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

Você não precisa lidar o=0.

Cajado
fonte
3
Chamou-o por ser uma variante trivial do divmod regular.
11117 Neil
É aceitável exibir rcomo negação do real rpara idiomas que usam bytes não assinados para armazenar dados ou assumir transbordamento? ( -11/ 255)
Uriel
@Uriel sim, mas acrescentar uma nota sobre isso na resposta
Rod

Respostas:

8

Python 3 , 39 26 bytes

Martin Ender salvou 13 bytes

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

Experimente online!

Python 2 , 25 bytes

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

Experimente online!

Halvard Hummel
fonte
Eu acho que você pode apenas fazer x%-ypara obter o restante.
Martin Ender
Na verdade, por que não ir até o fim ...(-(x//-y),x%-y)
Martin Ender
@MartinEnder Isso é realmente bom
Halvard Hummel
@ Mr.Xcoder Incluiu ambos
Halvard Hummel
8

Geléia , 3 bytes

NdN

Experimente online!

Como funciona

Abusando do divmod novamente \ o /. Olha ma 'nenhum unicode!

NdN - Programa completo / Cadeia diádica. | Exemplo: 7, 20

N - negue a primeira entrada. | -7
 d - Divmod pelo segundo. | [-1, 13]
  N - Negue cada um novamente. | [1, -13]
Mr. Xcoder
fonte
5

Mathematica, 21 bytes

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

Experimente online!

J42161217
fonte
Você pode adicionar uma explicação, por favor?
Rod
2
O @Rod ⌈#/#2⌉calcula o teto de sua divisão e o armazena em uma variável se, em seguida, subtrai o argumento 2 * s do argumento 1.
Sr. Xcoder
1
@ Mr.Xcoder você é rápido!
J42161217
5

05AB1E , 4 bytes

(s‰(

Experimente online!

5 bytes

(‰ćÄJ

Experimente online!

Como eles trabalham

Abusa do módulo do Python! \ o /

(s ‰ (| Programa completo. Sejam A e B as duas entradas. | Exemplo: 100, 13.

(| Computar -A. | -100
 s Trocar (inverter a pilha, neste caso). | 13, -100
  ‰ Divmod. | [-8,4]
   (| Negativo (multiplique cada por -1, basicamente). | [8, -4]

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

(‰ ćÄJ | Programa completo. Leva a entrada em ordem inversa.

(| Negativo. Pressione -A.
 ‰ Divmod
  ć Divmod extraído da cabeça de empurrar (faça a pilha [quociente, [restante]]].
   Ä Valor absoluto (opera no quociente).
    J Junte-se à pilha.
Mr. Xcoder
fonte
Ah, sim, esqueci que o divmod funciona com números negativos :) #
1111 Emigna
E também, essa é uma nova funcionalidade, Jnão é? Nunca vi isso antes. Definitivamente poderia ser útil.
Emigna
@ Emigna É descrito como Participar. Pressione '' .join (a) se a for uma lista; Caso contrário, pressione '' .join (pilha) . Eu acho que é a nova funcionalidade, embora eu nunca tenha usado Jantes: P
Mr. Xcoder 11/11
É definitivamente novo. Tentei na minha versão local a partir de agosto e 5)6['5']6:) #
1111 Emigna
4

Alice , 15 bytes

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

Experimente online!

Explicação

A divisão inteira e o módulo de Ruby (nos quais Alice é implementada) são definidos de tal forma que o uso de um divisor negativo já faz o que queremos. Se negamos o divisor, obtemos automaticamente o módulo correto e menos o quociente que queremos. Portanto, a maneira mais fácil de resolver isso é negando vários números:

/   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
fonte
3

Julia , 18 bytes

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

Experimente online!

.-é uma negação sábia do elemento e fldmodretorna uma tupla feita com os resultados da divisão no piso e resíduo correspondente.

Uriel
fonte
3

MATL , 5 4 bytes

_&\_

Experimente online!

-1 byte graças a 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
fonte
2

J , 16 bytes

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

Esta é essencialmente a solução Mathematica de Jenny_mathy, reescrita em J.

Como funciona:

a=.>.@% Encontra o teto da divisão dos argumentos esquerdo e direito e o armazena na variável a

,~ concatenado para (invertido)

([-]*a) subtrai um argumento * direito do argumento esquerdo

Experimente online!

Galen Ivanov
fonte
2

R , 31 29 bytes

-2 bytes graças a Giuseppe

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

Experimente online!

user2390246
fonte
1
Eu acho que você pode fazer um Byter 29 com-c(e%/%-o,-e%%o)
Giuseppe
2

Lisp comum, 7 bytes

A função ceilinginterna retorna dois valores: o teto do quociente e o restante para corresponder:

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

JavaScript (ES6), 37 31 29 27 25 bytes

Guardado 2 bytes graças a @Rod
Economizou 2 bytes graças a @ETHproductions

Recebe entrada na sintaxe de currying. Retorna [q, r] .

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

Casos de teste

Arnauld
fonte
Você provavelmente pode em q=(a+b-1)/b+|0vez dissoq=a/b+.9|0
Rod
@ETHproductions Parece um plano. ;)
Arnauld 12/12
1

Perl 5 , 30 + 1 ( -p) = 31 bytes

say+($_-($\=$_%-($"=<>)))/$"}{

Experimente online!

Xcali
fonte
1

4 , 55 50 bytes

3.711712114001231311141130013513213131211513115154

Experimente online!

Representa o lembrete por sua negação (em 10vez de -10), pois o idioma usa entrada e saída de bytes, considerada válida pelo comentário do OP.

Uriel
fonte
1

Comentador , 90 bytes

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

Experimente online!

Gera o restante e, em seguida, o quociente, nova linha separada.

caird coinheringaahing
fonte
0

C (gcc) , 43 bytes

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

Uso

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

Experimente online!

Giacomo Garabello
fonte
0

C (gcc) 41 bytes

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

Isso pode ser trapaça, usando duas funções e pode falhar em outros testes?

Experimente online

PrincePolka
fonte
0

Rápido , 47 bytes

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

Experimente online!

Recebe a entrada como E, então O, separada por uma nova linha e imprime Q, então R, separada por uma nova linha.

Giuseppe
fonte
0

TXR: 8 bytes

Função incorporada ceil-rem. Por exemplo, (ceil-rem 20 7)rendimentos (7 -1).

Kaz
fonte
0

Deorst , 23 bytes

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

Experimente online!

Como funciona

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