Tôi có sinh đôi với phần còn lại hoán vị không?


17

Chúng tôi định nghĩa Rn là danh sách các phần còn lại của phép chia Euclide của n theo 2 , 3 , 57 .

Cho một số nguyên n0 , bạn phải tìm ra nếu tồn tại một số nguyên 0<k<210 sao cho Rn+k là hoán vị của Rn .

Ví dụ

Tiêu chí được đáp ứng cho n=8 , bởi vì:

  • chúng ta cóR8=(0,2,3,1)
  • với , ta có , đó là một hoán vị củak=44Rn+k=R52=(0,1,2,3)R8

Tiêu chí không được đáp ứng cho , bởi vì:n=48

  • chúng ta cóR48=(0,0,3,6)
  • số nguyên nhỏ nhất sao cho là hoán vị của là (dẫn đến )k>0Rn+kR48k=210R258=(0,0,3,6)

Quy tắc

  • Bạn có thể xuất giá trị trung thực nếu tồn tại và giá trị giả khác, hoặc hai giá trị riêng biệt và nhất quán mà bạn chọn.k
  • Đây là .

Dấu

Bạn có thực sự cần phải tính k ? Vâng, có lẽ. Hoặc có thể không.

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

Một số giá trị của nk tồn tại:

3, 4, 5, 8, 30, 100, 200, 2019

Một số giá trị của nk không tồn tại:

0, 1, 2, 13, 19, 48, 210, 1999

Câu trả lời:


20

R , 63 59 byte

s=scan()%%c(2,3,5,7);i=which(s<c(0,2,3,5));any(s[i]-s[i-1])

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

-4 byte nhờ Giuseppe

(Lời giải thích có chứa một spoiler về cách giải quyết vấn đề mà không cần tính toán k .)

Giải thích: Hãy S là danh sách các dư. Lưu ý các ràng buộc mà s [1] <2, s [2] <3, s [3] <5 và s [4] <7. Theo Định lý còn lại của Trung Quốc , tồn tại một k iff có hoán vị của S , khác với S , xác minh ràng buộc. Trong thực tế, điều này sẽ được xác minh nếu một trong những điều kiện sau được xác minh:

  • s [2] <2 và s [2]! = s [1]
  • s [3] <3 và s [3]! = s [2]
  • s [4] <5 và s [4]! = s [3]

Bạn có thể giải thích tại sao hoán vị nhất thiết phải khác biệt với ? S
dfeuer

1
@dfeuer Đó là hệ quả của Định lý còn lại của Trung Quốc; Tôi đã thêm một liên kết. Nếu hai số nguyên có cùng số dư modulo 2, 3, 5 và 7 (không có hoán vị), thì hai số nguyên đó là modulo bằng nhau 2 * 3 * 5 * 7 = 210.
Robin Ryder

8

Haskell , 69 byte

Dựa trên định lý còn lại của Trung Quốc

m=[2,3,5,7]
f x|s<-mod x<$>m=or[m!!a>b|a<-[0..2],b<-drop a s,s!!a/=b]

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


4
Trên thực tế, tiêu đề làm việc của tôi cho thử thách này là "Tôi có sinh đôi Trung Quốc không?" :)
Arnauld



5

C # (Trình biên dịch tương tác Visual C #) , 125 42 38 36 byte

n=>n%7<5&5<n%35|n%5<3&3<n%15|-~n%6>3

Cổng trực tiếp câu trả lời của @ xnor, dựa trên giải pháp của @ RobinRyder.

Đã lưu 4 byte nhờ @ janrjan Johansen!

Đã lưu thêm 2 nhờ vào @Arnauld!

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


1
Tôi đã tìm thấy một biến thể chỉ liên kết với các ngôn ngữ của xnor nhưng giúp cho điều này: 38 byte
Ørjan Johansen

1
Không phải là -~n%6/4>0chỉ -~n%6>3?
Arnauld

BTW, đây là một polyglot JavaScript .
Arnauld




2

Ngôn ngữ Wolfram (Mathicala) , 56 byte

