Hitung Divmod Atas

13

Tugas

Mengingat dua bilangan bulat positif (divid e nd dan divis o r), menghitung q uotient dan r emainder.
Biasanya itu akan dihitung sebagai e = o*q+rmana q*o<=edan 0<=r<o.
Untuk tantangan ini, masih e = o*q+rtetapi q*o>=edan -o<r<=0.
Sebagai contoh e=20dan o=3, biasanya 20/3 -> 20=3*6+2, sejak 18<=20dan 0<=2<3. Ini dia akan 20/3 -> 20=3*7-1dimana 21>=20dan-3<-1<=0

Uji Kasus

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

Anda tidak perlu menangani o=0.

tongkat
sumber
3
Menyebutnya sebagai varian sepele dari divmod biasa.
Neil
Apakah dapat diterima rsebagai keluaran sebagai negasi dari yang nyata runtuk bahasa yang menggunakan byte yang tidak ditandatangani untuk menyimpan data atau menganggap meluap? ( -11/ 255)
Uriel
@Uriel ya, tapi tambahkan catatan tentang ini pada jawaban
Rod

Jawaban:

8

Python 3 , 39 26 byte

Martin Ender menyimpan 13 byte

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

Cobalah online!

Python 2 , 25 byte

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

Cobalah online!

