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.


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

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]


5

Mathematica, 21 byte

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

Cobalah online!


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.

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.


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.


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


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!



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

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


Anda mungkin bisa q=(a+b-1)/b+|0sebagai gantinyaq=a/b+.9|0
Rod

@ ETHproductions Kedengarannya seperti sebuah rencana. ;)
Arnauld


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.






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



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.


0

TXR: 8 byte

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



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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.