Các danh sách có chia hết không?


20

Lấy cảm hứng (với lời giải thích bị đánh cắp từ) này

Lý lịch

Giả sử bạn có hai danh sách A = [a_1, a_2, ..., a_n]B = [b_1, b_2, ..., b_n]số nguyên. Chúng ta nói Acó khả năng-chia bởi Bnếu có một hoán vị của Bmà làm cho a_ichia hết b_icho tất cả i. Vấn đề là sau đó: có thể sắp xếp lại (nghĩa là hoán vị) Bsao a_icho chia hết b_icho tất cả i? Ví dụ, nếu bạn có

A = [6, 12, 8]
B = [3, 4, 6]

Thì câu trả lời sẽ là True, như Bcó thể được sắp xếp lại được B = [3, 6, 4]và sau đó chúng ta sẽ có đó a_1 / b_1 = 2, a_2 / b_2 = 2a_3 / b_3 = 2, tất cả đều là các số nguyên, vì vậy Acó khả năng gây-chia B.

Như một ví dụ nên xuất ra False, chúng ta có thể có:

A = [10, 12, 6, 5, 21, 25]
B = [2, 7, 5, 3, 12, 3]

Lý do Falselà vì chúng tôi không thể sắp xếp lại thứ tự B25 và 5 A, nhưng ước số duy nhất trong B5 sẽ là 5, vì vậy một cái sẽ bị loại bỏ.

Nhiệm vụ của bạn

Rõ ràng, nhiệm vụ của bạn là xác định xem hai danh sách (được đưa ra làm đầu vào) có khả năng chia hết hay không. Bạn có thể nhận đầu vào theo bất kỳ cách nào được chấp nhận, như với đầu ra.

Các bản sao trong danh sách là một khả năng và các hạn chế kích thước duy nhất trên các số nguyên là ngôn ngữ của bạn. Tất cả các số nguyên trong cả hai danh sách sẽ lớn hơn 0 và cả hai danh sách sẽ có kích thước bằng nhau.

Như với tất cả , các giá trị đầu ra phải là 2 giá trị riêng biệt đại diện cho đúng và sai.

Đây là một để mã ngắn nhất chiến thắng!

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

Input, input => output

[6, 12, 8], [3, 4, 6] => True
[10, 5, 7], [1, 5, 100] => False
[14, 10053, 6, 9] [1,1,1,1] => True
[12] [7] => False
[0, 6, 19, 1, 3] [2, 3, 4, 5, 6] => undefined

3
@Shaggy từ câu hỏi: cả hai danh sách sẽ có kích thước bằng nhau
caird coinheringaahing

2
Tại sao trường hợp thử nghiệm cuối cùng không được xác định?
Dennis

1
@Dennis một trong những danh sách có 0 trong đó
caird coinheringaahing

1
Đúng. (Không chắc chắn tại sao, 0 chia hết cho tất cả các số nguyên.) Hai kết quả đầu ra có phải là trung thực và giả mạo hay chỉ nhất quán?
Dennis

@Dennis 1) trong trường hợp 0 ​​nằm trong danh sách thứ hai, để tránh 0 lỗi phân chia 2) chỉ nhất quán
caird coinheringaahing

Câu trả lời:


10

Thạch , 5 byte

Œ!%ḄẠ

Trả về 0 cho Đúng , 1 cho Sai .

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

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

Œ!%ḄẠ  Main link. Arguments: A, B (arrays)

Œ!     Generate all permutations of A.
  %    Take each permutation modulo B (element-wise).
   Ḅ   Convert all resulting arrays from binary to integer.
       This yields 0 iff the permutation is divisible by B.
    Ạ  All; yield 0 if the result contains a 0, 1 otherwise.

9

Husk , 7 6 5 byte

Đã lưu 2 byte nhờ @Zgarb

▼▲‡¦P

Đưa các đối số theo thứ tự ngược lại và trả về 1cho True0cho False.

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

Giải trình

    P     -- Permutations of the first argument
  ‡       -- Deep zip (vectorises function) with second argument
   ¦      --   Does x divide y
 ▲        -- Get the maximum of that list, returns [1,1...1] if present
▼         -- Get the minimum of that list, will return 0 unless the list is all 1s

VΠMz¦Pnên làm việc cho 6 byte.
Zgarb