Halvard Hummel
sumber
Saya pikir Anda bisa lakukan x%-yuntuk mendapatkan sisanya.
Martin Ender
Sebenarnya, mengapa tidak pergi jauh-jauh ...(-(x//-y),x%-y)
Martin Ender
@MartinEnder Thats really good
Halvard Hummel
@ Mr.Xcoder Termasuk keduanya
Halvard Hummel
8

Jelly , 3 byte

NdN

Cobalah online!

Bagaimana itu bekerja

Divmod penyalahgunaan lagi \ o /. Lihatlah, bukan unicode!

NdN - Program penuh / rantai Dyadic. | Contoh: 7, 20

N - Meniadakan input pertama. | -7
 d - Divmod oleh yang kedua. | [-1, 13]
  N - Negasikan lagi masing-masing. | [1, -13]
Tuan Xcoder
sumber
5

Mathematica, 21 byte

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

Cobalah online!

J42161217
sumber
Bisakah Anda menambahkan penjelasan?
Rod
2
@Rod ⌈#/#2⌉menghitung batas atas divisi mereka, dan menyimpannya dalam variabel s, dan kemudian mengurangi argumen 2 * dari argumen 1.
Mr. Xcoder
1
@ Mr.Xcoder Anda cepat!
J42161217
5

05AB1E , 4 byte

(s‰(

Cobalah online!

5 byte

(‰ćÄJ

Cobalah online!

Bagaimana mereka bekerja

Menyalahgunakan modulo Python! \Hai/

(s ‰ (| Program lengkap. Misalkan A dan B menjadi dua input. | Contoh: 100, 13.

(| Hitung -A. | -100
 s | Tukar (balikkan tumpukan, dalam hal ini). | 13, -100
  ‰ | Divmod. | [-8, 4]
   (| Negatif (kalikan masing-masing dengan -1, pada dasarnya). | [8, -4]

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

(‰ ćÄJ | Program lengkap. Mengambil input dalam urutan terbalik.

(| Negatif. Tekan -A.
 ‰ | Divmod
  ć | Dorong kepala diekstrak divmod (buat stack [quotient, [sisa]].
   Ä | Nilai absolut (beroperasi pada hasil bagi).
    J | Bergabunglah dengan tumpukan.
Tuan Xcoder
sumber
Ah ya, lupa bahwa divmod bekerja dengan angka negatif :)
Emigna
Dan juga, itu fungsionalitas baru Jbukan? Belum pernah melihat itu sebelumnya. Pasti bisa bermanfaat.
Emigna
@ Emigna Dijelaskan sebagai Gabung. Dorong '' .join (a) jika daftar is; Lain, tekan '' .join (susun) . Saya pikir ini adalah fungsionalitas baru, meskipun saya belum pernah menggunakan Jsebelumnya: P
Mr. Xcoder
Ini pasti baru. Mencoba versi lokal saya dari Agustus dan 5)6memberikan ['5']6:)
Emigna
4

Alice , 15 byte

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

Cobalah online!

Penjelasan

Divisi integer Ruby dan modulo (yang menerapkan Alice) didefinisikan sedemikian rupa sehingga menggunakan pembagi negatif sudah semacam melakukan apa yang kita inginkan. Jika kita meniadakan pembagi kita secara otomatis mendapatkan modulo yang benar, dan kita mendapatkan minus hasil bagi yang kita inginkan. Jadi cara termudah untuk menyelesaikan ini adalah dengan meniadakan banyak angka:

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

Julia , 18 byte

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

Cobalah online!

.-adalah elemen negasi yang bijaksana, dan fldmodmengembalikan tuple yang terbuat dari hasil pembagian lantai dan residu yang sesuai.

Uriel
sumber
3

MATL , 5 4 byte

_&\_

Cobalah online!

-1 byte terima kasih kepada 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
sumber
2

J , 16 byte

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

Ini pada dasarnya adalah solusi Mathematica Jenny_mathy yang ditulis ulang dalam J.

Bagaimana itu bekerja:

a=.>.@% Menemukan batas pembagian argumen kiri dan kanan dan menyimpannya ke dalam variabel a

,~ digabungkan ke (terbalik)

([-]*a) kurangi argumen * kanan dari argumen kiri

Cobalah online!

Galen Ivanov
sumber
2

R , 31 29 byte

-2 byte terima kasih kepada Giuseppe

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

Cobalah online!

pengguna2390246
sumber
1
Saya pikir Anda dapat melakukan byter 29 dengan-c(e%/%-o,-e%%o)
Giuseppe
2

Gangguan Umum, 7 byte

Fungsi ceilingbawaan mengembalikan dua nilai: langit-langit hasil bagi, dan sisanya untuk mencocokkan:

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

JavaScript (ES6), 37 31 29 27 25 byte

Disimpan 2 byte berkat @Rod
Disimpan 2 byte berkat @ETHproduksi

Mengambil input dalam sintaks currying. Mengembalikan [q, r] .

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

Uji kasus

Arnauld
sumber
Anda mungkin bisa q=(a+b-1)/b+|0sebagai gantinyaq=a/b+.9|0
Rod
@ ETHproductions Kedengarannya seperti sebuah rencana. ;)
Arnauld
1

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

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

Cobalah online!

Xcali
sumber
1

4 , 55 50 byte

3.711712114001231311141130013513213131211513115154

Cobalah online!

Merupakan pengingat oleh negasi itu ( 10bukan -10), karena bahasa menggunakan input dan output byte, dianggap valid oleh komentar OP.

Uriel
sumber
1

Komentator , 90 byte

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

Cobalah online!

Keluarkan sisanya, lalu hasil bagi, baris baru dipisahkan.

caird coinheringaahing
sumber
0

C (gcc) , 43 byte

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

Pemakaian

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

Cobalah online!

Giacomo Garabello
sumber
0

C (gcc) 41 byte

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

Ini mungkin curang, menggunakan dua fungsi dan mungkin gagal tes lainnya?

Cobalah online

PrincePolka
sumber
0

Swift , 47 byte

func f(a:Int,b:Int){print((a+b-1)/b,(a%b-b)%b)}
Herman L.
sumber
0

SNOBOL4 (CSNOBOL4) , 124 123 105 byte

 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

Cobalah online!

Mengambil input sebagai E, kemudian O, dipisahkan oleh baris baru dan mencetak Q, kemudian R, dipisahkan oleh baris baru.

Giuseppe
sumber
0

TXR: 8 byte

Fungsi bawaan ceil-rem. Misalnya (ceil-rem 20 7)hasil (7 -1).

Kaz
sumber
0

Deorst , 23 byte

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

Cobalah online!

Bagaimana itu bekerja

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