Tính toán Divmod trên


13

Bài tập

Cho hai số nguyên dương (chia e nd và divis o r), tính q uotient và r emainder.
Thông thường nó sẽ được tính là e = o*q+rở đâu q*o<=e0<=r<o.
Đối với thách thức này nó vẫn e = o*q+rnhưng q*o>=e-o<r<=0.
Ví dụe=20o=3, thông thường nó sẽ là 20/3 -> 20=3*6+2, kể từ 18<=200<=2<3. Đây sẽ là 20/3 -> 20=3*7-1nơi 21>=20-3<-1<=0

Các trường hợp thử nghiệm

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

Bạn không cần phải xử lý o=0 .


3
Được gọi là một biến thể tầm thường của divmod thông thường.
Neil

Có thể chấp nhận đầu ra rdưới dạng phủ định thực rcho các ngôn ngữ sử dụng byte không dấu để lưu trữ dữ liệu hoặc giả sử tràn? ( -11/ 255)
Uriel

@Uriel có, nhưng thêm một ghi chú về điều này vào câu trả lời
Rod

Câu trả lời:


8

Python 3 , 39 26 byte

Martin Ender đã lưu 13 byte

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

Hãy thử trực tuyến!

Python 2 , 25 byte

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

Hãy thử trực tuyến!


Tôi nghĩ bạn chỉ có thể làm x%-yđể có được phần còn lại.
Martin Ender

Thật ra, tại sao không đi hết con đường này ...(-(x//-y),x%-y)
Martin Ender

@MartinEnder Thats thực sự tốt
Halvard Hummel

@ Mr.Xcoder Bao gồm cả hai
Halvard Hummel

8

Thạch , 3 byte

NdN

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Lạm dụng divmod một lần nữa \ o /. Nhìn ma 'không có unicode!

NdN - Chương trình đầy đủ / Chuỗi Dyadic. | Ví dụ: 7, 20

N - Phủ định đầu vào đầu tiên. | -7
 d - Divmod bởi cái thứ hai. | [-1, 13]
  N - Phủ định mỗi lần nữa. | [1, -13]


5

Toán học, 21 byte

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

Hãy thử trực tuyến!


Bạn có thể thêm một lời giải thích, xin vui lòng?
Rod

2
@Rod ⌈#/#2⌉tính toán mức trần của bộ phận của họ và lưu trữ nó trong một biến svà sau đó trừ đối số 2 * s khỏi đối số 1.
Ông Xcoder

1
@ Mr.Xcoder bạn nhanh thật!
J42161217

5

05AB1E , 4 byte

(s‰(

Hãy thử trực tuyến!

5 byte

(‰ćÄJ

Hãy thử trực tuyến!

Chúng hoạt động như thế nào

Lạm dụng modulo của Python! \ o /

(s (| Chương trình đầy đủ. Gọi A và B là hai đầu vào. Ví dụ: 100, 13.

(| Tính -A. | -100
 s | Hoán đổi (đảo ngược ngăn xếp, trong trường hợp này). | 13, -100
  ‰ | Thần thánh. | [-8, 4]
   (| Phủ định (nhân từng số với -1, về cơ bản). | [8, -4]

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

(ĆÄJ | Chương trình đầy đủ. Đưa đầu vào theo thứ tự ngược lại.

(| Tiêu cực. Đẩy -A.
 ‰ | Thần thánh
  ć | Đẩy đầu divmod (tạo ngăn xếp [thương, [phần còn lại]].
   Ä | Giá trị tuyệt đối (hoạt động trên thương số).
    J | Tham gia ngăn xếp.

À đúng rồi, quên rằng divmod hoạt động với số âm :)
Emigna

Và ngoài ra, đó là chức năng mới của Jnó phải không?. Chưa bao giờ thấy điều đó trước đây. Chắc chắn có thể hữu ích.
Emigna

@Emigna Nó được mô tả là Tham gia. Nhấn '' .join (a) nếu a là danh sách; Khác, đẩy '' .join (ngăn xếp) . Tôi nghĩ đó là chức năng mới, mặc dù tôi chưa từng sử dụng Jtrước đây: P
Ông Xcoder

Nó chắc chắn là mới. Đã thử phiên bản địa phương của tôi từ tháng 8 và 5)6cho ['5']6:)
Emigna

4

Alice , 15 byte

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

Hãy thử trực tuyến!

Giải trình

Phân chia số nguyên của Ruby và modulo (trên đó Alice được triển khai) được định nghĩa sao cho sử dụng một ước số âm đã sắp xếp những gì chúng ta muốn. Nếu chúng tôi phủ nhận ước số, chúng tôi sẽ tự động lấy modulo chính xác và chúng tôi sẽ trừ đi thương số mà chúng tôi muốn. Vì vậy, cách dễ nhất để giải quyết điều này là bằng cách phủ định một loạt các số:

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

Hãy thử trực tuyến!

.-là phần tử phủ định khôn ngoan, và fldmodtrả về một tuple được tạo từ các kết quả của phép ẩn nổi và phần dư tương ứng.


3

MATL , 5 4 byte

_&\_

Hãy thử trực tuyến!

-1 byte nhờ 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=.>.@%

Đây thực chất là giải pháp Mathicala của Jenny_mathy được viết lại trong J.

Làm thế nào nó hoạt động:

a=.>.@% Tìm trần của sự phân chia các đối số trái và phải và lưu nó vào biến a

,~ nối với (đảo ngược)

([-]*a) trừ một đối số * bên phải từ đối số bên trái

Hãy thử trực tuyến!



2

Lisp thông thường, 7 byte

Hàm tích hợp ceilingtrả về hai giá trị: trần của thương số và phần còn lại để khớp:

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

2

JavaScript (ES6), 37 31 29 27 25 byte

Đã lưu 2 byte nhờ @Rod
Lưu 2 byte nhờ @ETHproductions

Đưa đầu vào theo cú pháp currying. Trả về [q, r] .

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

Các trường hợp thử nghiệm


q=(a+b-1)/b+|0Thay vào đó, bạn có thể có thểq=a/b+.9|0
Rod

@ETHproductions Nghe giống như một kế hoạch. ;)
Arnauld


1

4 , 55 50 byte

3.711712114001231311141130013513213131211513115154

Hãy thử trực tuyến!

Đại diện cho lời nhắc bằng cách phủ định ( 10thay vì -10), vì ngôn ngữ sử dụng đầu vào và đầu ra byte, được coi là hợp lệ bởi nhận xét OP.








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

Hãy thử trực tuyến!

Lấy đầu vào là E, sau đó O, được phân tách bằng một dòng mới và in ra Q, sau đó R, được phân tách bằng một dòng mới.


0

TXR: 8 byte

Chức năng tích hợp ceil-rem. Ví dụ (ceil-rem 20 7)sản lượng (7 -1).



Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.