Tính mô đun nghịch đảo


18

Nhiệm vụ:

Xuất ra một giá trị cho x, trong đó a mod x = bcho hai giá trị đã cho a,b.

Giả thiết

  • absẽ luôn là số nguyên dương
  • Sẽ không bao giờ có một giải pháp cho x
  • Nếu nhiều giải pháp tồn tại, đầu ra ít nhất một trong số chúng.
  • Nếu không có bất kỳ giải pháp nào, đầu ra không có gì hoặc một số dấu hiệu cho thấy không có giải pháp nào tồn tại.
  • Tích hợp được cho phép (không thú vị như các phương pháp toán học khác)
  • Đầu ra luôn là số nguyên

Ví dụ

A, B >> POSSIBLE OUTPUTS

5, 2 >> 3
9, 4 >> 5
8, 2 >> 3, 6
6, 6 >> 7, (ANY NUMBER > 6)
8, 7 >> NO SOLUTION
2, 4 >> NO SOLUTION
8, 5 >> NO SOLUTION
10,1 >> 3, 9

Đây là , vì vậy byte thấp nhất sẽ thắng.


Nó có thể lỗi nếu không tìm thấy giải pháp?
vỗ tay

@ConfuseMr_C Về mặt kỹ thuật không chỉ ra giải pháp, nên có.
Graviton

Câu trả lời:


11

JavaScript , 28 27 26 24 23 byte

a=>b=>(a-=b)?a>b&&a:b+1

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

false chỉ ra không có giải pháp.

-1 cảm ơn @Arnauld


Hoàn thành tốt và chơi golf độc đáo.
Xù xì

Vì vậy, để gọi nó, bạn cần đặt tên hàm ngoài, nói f=..., sau đó gọi f(8)(3)? Điều đó có vẻ hơi gian lận? Cách thông thường để gọi một hàm sẽ là f(8,3), điều này sẽ làm cho định nghĩa hàm của bạn dài hơn?
Steve Bennett

3
@SteveBennett Đúng vậy, định nghĩa là cà ri , có nghĩa là nó phải được gọi như (8)(3), nhưng có một sự đồng thuận về PPCG rằng đó là cho phép . Bạn không cần phải đặt tên cho nó.
eush77

1
@SteveBennett Thật thú vị khi bạn nghĩ 26 so với -15 là bất cứ điều gì ngoài sự đồng thuận rõ ràng. Chúc may mắn cố gắng tranh chấp.
eush77

1
@SteveBennett làm thế nào là 55 đến 1 sự đồng thuận yếu?
Cyoce




3

Groovy, 48 byte (sử dụng tích hợp):

{a,b->Eval.me(a+"g").modInverse(Eval.me(b+"g"))}

Eval.me(...+"g") - Đóng "g" vào đầu vào, biến nó thành BigInteger.

modInverse(...) - Thực hiện thao tác modulo nghịch đảo.


Java 8, 70 byte

{a,b->return BigInteger.valueOf(a).modInverse(BigInteger.valueOf(b));}

3

R , 33 28 byte

pryr::f(match(b,a%%1:(a+1)))

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

-4 byte nhờ Jarko Dubbeldam.

-1 byte nhờ Giuseppe.

Trả về NAnếu không có giải pháp. TIO không cài đặt thư viện pryr, vì vậy mã tại liên kết đó sử dụng function(a,b)thay thế.


pryr::f(which(a%%1:(a+1)==b)) ngắn hơn 4 byte.
JAD

bạn cũng có thể loại bỏ một byte khác bằng cách sử dụng match(b,a%%1:(a+1)), nó trả về NAmột giá trị bị thiếu.
Giuseppe


1

Toán học 36 byte

