Kiểm tra trình tự được chấp nhận


13

Tóm tắt điều hành: kiểm tra xem một chuỗi đầu vào của số nguyên có "được chấp nhận" hay không, có nghĩa là nó không bao gồm tất cả các lớp dư cho bất kỳ mô đun nào.

Trình tự "được chấp nhận" là gì?

Cho một số nguyên m 2, các lớp dư modulo m chỉ là m tiến trình số học có thể có của sự khác biệt chung m. Ví dụ, khi m = 4, 4 lớp dư lượng modulo 4 là

..., -8, -4, 0, 4, 8, 12, ...
..., -7, -3, 1, 5, 9, 13, ...
..., -6, -2, 2, 6, 10, 14, ...
..., -5, -1, 3, 7, 11, 15, ...

Lớp dư thứ k bao gồm tất cả các số nguyên có phần dư khi chia cho m bằng k. (miễn là người ta định nghĩa "phần còn lại" chính xác cho số nguyên âm)

Một chuỗi các số nguyên a1, a2, ..., ak là modulo m được chấp nhận nếu nó không giao nhau ít nhất một trong các lớp dư. Ví dụ: {0, 1, 2, 3} và {-4, 5, 14, 23} không được chấp nhận modulo 4, nhưng {0, 1, 2, 4} và {0, 1, 5, 9} và {0, 1, 2, -3} modulo được chấp nhận 4. Ngoài ra, {0, 1, 2, 3, 4} không được chấp nhận modulo 4, trong khi {0, 1, 2} modulo 4 chấp nhận.

Cuối cùng, một chuỗi các số nguyên chỉ đơn giản là được chấp nhận nếu nó là modulo m được chấp nhận cho mọi số nguyên m 2.

Các thách thức

Viết chương trình hoặc hàm lấy một chuỗi số nguyên làm đầu vào và trả về giá trị Chân lý (nhất quán) nếu chuỗi đó được chấp nhận và giá trị Falsy (nhất quán) nếu chuỗi không được chấp nhận.

Chuỗi đầu vào của số nguyên có thể ở bất kỳ định dạng hợp lý. Bạn có thể giả sử rằng chuỗi đầu vào có ít nhất hai số nguyên. (Bạn cũng có thể cho rằng các số nguyên đầu vào là khác biệt nếu bạn muốn, mặc dù điều đó có thể không có ích.) Bạn phải có khả năng xử lý các số nguyên dương và âm (và 0).

thông thường : câu trả lời ngắn nhất, tính bằng byte, thắng.

Đầu vào mẫu

Mỗi chuỗi đầu vào sau đây sẽ cung cấp một giá trị Truthy:

0 2
-1 1
-100 -200
0 2 6
0 2 6 8
0 2 6 8 12
0 4 6 10 12
-60 0 60 120 180
0 2 6 8 12 26
11 13 17 19 23 29 31
-11 -13 -17 -19 -23 -29 -31

Mỗi chuỗi đầu vào sau đây sẽ cung cấp một giá trị Falsy:

0 1
-1 4
-100 -201
0 2 4
0 2 6 10
0 2 6 8 14
7 11 13 17 19 23 29
-60 0 60 120 180 240 300

Lời khuyên

  • Lưu ý rằng bất kỳ chuỗi nào có 3 số nguyên trở xuống sẽ được tự động chấp nhận modulo 4. Nói chung, một chuỗi độ dài k sẽ tự động được chấp nhận modulo m khi m> k. Theo sau đó, việc kiểm tra tính dễ chấp nhận thực sự chỉ yêu cầu kiểm tra số lượng hữu hạn của m.
  • Cũng lưu ý rằng 2 chia 4 và bất kỳ chuỗi nào có thể chấp nhận modulo 2 (nghĩa là tất cả hoặc chẵn) đều tự động được chấp nhận modulo 4. Nói chung, nếu m chia n và một chuỗi là modulo m được chấp nhận, thì đó là tự động chấp nhận modulo n. Để kiểm tra sự chấp nhận, do đó, chỉ nên xem xét nguyên tố m nếu bạn muốn.
  • Nếu a1, a2, ..., ak là một chuỗi được chấp nhận, thì a1 + c, a2 + c, ..., ak + c cũng được chấp nhận cho bất kỳ số nguyên c (dương hoặc âm).

Toán học liên quan (đọc tùy chọn)

Đặt a1, a2, ..., ak là một chuỗi các số nguyên. Giả sử có vô số số nguyên n sao cho n + a1, n + a2, ..., n + ak đều là số nguyên tố. Sau đó, thật dễ dàng để chỉ ra rằng a1, a2, ..., ak phải được chấp nhận. Thật vậy, giả sử a1, a2, ..., ak không được chấp nhận và cho m là một số sao cho a1, a2, ..., ak không được chấp nhận modulo m. Sau đó, bất kể n chúng ta chọn gì, một trong các số n + a1, n + a2, ..., n + ak phải là bội của m, do đó không thể là số nguyên tố.

Các k-tuples thủ phỏng đoán là ngược lại của tuyên bố này, đó vẫn là một vấn đề rộng mở trong lý thuyết số: nó khẳng định rằng nếu a1, a2, ..., ak là một chuỗi chấp nhận (hoặc k-tuple ), sau đó nên vô hạn nhiều số nguyên n sao cho n + a1, n + a2, ..., n + ak đều là số nguyên tố. Ví dụ, dãy 0, 2 được chấp nhận đưa ra tuyên bố rằng sẽ có vô số số nguyên n sao cho cả n và n + 2 đều là số nguyên tố, đây là phỏng đoán số nguyên tố sinh đôi (vẫn chưa được chứng minh).