Or@@(Min[s-#]>0&/@Rest@Permutations@Mod[#,s={2,3,5,7}])&

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

Tìm tất cả các hoán vị không nhận dạng của phần còn lại của modulo đầu vào 2, 3, 5, 7 và kiểm tra xem có bất kỳ trong số chúng ở dưới {2,3,5,7}mỗi tọa độ không. Lưu ý đó Or@@{}False.




1

PHP ,81 78 72 byte

while($y<3)if($argn%($u='235'[$y])!=($b=$argn%'357'[$y++])&$b<$u)die(T);

Một câu riff về câu trả lời của @Robin Ryder . Đầu vào là thông qua STDIN, đầu ra là 'T'nếu trung thực và trống rỗng ''nếu giả mạo.

$ echo 3|php -nF euc.php
T
$ echo 5|php -nF euc.php
T
$ echo 2019|php -nF euc.php
T
$ echo 0|php -nF euc.php

$ echo 2|php -nF euc.php

$ echo 1999|php -nF euc.php

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

Hoặc 73 byte có 1hoặc 0phản hồi

while($y<3)$r|=$argn%($u='235'[$y])!=($b=$argn%'357'[$y++])&$b<$u;echo$r;

$ echo 2019|php -nF euc.php
1
$ echo 1999|php -nF euc.php
0

Hãy thử trực tuyến (tất cả các trường hợp thử nghiệm)!

Câu trả lời gốc, 133 127 byte

function($n){while(++$k<210)if(($r=function($n){foreach([2,3,5,7]as$d)$o[]=$n%$d;sort($o);return$o;})($n+$k)==$r($n))return 1;}

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



1

05AB1E , 16 byte

Ƶ.L+ε‚ε4Åp%{}Ë}à

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

Ƶ.L          # Create a list in the range [1,209] (which is k)
   +         # Add the (implicit) input to each (which is n+k)
    ε        # Map each value to:
            #  Pair it with the (implicit) input
      ε      #  Map both to:
       4Åp   #   Get the first 4 primes: [2,3,5,7]
          %  #   Modulo the current number by each of these four (now we have R_n and R_n+k)
           { #   Sort the list
           #  After the inner map: check if both sorted lists are equal
           # After the outer map: check if any are truthy by taking the maximum
             # (which is output implicitly as result)

Xem 05AB1E mẹo này của tôi (phần Làm thế nào để nén các số nguyên lớn? ) Để hiểu tại sao Ƶ.209.



1

Thạch , 15 byte

8ÆR©PḶ+%Ṣ¥€®ċḢ$

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

Tôi chắc chắn có một câu trả lời golfer. Tôi đã giải thích một giá trị trung thực là bất cứ thứ gì không bằng 0, vì vậy đây là số giá trị có thể có của k. Nếu nó cần phải là hai giá trị riêng biệt làm tôi tốn thêm một byte.

Giải trình

8ÆR             | Primes less than 8 [2,3,5,7]
   ©            | Copy to register
    P           | Product [210]
     Ḷ          | Lowered range [0, 1, ..., 208, 209]
      +         | Add to input
         ¥€     | For each of these 210 numbers...
       %   ®    |   Modulo 2, 3, 5, 7
        Ṣ       |   And sort
            ċḢ$ | Count how many match the first (input) number’s remainders

1
Tất cả tốt về sự thật vs falsey. Sử dụng định nghĩa meta đã đồng ý về tính trung thực và chim ưng (một cách hiệu quả là "ngôn ngữ if-other xây dựng sẽ làm gì nếu có) số không là chim ưng và không phải là số không là sự thật ( ?là cấu trúc if- other trong Jelly; đối với một số ngôn ngữ câu hỏi khó hơn).
Jonathan Allan

Ồ, và bạn có thể nhận được các giá trị riêng biệt miễn phí Ḣe$nếu bạn muốn :)
Jonathan Allan

@Jonathan ALLan tất nhiên, cảm ơn. :)
Nick Kennedy
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.