a_±b_:=Select[Range[9a],a~Mod~#==b&]

Đầu vào:

5 ± 2
9 ± 4
8 ± 2
6 ± 6
8 ± 7
2 ± 4
8 ± 5
10 ± 1

Đầu ra:

{3}
{5}
{3, 6}
{7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, \
25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, \
42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54}
{}
{}
{}
{3, 9}

Khi sử dụng các toán tử ASCII mở rộng này ở dạng nhị phân, chúng cần một khoảng trắng ở phía trước khi được xác định, nếu không trình phân tích cú pháp sẽ đưa ra lỗi. Vì vậy, nó sẽ phải được a_ ±b_. Nhưng dù sao nó cũng ngắn hơn để sử dụng Casesthay vì Selectmột chức năng chưa được đặt tên:Cases[Range[9#],x_/;#~Mod~x==#2]&
Martin Ender

1

Haskell , 33 byte

Sự cố với code.hs: out of memory (requested ??? bytes)nếu không có giải pháp (hết thời gian trên TIO trước đó):

a!b=[x|x<-[b+1..],mod(a-b)x<1]!!0

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

Cảm ơn tại Ørjan Johansen vì đã phát hiện ra một sai lầm!


Điều này đưa ra câu trả lời sai cho các trường hợp thử nghiệm trong đó bphân chia a.
janrjan Johansen

1

C # (trình biên dịch Mono C #) , 57 56 26 byte

Câu trả lời Python của cảng Rod . Cảm ơn WW cho -1 byte.

TUYỆT VỜI nhờ Kevin Cruijssen cho -30 byte.

a=>b=>a-b>b?a-b:a==b?a+1:0

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


1
Chào mừng đến với trang web! Có vẻ như bạn có thể loại bỏ không gian sau return.
Thuật sĩ lúa mì

Chào mừng đến với PPCG! Đối với các câu trả lời C # không đệ quy, luôn luôn tốt nhất và ngắn nhất để sử dụng hàm lambda ( i=>{/*code here*/}). Tuy nhiên, trong trường hợp này, vì bạn có 2 đầu vào, nó có thể là hàm lambda để lưu một byte bổ sung ( a=>b=>{/*code here*/}thay vì (a,b)=>{/*code here*/}). Ngoài ra, bạn có thể xóa dấu ngoặc đơn xung quanh kiểm tra if của bạn. Tổng cộng, không thay đổi bất kỳ chức năng nào của bạn, nó trở thành a=>b=>a-b>b?a-b:a==b?a+1:0 26 byte
Kevin Cruijssen

Ngoài ra, nếu bạn chưa nhìn thấy nó, Mẹo chơi golf bằng <tất cả các ngôn ngữ>Mẹo chơi gôn trong C # có thể rất thú vị để đọc qua. Tận hưởng kì nghỉ của bạn! :)
Kevin Cruijssen

Cảm ơn tất cả các bạn về những lời khuyên, tôi sẽ ghi nhớ những điều này khi chơi golf trong tương lai.
Sử thi





0

Tiên đề, 147 128 byte

g(a:PI,c:PI):Union(List PI,Stream INT)==(a<c=>[];r:=a-c;r=0=>expand((a+1..)::UniversalSegment INT);[b for b in divisors(r)|b>c])

ungolf nó và kiểm tra

--a%b=c return all possible b
f(a:PI,c:PI):Union(List PI, Stream INT)==
    a<c=>[]
    r:=a-c
    r=0=>expand((a+1..)::UniversalSegment INT)
    [b  for b in divisors(r)|b>c]

(3) -> [[i,j,g(i,j)] for i in [5,9,8,6,8,2,8,10] for j in [2,4,2,6,7,4,5,1]]
   (3)
   [[5,2,[3]], [9,4,[5]], [8,2,[3,6]], [6,6,[7,8,9,10,11,12,13,14,15,16,...]],
    [8,7,[]], [2,4,[]], [8,5,[]], [10,1,[3,9]]]
                                                      Type: List List Any

Điều này sẽ tìm thấy tất cả các giải pháp ngay cả giải pháp thiết lập vô hạn ...


0

Pip , 9 byte

a%,a+2@?b

Lấy hai số làm đối số dòng lệnh. Xuất ra giải pháp nhỏ nhất, hoặc không nếu không có giải pháp tồn tại. Hãy thử trực tuyến!

Giải trình

           a, b are cmdline args (implicit)
  ,a+2     Range from 0 up to but not including a+2
a%         Take a mod each of those numbers
           (Note that a%0 returns nil; it emits a warning, but only if warnings are turned on)
      @?b  Find the index of the first occurrence of b in this list, or nil if it doesn't occur
           Autoprint (implicit)

Ví dụ: với đầu vào của 82:

   a+2   10
  ,      [0 1 2 3 4 5 6 7 8 9]
a%       [() 0 0 2 0 3 2 1 0 8]

Chỉ số dựa trên 0 của lần xuất hiện đầu tiên 2trong danh sách này 3là giải pháp của chúng tôi.


0

J , 14 byte

(->]){-,~=*1+]

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

Bản dịch của giải pháp Python 2 của Rod .

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

Các trường hợp hiếm hoi trong đó mã J có thể được dịch trực tiếp sang Python.

(->]){-,~=*1+]  <=>  [(a==b)*(1+b),a-b][a-b>b]
         =*1+]        (a==b)*(1+b)
      -,~            [            ,a-b]
     {                                 [     ]
(->])                                   a-b>b





