รายการแบ่งได้หรือไม่


20

แรงบันดาลใจ (ที่มีคำอธิบายที่ถูกขโมย) จากนี้

พื้นหลัง

สมมติว่าคุณมีสองรายการA = [a_1, a_2, ..., a_n]และB = [b_1, b_2, ..., b_n]จำนวนเต็ม เรากล่าวAคืออาจ-หารโดยBหากมีการเปลี่ยนแปลงของBที่ทำให้a_iหารด้วยทั้งหมดb_i iปัญหาคือ: มันเป็นไปได้ที่จะเรียงลำดับใหม่ (เช่นเรียงสับเปลี่ยน) Bเพื่อให้a_iหารด้วยb_iทั้งหมดiหรือไม่? ตัวอย่างเช่นถ้าคุณมี

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

แล้วคำตอบจะเป็นTrueเช่นBสามารถที่จะจัดลำดับใหม่B = [3, 6, 4]และจากนั้นเราจะมีที่a_1 / b_1 = 2, a_2 / b_2 = 2และa_3 / b_3 = 2ซึ่งทั้งหมดเป็นจำนวนเต็มดังนั้นอาจเป็น-หารด้วยAB

เป็นตัวอย่างที่ควรส่งออกFalseเราอาจมี:

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

สาเหตุที่เป็นเช่นนี้คือFalseเราไม่สามารถเรียงลำดับใหม่ได้Bในขณะที่ 25 และ 5 อยู่Aแต่ตัวหารเดียวในBจะเป็น 5 ดังนั้นจะเหลือหนึ่ง

งานของคุณ

เห็นได้ชัดว่างานของคุณคือการระบุว่ามีสองรายการ คุณสามารถรับอินพุตในลักษณะที่ยอมรับเช่นเดียวกับเอาต์พุต

รายการที่ซ้ำกันในรายการเป็นไปได้และข้อ จำกัด ด้านขนาดของจำนวนเต็มคือภาษาของคุณ จำนวนเต็มทั้งหมดในรายการทั้งสองจะมีขนาดใหญ่กว่า 0 และรายการทั้งสองจะมีขนาดเท่ากัน

เช่นเดียวกับทั้งหมดค่าผลลัพธ์จะต้องเป็น 2 ค่าที่แตกต่างซึ่งแสดงถึงความจริงและเท็จ

นี่คือสั้นที่สุดที่จะชนะ!

กรณีทดสอบ

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 จากคำถาม: ทั้งสองรายการจะมีขนาดเท่ากัน
caird coinheringaahing

2
ทำไมกรณีทดสอบสุดท้ายไม่ได้กำหนด?
Dennis

1
@Dennis หนึ่งในรายการมี 0 อยู่ในนั้น
caird coinheringaahing

1
ขวา. (ไม่แน่ใจว่าทำไม0ถูกหารด้วยจำนวนเต็มทั้งหมด) ผลลัพธ์ที่ออกมาทั้งสองต้องเป็นความจริงและเป็นเท็จหรือไม่หรือไม่
Dennis

@Dennis 1) ในกรณีที่ 0 อยู่ในรายการที่สองเพื่อหลีกเลี่ยงข้อผิดพลาดในการแบ่ง 0 2) สอดคล้องกัน
caird coinheringaahing

คำตอบ:


10

เยลลี่ 5 ไบต์

Œ!%ḄẠ

ผลตอบแทน0สำหรับทรู , 1สำหรับเท็จ

ลองออนไลน์!

มันทำงานอย่างไร

Œ!%ḄẠ  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 ไบต์

บันทึก 2 ไบต์ขอบคุณ @Zgarb

▼▲‡¦P

ใช้เวลา argents ย้อนลำดับและผลตอบแทน1สำหรับTrueและสำหรับ0False

ลองออนไลน์!

คำอธิบาย

    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¦Pควรทำงานได้ 6 ไบต์
Zgarb

