ค้นหาการจับคู่สูงสุดในความสัมพันธ์ของการหาร


16

คุณได้รับชุดจำนวนเต็มบวก คุณต้องจัดเรียงให้เป็นคู่เช่น:

  • แต่ละคู่มี 2 หมายเลขโดยหนึ่งในนั้นเป็นหลายคู่ ตัวอย่างเช่น 8 คือผลคูณของ 4 และ 9 คือผลคูณของ 9
  • หากจำนวนเดียวกันเกิดขึ้นหลายครั้งในชุดเริ่มต้นก็สามารถใช้งานได้หลายครั้งในคู่นั้น จำนวนสามารถจับคู่กับการเกิดขึ้นของหมายเลขเดียวกันอีก
  • ได้รับจำนวนคู่ที่เป็นไปได้สูงสุด

เอาต์พุตต้องเป็นจำนวนคู่ รหัสที่สั้นที่สุดชนะ

ข้อมูลตัวอย่าง

2,3,4,8,9,18 -> 3

7,14,28,42,56 -> 2

7,1,9,9,4,9,9,1,3,9,8,5 -> 6

8,88,888,8888,88888,888888 -> 3

2,6,7,17,16,35,15,9,83,7 -> 2


3
ใครรู้ว่าปัญหานี้เป็นปัญหาที่สมบูรณ์หรือไม่ ผมคิดว่าที่เล็กที่สุดชุด "ยาก" 2,3,4,8,9,18เป็น (แต่ละหมายเลขในรายการนั้นเป็นตัวประกอบและ / หรือทวีคูณของตัวเลขอย่างน้อยสองตัวในรายการ แต่มันมีทางออกเดียวเท่านั้น)
Neil

คำตอบ:


6

Haskell, 109 107 76 70 ไบต์

ขอบคุณ nimi ที่ช่วยประหยัด 33 ไบต์และสอน Haskell ให้ฉันเพิ่มเติม :)
ขอบคุณ xnor สำหรับการบันทึกอีก 6 ไบต์

import Data.List
f l=maximum$0:[1+f t|a:b:t<-permutations l,a`mod`b<1]

Yay กอล์ฟ Haskell ครั้งแรกของฉัน มันทำงานได้เหมือนกับคำตอบทั้งหมดจนถึงตอนนี้ (ก็ไม่มากนัก: มันนับแค่ความยาวของคำนำหน้ายาวที่สุดของคู่ที่ถูกต้องในการเปลี่ยนรูปแต่ละครั้ง แต่มันก็เทียบเท่ากัน

สำหรับความพิถีพิถันเป็นพิเศษมันยังไม่มีประสิทธิภาพเป็นพิเศษด้วยการสร้างการเรียงสับเปลี่ยนทั้งหมดของคำต่อท้ายทุกครั้งที่สององค์ประกอบแรกของการเรียงสับเปลี่ยนเป็นคู่ที่ถูกต้อง


คือf=จำเป็น?
Alex A.

@AlexA ฉันไม่แน่ใจว่านโยบายมาตรฐานของ PPCG สำหรับฟังก์ชั่นที่ไม่มีชื่อใน Haskell คืออะไร แต่ฉันได้ตรวจสอบคำตอบอื่น ๆ ของ Haskell แล้วและพวกเขาใช้ฟังก์ชั่นที่มีชื่อ นอกจากนี้ในทางเทคนิคคุณต้องใช้วงเล็บรอบฟังก์ชั่นถ้าคุณต้องการที่จะใช้มันเป็นฟังก์ชั่นที่ไม่มีชื่อดังนั้นมันจะนับเป็นจำนวนไบต์เดียวกันต่อไปฉันเดา
Martin Ender

@nimi ขอบคุณที่แจ้งให้เราทราบ :) คุณเห็นอะไรที่สั้นลงไหม การนำเข้าสำหรับchunksOfเจ็บปวด ฉันไม่รู้จักไลบรารี่มาตรฐานของ Haskell เพื่อบอกได้ว่ามีฟังก์ชั่นเทียบเท่าที่สั้นกว่านี้หรือไม่ ฉันลองใช้งานด้วยตัวเอง แต่มันยาวกว่าการนำเข้าสองหรือสามไบต์
Martin Ender

ohhh การจับทั้งสอง[]และ[_]ในเวลาเดียวกันโดยการวางg x=[]วินาทีนั้นฉลาดจริงๆ ฉันจะลองดูสิ ขอบคุณ :)
Martin Ender

f l=maximum$0:[1+f t|(a:b:t)<-permutations l,a`mod`b<1]ลักษณะบิตสั้นเพื่อกำหนดฟังก์ชั่นทั้งซ้ำ:
xnor

3

CJam, 22 18 ไบต์

q~e!{2/::%0e=}%:e>

ลองออนไลน์

