Üst Divmodu Hesapla


13

Görev

Verilen iki pozitif tamsayı (divid e nd ve divis o r) hesaplamak q uotient ve R emainder.
Normalde e = o*q+rnerede q*o<=eve olarak hesaplanır 0<=r<o.
Bu meydan okuma için hala e = o*q+rama q*o>=eve -o<r<=0.
Örneğin e=20ve o=3normalde 20/3 -> 20=3*6+2, 18<=20ve 0<=2<3. İşte 20/3 -> 20=3*7-1nerede olacak 21>=20ve-3<-1<=0

Test Durumları

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

Ele almanıza gerek yok o=0.


3
Düzenli divmodun önemsiz bir varyantı olarak adlandırdı.
Neil

Verileri depolamak veya taşmayı kabul etmek için imzasız bayt kullanan diller riçin gerçekliğin reddi olarak çıktı almak kabul edilebilir rmi? ( -11/ 255)
Uriel

@Uriel evet, ama cevap üzerine bir not ekleyin
Rod

Yanıtlar:



8

Jöle , 3 bayt

NdN

Çevrimiçi deneyin!

Nasıl çalışır

Divmod'u tekrar kötüye kullanma \ o /. Bak unicode yok!

NdN - Tam program / Çift zincir. | Örnek: 7, 20

N - İlk girişi sıralayın. | -7
 d - İkincisi tarafından divmod. | [-1, 13]
  N - Her birini tekrar birleştirin. | [1, -13]


5

Mathematica, 21 bayt

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

Çevrimiçi deneyin!


Bir açıklama ekleyebilir misiniz, lütfen?
Çubuk

2
@ Çubuk ⌈#/#2⌉, bölümlerinin tavanını hesaplar ve bir değişkende saklar sve daha sonra 2 * s argümanını 1 argümanından çıkarır.
Bay Xcoder

1
@ Mr.Xcoder hızlısınız!
J42161217

5

05AB1E , 4 bayt

(s‰(

Çevrimiçi deneyin!

5 bayt

(‰ćÄJ

Çevrimiçi deneyin!

Onlar nasıl çalışır

Python'un modulo'unu kötüye kullanıyor! \Ö/

(s ‰ (| Tam program. A ve B iki giriş olsun. | Örnek: 100, 13.

(| Compute -A. | -100
 s | Takas edin (bu durumda yığını ters çevirin). | 13, -100
  ‰ | Divmod. | [-8, 4]
   (| Negatif (temel olarak her birini -1 ile çarpın). | [8, -4]

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

(‰ ćÄJ | Tam program. Girişi ters sırada alır.

(| Olumsuz. Push -A.
 ‰ | Divmod
  ć | Kafa çıkarılan divmod itin (yığını [bölüm, [kalan]] olun.
   Ä | Mutlak değer (bölüm üzerinde çalışır).
    J | Yığına katılın.

Ah evet, divmodun negatif sayılarla çalıştığını unuttum :)
Emigna

Ayrıca, bu yeni bir işlevsellik Jdeğil mi? Daha önce hiç görmedim. Kesinlikle faydalı olabilir.
Emigna

@Emigna Join olarak tanımlanır . A listeyse '' .join (a) öğesine basın; Aksi takdirde, '' düğmesine basın . Daha Jönce hiç kullanmamış olmama rağmen yeni işlevsellik olduğunu düşünüyorum : P
Bay Xcoder

Kesinlikle yeni. Ağustos ayındaki yerel versiyonumda denedim ve 5)6verir ['5']6:)
Emigna

4

Alice , 15 bayt

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

Çevrimiçi deneyin!

açıklama

Ruby'nin tamsayı bölümü ve modulo (Alice'in uygulandığı) tanımlanır, böylece negatif bir bölen kullanmak zaten bir tür istediğimizi yapar. Böleni reddedersek, otomatik olarak doğru modüloyu alırız ve eksi istediğimiz bölümü elde ederiz. Yani bunu çözmenin en kolay yolu bir grup sayıyı reddedmektir:

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

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

Çevrimiçi deneyin!

.-element akıllıca olumsuzluktur ve fldmoddöşenmiş bölme ve ilgili kalıntıların sonuçlarından oluşan bir demet döndürür.


3

MATL , 5 4 bayt

_&\_

Çevrimiçi deneyin!

Luis Mendo sayesinde -1 bayt

      # 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 bayt

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

Bu esasen, J'de yeniden yazılmış Jenny_mathy'nin Mathematica çözümüdür.

Nasıl çalışır:

a=.>.@% Sol ve sağ argümanların bölümünün tavanını bulur ve bunu değişken a

,~ birleştirilmiş (ters çevrilmiş)

([-]*a) * sağ argümanını sol argümandan çıkarır

Çevrimiçi deneyin!



2

Ortak Lisp, 7 bayt

Yerleşik işlev ceilingiki değer döndürür: bölümün tavanı ve eşleşecek kalan kısım:

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

2

JavaScript (ES6), 37 31 29 27 25 bayt

@Rod sayesinde 2 bayt kaydedildi @ETHproductions
sayesinde 2 bayt kaydedildi

Currying sözdiziminde girdi alır. [Q, r] değerini döndürür .

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

Test senaryoları


Muhtemelen q=(a+b-1)/b+|0bunun yerineq=a/b+.9|0
Rod

@ETHproductions Bir plan gibi geliyor. ;)
Arnauld


1

4 , 55 50 bayt

3.711712114001231311141130013513213131211513115154

Çevrimiçi deneyin!

Dil, OP yorumu tarafından geçerli kabul edilen bayt giriş ve çıkışını kullandığından hatırlatıcıyı olumsuzlama ( 10yerine -10) ile temsil eder .








0

SNOBOL4 (CSNOBOL4) , 124 123 105 bayt

 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

Çevrimiçi deneyin!

Olarak girişi alır E, daha sonra O, bir satır ve baskılar üzerinden ayrılmış Q, daha sonra R, bir satır ile ayrılmıştır.


0

TXR: 8 bayt

Dahili fonksiyon ceil-rem. Örneğin (ceil-rem 20 7)verim (7 -1).



Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.