สิ่งเหล่านั้นถูกพิจารณาว่าเป็น "สองค่าที่แตกต่าง" หรือไม่?
geokavel

Oh, และสามารถMz
Zgarb

ผมคิดว่าคุณต้องแทน▼▲ ▲▼มีความคิดที่ดีในทุกกรณี!
Zgarb

5

05AB1E , 7 ไบต์

อินพุต: รับรายการ B และ A (เรียงกลับรายการ)
เอาท์พุท: 1 เมื่อเป็นจริงมิฉะนั้นจะเป็น 0

œvIyÖPM

ลองออนไลน์!

คำอธิบาย:

œ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 ไบต์

1 ไบต์โดยใช้แนวคิดจากคำตอบของ Dennis 'Jelly

Y@\!aA

ปัจจัยการผลิตที่มีแล้วB Aเอาต์พุตคือ0ถ้าหารได้หรือ1ไม่

ลองออนไลน์!

คำอธิบาย

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

Mathematica, 52 ไบต์

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

ขอบคุณ @ngenisis สำหรับ -5 ไบต์


2
Casesโดยทั่วไปจะสั้นกว่า:Cases[Permutations@#2,p_/;And@@IntegerQ/@(#/p)]!={}&
ngenisis

3

JavaScript (ES6), 67 63 ไบต์

ส่งคืนบูลีน

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

กรณีทดสอบ



3

R + combinat , 69 66 58 ไบต์

-3 ไบต์ขอบคุณ Jarko Dubbeldam

อีก -8 ไบต์ขอบคุณ Jarko

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

คี่ R ไม่มีบิวอินสำหรับสร้างพีชคณิตทั้งหมด ส่งคืนบูลีน

นอกจากนี้ด้วยการปรับปรุงที่สองของ Jarko anycoerces รายการไปยังเวกเตอร์ของlogicalด้วยคำเตือน

ลองออนไลน์! (R-ซอ)


1
ทั้งหมด (x <1) ยาวกว่าใด ๆ (! x) และคุณควรจะสามารถแทนที่ผลรวมด้วยใด ๆ
JAD

@JarkoDubbeldam โทรดี ขอขอบคุณ.
Giuseppe

โอ้และคุณสามารถละทิ้งรายการไม่ได้เพราะเป็นการข่มขู่โดยนัย
JAD

@JarkoDubbeldam ยอดเยี่ยม
Giuseppe





1

CJam, 20 17 ไบต์

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

เวอร์ชั่นทดสอบ

ฟังก์ชันที่รับอาร์เรย์ B เป็นอาร์กิวเมนต์แรกและอาร์เรย์ A เป็นอาร์กิวเมนต์ที่สอง โปรดทราบว่าในรุ่นทดสอบฉันเปลี่ยนคำสั่งเป็น A แล้ว B


1

JavaScript (ES6), 100 ไบต์

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

ค่อนข้างไม่มีประสิทธิภาพ พิเศษ&จะเร็วขึ้น


1

PHP, 112 180 178 ไบต์

ฉันคิดว่าสั้นเกินไป

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;}}

ฟังก์ชั่นที่ไม่ระบุชื่อใช้เวลาสองอาร์เรย์ผลตอบแทนNULLสำหรับความเท็จและความ1จริง โยนข้อผิดพลาดหากอาร์เรย์ที่สองมี
0

ลองมันออนไลน์


$f([6,5],[3,5])พิมพ์ผลผิด
nwellnhof

@nwellnhof แก้ไขแล้ว ขอบคุณที่สังเกต
ติตัส

1

C (gcc) , 191 ไบต์

#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;}}

ลองออนไลน์!

การใช้งาน: f(int size, int size, int *a, int *b)

ผลตอบแทน1ถ้าหาร0อย่างอื่น ดูตัวอย่างการใช้งานบน TIO

(ต้องทำการเปลี่ยนลำดับวิธีที่ยากลำบากใน C ดังนั้นนี่เป็นการแข่งขันที่แทบจะไม่)