0

ORK , 566 byte

When this program starts:
I have a inputter called I
I have a number called a
I have a number called b
I is to read a
I is to read b
I have a mathematician called M
M's first operand is a
M's second operand is b
M is to subtract
I have a number called n
n is M's result
M's first operand is b
M's second operand is n
M is to compare
I have a scribe called W
If M says it's less then W is to write n
If M says it's less then W is to write "\n"
M's second operand is a
M is to compare
If M says it's equal then W is to write a
If M says it's equal then W is to write a

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

O bjects R K OOL. Tuy nhiên, may mắn thay, tôi không cần sử dụng bất kỳ (ngoài những thứ tích hợp sẵn) cho nhiệm vụ này.


0

F #, 40 byte

let m a b=Seq.find(fun x->a%x=b){1..a+1}

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

Khá đơn giản. Ném một System.Collections.Generic.KeyNotFoundExceptionnếu không có giải pháp có thể được tìm thấy.

Bạn cũng có thể sửa đổi nó thành Seq.tryFind, sẽ trả về một int option, Nonenếu không có giải pháp nào có thể được tìm thấy.




0

> <> , 21 byte

Thủ thuật tương tự như hầu hết các giải pháp được đăng. Đầu tiên, chúng tôi chuẩn bị tất cả các giá trị cần thiết trên ngăn xếp và sau đó kiểm tra các so sánh.