Là những người được coi là "hai giá trị khác biệt"?
geokavel

Ồ, và Mzcó thể .
Zgarb

Tôi nghĩ bạn cần ▼▲thay vì ▲▼. Ý tưởng tốt đẹp trong mọi trường hợp!
Zgarb

5

05AB1E , 7 byte

Đầu vào: lấy danh sách B và A (thứ tự đảo ngược)
Đầu ra: 1 khi đúng, 0 nếu không

œvIyÖPM

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

Giải thích:

œvIyÖPM    Complete program
œ          Pushes all permutations of B as a list
 v         For each permutation
  I        Pushes last input on top of the stack
   yÖ      Computes a % b == 0 for each element of A and B
     P     Pushes the total product of the list
      M    Pushes the largest number on top of the stack

5

MATL , 8 7 6 byte

Tắt 1 byte bằng cách sử dụng một ý tưởng từ câu trả lời của Dennis 'Jelly

Y@\!aA

Đầu vào là B, sau đó A. Đầu ra là 0nếu chia hết hoặc 1nếu không.

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

Giải trình

Y@     % Implicit input: row vector B. Matrix of all permutations, each on a row
\      % Implicit input: row vector A. Modulo, element-wise with broadcast. Gives
       % a matrix in which each row contains the moduli of each permutation of B
       % with respect to A
!a     % True for rows that contain at least a nonzero value
A      % True if all values are true. Implicit display

3

Toán học, 52 byte

Cases[Permutations@#2,p_/;And@@IntegerQ/@(#/p)]!={}& 

cảm ơn @ngenisis vì -5 byte


2
Casesthường ngắn hơn:Cases[Permutations@#2,p_/;And@@IntegerQ/@(#/p)]!={}&
ngenisis

3

JavaScript (ES6), 67 63 byte

Trả về một boolean.

f=([x,...a],b)=>!x||b.some((y,i)=>x%y?0:f(a,c=[...b],c[i]=1/0))

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



3

R + combinat , 69 66 58 byte

-3 byte nhờ Jarko Dubbeldam

-8 byte khác nhờ Jarko

function(a,b)any(combinat::permn(b,function(x)all(!a%%x)))

Thật kỳ lạ, R không có tích hợp để tạo tất cả các hoán vị. Trả về một boolean.

Ngoài ra, với cải tiến thứ hai của Jarko, anyép buộc danh sách thành một vectơ logicalcảnh báo.

Hãy thử trực tuyến! (câu đố)


1
Tất cả (x <1) dài hơn bất kỳ (! X) nào và bạn sẽ có thể thay thế tổng bằng bất kỳ
JAD

@JarkoDubbeldam gọi tốt. cảm ơn bạn.
Giuseppe

Ồ, và bạn có thể bỏ qua danh sách, yay cho sự ép buộc ngầm.
JAD

@JarkoDubbeldam tuyệt vời.
Giuseppe





1

Camam 20 17 byte

:A;e!{A\.%:+!}#W>

Phiên bản thử nghiệm

Hàm lấy mảng B làm đối số thứ nhất và mảng A làm đối số thứ hai. Lưu ý rằng trong phiên bản thử nghiệm, tôi chuyển thứ tự sang A rồi B.


1

JavaScript (ES6), 100 byte

f=(a,b)=>!a[0]||a.some((c,i)=>b.some((d,j)=>c%d<1&f(e=[...a],d=[...b],e.splice(i,1),d.splice(j,1))))

Hơi không hiệu quả; một phụ &sẽ tăng tốc nó lên.


1

PHP, 112 180 178 byte

Tôi đã suy nghĩ quá ngắn.

function($a,$b){for($p=array_keys($b);++$i<count($b);){foreach($b as$k=>$x)$f|=$a[$k]%$x;if($f=!$f)return 1;$p[$i]?[$b[$j],$b[$i],$i]=[$b[$i],$b[$j=$i%2*--$p[$i]],0]:$p[$i]=$i;}}

Hàm ẩn danh có hai mảng, trả về NULLcho giả và 1cho sự thật.
Ném lỗi nếu mảng thứ hai chứa0 .

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


In kết quả sai cho $f([6,5],[3,5]).
nwellnhof

@nwellnhof cố định. cảm ơn vì đã chú ý
Tít

1

C (gcc) , 191 byte

#define F(v)for(i=0;i<v;++i){
#define X if(f(s,n,a,b))return 1
j;f(s,n,a,b,i)int*a,*b;{if(--n){F(n)X;j=i*(n%2);b[j]^=b[n];b[n]^=b[j];b[j]^=b[n];}X;}else{F(s)if(a[i]%b[i])return 0;}return 1;}}

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