คาดว่าอินพุตในรูปแบบของรายการสไตล์ CJam

อันนี้เป็นนิดหน่อยไม่มีประสิทธิภาพสำหรับรายการขนาดใหญ่ (และ Java อาจมีหน่วยความจำไม่เพียงพอเว้นแต่คุณจะให้มากกว่านี้)

คำอธิบาย

q~     e# Read and evaluate input.
e!     e# Get all distinct permutations.
{      e# Map this block onto each permutation...
  2/   e#   Split the list into (consecutive) pairs. There may be a single element at the
       e#   end, which doesn't participate in any pair.
  ::%  e#   Fold modulo onto each chunk. If it's a pair, this computes the modulo, which
       e#   yields 0 if the first element is a multiple of the second. If the list has only
       e#   one element, it will simply return that element, which we know is positive.
  0e=  e#   Count the number of zeroes (valid pairs).
}%
:e>    e# Find the maximum of the list by folding max() onto it.

มันไม่ได้ให้ผลลัพธ์สำหรับ[1 2 3 4 5 6 7 8 9 10]อย่างไรก็ตาม[7 1 9 9 4 9 9 1 3 9 8 1]ซึ่งเป็นรายการอีกต่อไปทำงานอย่างถูกต้อง ทำไมถึงเป็นอย่างนั้น?
ghosts_in_the_code

@ghosts_in_the_code เนื่องจากอดีตมีการเรียงสับเปลี่ยนที่ชัดเจนกว่า แต่10! = 3628800 12! / 5! / 3! = 665280ดังนั้นหน่วยความจำหมดในกรณีแรก หากคุณเรียกใช้จากคอนโซลด้วยล่าม Java คุณสามารถบอก Java ให้ใช้หน่วยความจำมากขึ้นและกรณีแรกก็ใช้ได้เช่นกัน (แม้ว่าอาจใช้เวลาสักครู่ แต่ไม่รู้)
Martin Ender

3

Pyth, 13 ไบต์

eSm/%Mcd2Z.pQ

ความซับซ้อนของเวลาและการจัดเก็บข้อมูลนั้นแย่มากจริงๆ สิ่งแรกที่ฉันทำคือการสร้างรายการที่มีการเรียงสับเปลี่ยนทั้งหมดของรายการเดิม สิ่งนี้ใช้n*n!พื้นที่เก็บข้อมูล รายการอินพุตที่มีความยาว 9 ใช้เวลาค่อนข้างนานแล้ว

ลองใช้ออนไลน์: การสาธิตหรือชุดทดสอบ

คำอธิบาย:

eSm/%Mcd2Z.pQ
            Q   read the list of integer
          .p    create the list of all permutations
  m             map each permutation d to:
      cd2          split d into lists of length 2
    %M             apply modulo to each of this lists
   /     Z         count the zeros (=number of pairs with the first 
                   item divisible by the second)
 S              sort these values
e               and print the last one (=maximum)

2

Mathematica, 95 93 87 83 79 60 58 ไบต์

Max[Count[#~Partition~2,{a_,b_}/;a∣b]&/@Permutations@#]&

ใช้เวลาสักครู่สำหรับตัวอย่างขนาดใหญ่


0

Matlab (120 + 114 = 234)

  function w=t(y,z),w=0;for i=1:size(z,1),w=max(w,1+t([y,z(i,:)],feval(@(d)z(d(:,1)&d(:,2),:),~ismember(z,z(i,:)))));end

หลัก:

  a=input('');h=bsxfun(@mod,a,a');v=[];for i=1:size(h,1) b=find(~h(i,:));v=[v;[(2:nnz(b))*0+i;b(b~=i)]'];end;t([],v)

  • ฟังก์ชั่นหลุดโลกถูกเรียกโดยส่วนหลัก

  • อินพุตอยู่ในรูปแบบ [. . .]


0

Matlab (365)

  j=@(e,x)['b(:,' num2str(e(x)) ')'];r=@(e,y)arrayfun(@(t)['((mod(' j(e,1) ',' j(e,t) ')==0|mod(' j(e,t) ',' j(e,1) ')==0)&',(y<4)*49,[cell2mat(strcat(r(e(setdiff(2:y,t)),y-2),'|')) '0'],')'],2:y,'UniformOutput',0);a=input('');i=nnz(a);i=i-mod(i,2);q=0;while(~q)b=nchoosek(a,i);q=[cell2mat(strcat((r(1:i,i)),'|')) '0'];q=nnz(b(eval(q(q~=0)),:));i=i-2;end;fix((i+2)/2)

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

  • ฟังก์ชั่นนี้ใช้เวลาตอบสนองหลายครั้งเพื่อให้ทำงานได้เงียบเนื่องจากฟังก์ชั่นไม่ระบุชื่อฉันเปิดให้คำแนะนำได้ที่นี่ :)

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