1

Perl 6 , 38 ไบต์

จริงๆแล้วคำตอบของ @ nwellnhof ดูเหมือนจะอ่านได้มากเกินไปดังนั้นฉันจึงออกไปตามประเพณี Perl ที่ดีในการเขียนโค้ดเท่านั้น: —)

บันทึก 1 ไบต์ขอบคุณ @nwellnhof

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

ลองออนไลน์!

มันทำอะไร: มันเป็นฟังก์ชั่นนิรนามที่รับอาร์กิวเมนต์ของสองรายการ เมื่อเราพูดว่า@^aเราหมายถึงคนแรกเมื่อ@^bมันเป็นคนที่สอง

(@^a,)@^aเป็นรายการที่มีรายการ @^b.permutationsเป็นรายการของพีชคณิตทั้งหมดของ@^bเป็นรายการของพีชคณิตทั้งหมดตัวดำเนินการ "XZ %%" ทำให้คู่ที่เป็นไปได้ทั้งหมดของรายการหนึ่งทางด้านซ้ายและการเรียงสับเปลี่ยนทางด้านขวาทั้งหมดและใช้ตัวดำเนินการ "Z %%" ที่อยู่ซึ่งเป็นการดำเนินการ "zip" มาตรฐานโดยใช้ตัวดำเนินการหาร %%

maxผู้ประกอบการให้องค์ประกอบที่ใหญ่ที่สุดของรายการ (ในกรณีนี้มันเป็นรายการที่มีมากที่สุดTrueของในนั้น) จากนั้นเราลดมันโดยใช้ตัวดำเนินการตรรกะและเพื่อดูว่าองค์ประกอบทั้งหมดของรายการ "ที่แท้จริงที่สุด" นั้นเป็นจริงและนั่นคือผลลัพธ์ เป็นสำเนาที่ถูกต้องของสิ่งที่ @nwellnhof เขียนโดยใช้โอเปอเรเตอร์คลุมเครือเพื่อกำจัดไบต์


มันบอกว่าpermutationsมันเป็นอย่างชัดเจนไกลเกินไปอ่าน;)
Caird coinheringaahing

Perl 6 มีรูปแบบวิปริตที่ทรงพลังจริงๆ บางทีฉันสามารถศึกษาเพื่อปิดบังสายที่? : D
Ramillies

แทนที่[&&]ด้วยminเพื่อบันทึกไบต์อื่น
nwellnhof

คุณสามารถลบช่องว่างรอบ ๆXZ%%
Jo King

ฉันต้องการสิ่งที่{all (@^a,)Z%%@^b.permutations.any}เป็นไปได้
Jo King

1

Brachylogขนาด 6 ไบต์

pᵐz%ᵛ0

ลองออนไลน์!

เพรดิเคตจะประสบความสำเร็จหากทั้งสองรายการมีความเป็นไปได้ที่จะแบ่งแยกได้และล้มเหลวหากไม่ใช่

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

สกาลา, 60 ไบต์

แข็งแรงเล่นกอล์ฟ:

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

Ungolfed:

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 ไบต์

ขาออกหรือtruefalse

Vá de@gY vX

ทดสอบมัน


คำอธิบาย

ใส่อาร์เรย์U& V( A& Bตามลำดับ) โดยนัย

Vสร้างอาร์เรย์ของพีชคณิตทั้งหมดของ

d

ตรวจสอบว่าองค์ประกอบ (อาร์เรย์ย่อย) คืนค่าเป็นจริงหรือไม่

e@

ตรวจสอบว่าทุกองค์ประกอบใน sub-array ปัจจุบันคืนค่าเป็นจริงเมื่อส่งผ่านฟังก์ชันต่อไปนี้โดยXเป็นองค์ประกอบปัจจุบันและYดัชนีปัจจุบัน

gY

รับองค์ประกอบในการที่ดัชนีUY

vX

Xตรวจสอบว่าเป็นหารด้วย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.