Sử dụng: f(int size, int size, int *a, int *b)

trả lại 1nếu chia, 0nếu không. Xem ví dụ sử dụng trên TIO.

(Phải hoán vị một cách khó khăn trong C, vì vậy điều này khó cạnh tranh)


1

Perl 6 , 38 byte

Trên thực tế, câu trả lời của @ nwellnhof dường như quá dễ đọc, vì vậy tôi đã bắt đầu tuân theo truyền thống tốt đẹp của Perl về mã chỉ viết:.

Lưu 1 byte nhờ @nwellnhof.

{min max (@^a,) XZ%% @^b.permutations}

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

Nó làm gì: Đây là một hàm ẩn danh có hai đối số danh sách. Khi chúng ta nói @^a, chúng ta có nghĩa là người đầu tiên, khi@^b , đó là cái thứ hai.

(@^a,)là một danh sách chứa danh sách @^a. @^b.permutationslà danh sách của tất cả các hoán vị của @^b. Toán tử "XZ %%" tạo ra tất cả các cặp có thể có của một danh sách đó ở bên trái và tất cả các hoán vị ở bên phải và sử dụng toán tử "Z %%" trên chúng, đó là thao tác "zip" tiêu chuẩn sử dụng toán tử chia hết %%.

Các maxnhà khai thác cung cấp cho các phần tử lớn nhất của danh sách (trong trường hợp này, đó là danh sách đó có hầu hết các True's trong nó). Sau đó, chúng tôi giảm nó bằng cách sử dụng toán tử AND logic để xem liệu tất cả các yếu tố của danh sách "đúng nhất" đó có đúng không, và đó là kết quả. Đó là bản sao gần như chính xác những gì @nwellnhof đã viết, chỉ cần sử dụng các toán tử tối nghĩa để cạo các byte.


Nó nói permutations, nó rõ ràng là quá dễ đọc;)
caird coinheringaahing

Chà, Perl 6 có một mô hình hướng nội thực sự mạnh mẽ. Có lẽ tôi có thể nghiên cứu nó để che khuất cuộc gọi đó? : D
Ramillies

Thay thế [&&]bằng minđể lưu một byte khác.
nwellnhof

Bạn có thể xóa các khoảng trống xung quanhXZ%%
Jo King

Tôi ước điều gì đó {all (@^a,)Z%%@^b.permutations.any}có thể xảy ra
Jo King

1

Brachylog , 6 byte

pᵐz%ᵛ0

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

Vị ngữ thành công nếu hai danh sách có khả năng chia hết và thất bại nếu không.

pᵐ        For some pair of permutations of the two input lists,
  z       for each pair of corresponding elements
   %ᵛ0    the first mod the second is always zero.




0

Scala, 60 byte

Chơi gôn

a=>b=>b.permutations exists(a zip _ forall(p=>p._1%p._2==0))

Ung dung:

a=>b=>         // Function literal taking 2 lists of integers, a and b.
b.permutations // All permutations of b.
exists(        // Whether the given function is true for any element.
a zip _        // Zips a and the current permutation of b into a list of pairs.
forall(        // Whether the given function is true for all elements.
p=>            // Function literal taking a pair of integers.
p._1%p._2==0)) // If the remainder of integer division between the members of the pair is 0.

0

Japt , 12 11 byte

Đầu ra truehay false.

Vá de@gY vX

Kiểm tra nó


Giải trình

Đầu vào ngầm định của mảng U& V( A& B, tương ứng)

Tạo một mảng của tất cả các hoán vị của V.

d

Kiểm tra xem có bất kỳ phần tử nào (mảng phụ) trả về true không.

e@

Kiểm tra xem mọi phần tử trong mảng con hiện tại có trả về true không khi được chuyển qua hàm sau, với Xphần tử hiện tại và Ychỉ mục hiện tại.

gY

Lấy phần tử Utại chỉ mục Y.

vX

Kiểm tra xem nó có chia hết không X.

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.