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.


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

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]


5

Mathematica, 21 bytes

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

Experimente online!


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.

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.


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.


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


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!



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

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


Você provavelmente pode em q=(a+b-1)/b+|0vez dissoq=a/b+.9|0
Rod

@ETHproductions Parece um plano. ;)
Arnauld 12/12


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.






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



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.


0

TXR: 8 bytes

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



Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.