::r::{-:{)?nr=?!;1+n;

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


0

Thì thầm v2 , 128 byte

> Input
> Input
>> 1²
>> (3]
>> 1%L
>> L=2
>> Each 5 4
>> Each 6 7
>> L⋅R
>> Each 9 4 8
> {0}
>> {10}
>> 12∖11
>> Output 13

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

Trả về một tập hợp tất cả các giải pháp có thể và tập hợp trống (nghĩa là ) khi không có giải pháp tồn tại.

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

Không có gì đáng ngạc nhiên, nó hoạt động gần như giống hệt với hầu hết các câu trả lời khác: nó tạo ra một danh sách các số và kiểm tra từng số cho mô đun nghịch đảo với đối số.

Nếu bạn quen thuộc với cách cấu trúc chương trình của Whispers hoạt động, vui lòng bỏ qua phía trước đến đường ngang. Nếu không: về cơ bản, Whispers hoạt động trên hệ thống tham chiếu từng dòng, bắt đầu từ dòng cuối cùng. Mỗi dòng được phân loại là một trong hai tùy chọn. Đó là một dòng nilad , hoặc nó là một dòng toán tử .

Các dòng Nilad bắt đầu bằng >, chẳng hạn như > Inputhoặc > {0}trả về giá trị chính xác được biểu thị trên dòng đó, tức là > {0}trả về tập hợp{0}. > Inputtrả về dòng STDIN tiếp theo, được đánh giá nếu có thể.

Các dòng toán tử bắt đầu bằng >>, chẳng hạn như >> 1²hoặc >> (3]biểu thị việc chạy toán tử trên một hoặc nhiều giá trị. Ở đây, các số được sử dụng không tham chiếu các số rõ ràng đó, thay vào đó chúng tham chiếu giá trị trên dòng đó. Ví dụ, ²là lệnh vuông (nn2), do >> 1²đó không trả về giá trị12, thay vào đó, nó trả về bình phương của dòng 1 , trong trường hợp này là đầu vào đầu tiên.

Thông thường, các dòng toán tử chỉ hoạt động bằng cách sử dụng số làm tham chiếu, nhưng bạn có thể nhận thấy các dòng >> L=2>> L⋅R. Hai giá trị này LRđược sử dụng cùng với các Eachcâu lệnh. Eachcâu lệnh hoạt động bằng cách lấy hai hoặc ba đối số, một lần nữa làm tham chiếu số. Đối số đầu tiên (ví dụ 5) là một tham chiếu đến một dòng toán tử được sử dụng một hàm và phần còn lại của các đối số là các mảng. Sau đó, chúng tôi lặp lại hàm trên mảng, trong đó LRtrong hàm đại diện cho (các) phần tử hiện tại trong các mảng được lặp lại. Ví dụ:

Để cho Một= =[1,2,3,4], B= =[4,3,2,1]f(x,y)= =x+y. Giả sử chúng ta đang chạy đoạn mã sau:

> [1, 2, 3, 4]
> [4, 3, 2, 1]
>> L+R
>> Each 3 1 2

Sau đó chúng tôi nhận được một minh chứng về cách các Eachbáo cáo hoạt động. Đầu tiên, khi làm việc với hai mảng, chúng tôi nén chúng để tạo thànhC= =[(1,4),(2,3),(3,2),(4,1)] sau đó bản đồ f(x,y) trên mỗi cặp, tạo thành mảng cuối cùng của chúng tôi D= =[f(1,4),f(2,3),f(3,2),f(4,1)]= =[5,5,5,5]

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


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

Làm việc trái ngược với cách thức hoạt động của Whispers, chúng tôi bắt đầu từ hai dòng đầu tiên:

> Input
> Input

Điều này thu thập hai đầu vào của chúng tôi, giả sử xyvà lưu trữ chúng trong dòng 12 tương ứng. Chúng tôi sau đó lưu trữx2trên dòng 3 và tạo một phạm viMột: =[1...x2]trên dòng 4 . Tiếp theo, chúng tôi nhảy đến phần

>> 1%L
>> L=2
>> Each 5 4
>> Each 6 7

Điều đầu tiên được thực hiện ở đây là dòng 7 , >> Each 5 4lặp lại dòng 5 trên dòng 4 . Điều này mang lại mảngB: =[Tôi%x|TôiMột], Ở đâu một%bđược định nghĩa là mô đun củamộtb.

Sau đó chúng tôi thực hiện dòng 8 , >> Each 6 7lặp lại dòng 6 trênB, mang lại một mảng C: =[(Tôi%x)= =y|TôiMột].

Đối với đầu vào x= =5,y= =2, chúng ta có Một= =[1,2,3,...,23,24,25], B= =[0,1,2,1,0,5,5,...,5,5]C= =[0,0,1,0,0,...,0,0]

Chúng tôi sau đó nhảy xuống

>> L⋅R
>> Each 9 4 8

đó là ví dụ của chúng tôi về một Eachtuyên bố dyadic . Ở đây, hàm của chúng ta là dòng 9 tức là >> L⋅Rvà hai mảng của chúng ta làMộtC. Chúng tôi nhân từng phần tử trongMột với yếu tố tương ứng trong C, mang lại một mảng, E, trong đó mỗi phần tử hoạt động từ mối quan hệ sau:

ETôi= ={0CTôi= =0MộtTôiCTôi= =1

Sau đó chúng tôi kết thúc với một mảng bao gồm 0s và các mô đun nghịch đảo của xy. Để loại bỏ0s, chúng tôi chuyển đổi mảng này thành một tập hợp ( >> {10}), sau đó lấy chênh lệch tập hợp giữa tập hợp này và{0}, cho năng suất, sau đó xuất ra, kết quả cuối cùng của chúng tôi.


-1

C #, 53 byte (83 với tiêu đề hàm)

static int F(int a, int b){
    for(int i=1;i<=a+1;i++){if(a%i==b)return i;}return 0;
}

Dùng thử trực tuyến

Lần đầu tiên thử tại codegolf. Có lẽ không phải là ngôn ngữ tốt nhất để sử dụng, cũng không phải là mã hóa hiệu quả nhất.


5
Xóa khoảng trắng không cần thiết để tiết kiệm khoảng 10 byte trở lên
Ông Xcoder
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.