3
[_60:0:60:120:180]đang cho tôi sự thật; thực sự nó không giao nhau ít nhất một lớp trong mỗi mtừ 2để 5hòa nhập; thêm vào đó, nó cắt chỉ có một lớp học trong mỗi mtừ 2để 5toàn diện.
Nữ tu bị rò rỉ

1
Tôi có cùng điều kiện với [-60, 0, 60, 120, 180] vì @LeakyNun điều này nên được chấp nhận.
Karl Napf

-60 0 60 120 180 240 300giao nhau với mọi dư lượng modulo 7, vì vậy nó không được chấp nhận.
Greg Martin

Chúng ta có thể có testcase dài hơn?
Nữ tu bị rò rỉ

@LeakyNun: Đối với bất kỳ m, m số đầu tiên lớn hơn m tạo thành một chuỗi được chấp nhận. (Trường hợp thử nghiệm Truthy thứ hai đến cuối cùng là một ví dụ về trường hợp này với m = 7.) Các trường hợp thử nghiệm sai có thể được tạo bằng cách bắt đầu với các số nguyên 1, ..., m, chọn k ≤ m và thêm bội số ngẫu nhiên của k đến bất kỳ hoặc tất cả các số nguyên bắt đầu 1, ..., m.
Greg Martin

Câu trả lời:



7

Brachylog , 25 24 19 byte

5 byte nhờ Karl Napf.

lybb '(eM-yA,?: [M] z:% aodA)
 l: 2' (eM-yA,?: [M] z:% aodA)
l: 2 '(eMg :? rz:% adlM)

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

Xác nhận tất cả các thử nghiệm!

l:2'(eMg:?rz:%adlM)
l:2                  Temp = [2:length(input)]
   '(             )  true if the following cannot be proven:
     eM                  M is an element of the interval
                         indicated by Temp, i.e. from 2
                         to the length of input inclusive,
       g:?rz:%adlM       every element of input modulo M
                         de-duplicated has length M.

4

Con trăn 61 60 byte

q=lambda l,d=2:d>len(l)or q(l,d+1)&(len({v%d for v in l})<d)

Tất cả các trường hợp thử nghiệm trên ideone

Chỉnh sửa: thay thế logic và bằng bitwise & để lưu một byte


2

JavaScript (ES6), 59 byte

a=>a.every((_,i)=>!i++|new Set(a.map(e=>(e%i+i)%i)).size<i)

Sử dụng Bộ lừa đảo còn lại của KarlNapf.


1
Chà, nó không phải là một mánh khóe, chỉ là toán học ;-)
Karl Napf 14/8/2016

2

Python, 67 64 byte

Như lambda chưa được đặt tên:

lambda N:all(len({i%m for i in N})<m for m in range(2,len(N)+1))
  • Chỉnh sửa1: thay thế set()bằng{}
  • Edit2: không cần dấu ngoặc vuông xung quanh trình tạo all(...)
  • Edit3: Như Jonathan Allan đã chỉ ra, rangephải đi lênlen(N)+1

Mã cũ dưới dạng hàm (96 byte):

def f(N):
 for m in range(2,len(N)+1):
    if len(set(i%m for i in N))==m:return False
 return True

1
Bằng cách này, tôi cung cấp cho bạn các khoản tín dụng cho cách tiếp cận của bạn đã tiết kiệm cho tôi 5 byte.
Nữ tu bị rò rỉ

@LeakyNun Chào mừng bạn!
Karl Napf

2

Toán học, 51 byte

And@@Table[Length@Union@Mod[#,i]<i,{i,2,Length@#}]&

2

MATL , 11 byte

"X@QGy\un>v

Truthy là một mảng (vector cột) chứa tất cả những cái. Falsy là một mảng chứa ít nhất một số không. Bạn có thể kiểm tra các định nghĩa bằng cách sử dụng liên kết này .

Hãy thử trực tuyến! Hoặc xác minh tất cả các trường hợp thử nghiệm: truthy , falsy (chút thay đổi mã, từng trường hợp tạo ra một vector ngang cho rõ ràng).

Giải trình

"       % Take input array. For each; i.e. repeat n times, where n is arrray size
  X@Q   %   Push iteration index plus 1, say k. So k is 2 in the first iteration,
        %   3 in the second, ... n+1 in the last. Actually we only need 2, ..., n;
        %   but the final n+1 doesn't hurt
  G     %   Push input again
  y     %   Duplicate k onto the top of the stack
  \     %   Modulo. Gives vector of remainders of input when divided by k
  un    %   Number of distinct elements
  >     %   True if that number is smaller than k
  v     %   Vertically concatenate with previous results
        % End for each. Implicitly display 

Tôi vẫn đang được định hướng tại trang web này, vì vậy xin lỗi nếu đây là loại câu hỏi được hỏi nhiều, nhưng: Tôi sẽ nghĩ rằng các giá trị trung thực / giả mạo phải là hằng số thực tế, không phải là các mẫu như "một mảng chứa tại ít nhất một số không ". Không nên xử lý mảng (sử dụng bitwise AND trong trường hợp này) để đến các hằng số cuối cùng?
Greg Martin

@GregMartin Đó là một câu hỏi rất hay. Chúng tôi có sự đồng thuận khá vững chắc về câu trả lời của nó; xem tại đây
Luis Mendo

1
Có nó, và bây giờ tôi thấy điểm của liên kết đầu tiên của bạn. Cảm ơn đã giải thích!
Greg Martin
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.