ขยายปัญหาเด็กนักเรียนของ Kirkman


22

สำหรับคนที่ไม่คุ้นเคยปัญหาเด็กนักเรียนของเคิร์กแมนมีดังนี้:

หญิงสาวสิบห้าคนในโรงเรียนเดินออกจากกันสามครั้งเป็นเวลาเจ็ดวันติดต่อกัน: จะต้องจัดให้พวกเขาทุกวันเพื่อไม่ให้สองคนเดินเคียงข้างกันสองครั้ง

เราสามารถดูรายการแบบซ้อน3จาก5 (หรือเมทริกซ์):

[[a,b,c]
 [d,e,f]
 [g,h,i]
 [j,k,l]
 [m,n,o]]

เป็นหลักเป้าหมายของปัญหาเดิมคือการคิดออก 7 วิธีที่แตกต่างกันที่จะจัดเมทริกซ์ดังกล่าวข้างต้นเพื่อให้ตัวอักษรสองตัวไม่เปิดเผยแถวมากกว่าหนึ่งครั้ง จาก MathWorld (ลิงก์ด้านบน) เราพบโซลูชันนี้:

[[a,b,c]   [[a,d,h]   [[a,e,m]   [[a,f,i]   [[a,g,l]   [[a,j,n]   [[a,k,o]
 [d,e,f]    [b,e,k]    [b,h,n]    [b,l,o]    [b,d,j]    [b,i,m]    [b,f,g]
 [g,h,i]    [c,i,o]    [c,g,k]    [c,h,j]    [c,f,m]    [c,e,l]    [c,d,n]
 [j,k,l]    [f,l,n]    [d,i,l]    [d,k,m]    [e,h,o]    [d,o,g]    [e,i,j]
 [m,n,o]]   [g,j,m]]   [f,j,o]]   [e,g,n]]   [i,k,n]]   [f,h,k]]   [h,l,m]]

ทีนี้จะเกิดอะไรขึ้นถ้ามีเด็กนักเรียนจำนวนต่างกัน? อาจจะมีวันที่แปด? นี่คือความท้าทายของเรา

ในกรณีนี้ไม่มี††แต่ไม่จำเป็นต้องสำหรับอาร์เรย์มิติอื่น ๆ
††เราสามารถแสดงนี้เนื่องจากaปรากฏในแถวที่มีจดหมายทุกฉบับอื่น ๆ


ความท้าทาย:

ได้รับการป้อนข้อมูลของขนาด (แถวกว่าคอลัมน์) ของอาร์เรย์ของเด็กนักเรียน (เช่น3 x 5, 4 x 4หรือ[7,6], [10,10]ฯลฯ ) เอาท์พุทชุดที่เป็นไปได้ที่ใหญ่ที่สุดของ 'วัน' ที่พอดีกับความต้องการที่ระบุข้างต้น

อินพุต:
ขนาดของอาร์เรย์เด็กนักเรียน (ฟอร์มป้อนข้อมูลที่เหมาะสมที่คุณต้องการ)

เอาท์พุท:
อาร์เรย์ที่เป็นไปได้ที่ใหญ่ที่สุดที่เหมาะสมกับข้อกำหนดข้างต้น (รูปแบบที่เหมาะสม)

กรณีทดสอบ:

Input:  [1,1]
Output: [[a]]

Input:  [1,2]
Output: [[a,b]]

Input:* [2,1]
Output: [[a]
         [b]]

Input:  [2,2]
Output: [[a,b]  [[a,c]  [[a,d]
         [c,d]]  [b,d]]  [b,c]]

Input:  [3,3]
Output: [[a,b,c]  [[a,d,g]  [[a,e,i]  [[a,f,h]
         [d,e,f]   [b,e,h]   [b,f,g]   [b,d,i]
         [g,h,i]]  [c,f,i]]  [c,d,h]]  [c,e,g]]

Input:  [5,3]
Output: [[a,b,c]   [[a,d,h]   [[a,e,m]   [[a,f,i]   [[a,g,l]   [[a,j,n]   [[a,k,o]
         [d,e,f]    [b,e,k]    [b,h,n]    [b,l,o]    [b,d,j]    [b,i,m]    [b,f,g]
         [g,h,i]    [c,i,o]    [c,g,k]    [c,h,j]    [c,f,m]    [c,e,l]    [c,d,n]
         [j,k,l]    [f,l,n]    [d,i,l]    [d,k,m]    [e,h,o]    [d,o,g]    [e,i,j]
         [m,n,o]]   [g,j,m]]   [f,j,o]]   [e,g,n]]   [i,k,n]]   [f,h,k]]   [h,l,m]]

There may be more than one correct answer. 

* ขอบคุณ@Frozenfrankสำหรับการแก้ไขกรณีทดสอบ3 : หากมีเพียงหนึ่งคอลัมน์จะมีได้เพียงหนึ่งวันเท่านั้นเนื่องจากลำดับแถวไม่สำคัญ

นี่คือการแข่งขัน - คำตอบที่สั้นที่สุดชนะ


สิ่งนี้เกี่ยวข้องกับระนาบ projective จำกัด ไม่ว่าจะด้วยวิธีใดหรือฉันกำลังคิดว่ามีปัญหาที่แตกต่างออกไปหรือไม่?
Neil

@ ไม่มีฉันมีเงื่อนงำ ฉันเกรงว่าฉันไม่มีคุณสมบัติที่จะตอบได้ ;-)
Scott Milner

มีการ จำกัด เวลาหรือไม่?
2560

@Artyer ไม่มี แต่ผมอยากจะสามารถทดสอบรหัส ...
สกอตต์มิลเนอร์

2
@ Neil นั่นคือการอ่านวิกิพีเดียสนุก
Magic Octopus Urn

คำตอบ:


12

Mathematica ขนาด 935 ไบต์

Inp={5,4};L=Length;T=Table;ST[t_,k_,n_]:=Binomial[n-1,t-1]/Binomial[k-1,t-1];H=ToExpression@Alphabet[];Lo=Inp[[1]]*Inp[[2]];H=H[[;;Lo]];Final={};ST[2,3,12]=4;ST[2,4,20]=5;If[Inp[[2]]==1,Column[Partition[H,{1}]],CA=Lo*Floor@ST[2,Inp[[2]],Lo];While[L@Flatten@Final!=CA,Final={};uu=0;S=Normal[Association[T[ToRules[H[[Z]]==Prime[Z]],{Z,L@H}]]];PA=Union[Sort/@Permutations[H,{Inp[[2]]}]];PT=Partition[H,Inp[[2]]];While[L@PA!=0,AppendTo[Final,PT];Test=Flatten@T[Times@@@Subsets[PT[[X]],{2}]/.S,{X, L@PT}];POK=T[Times@@@Subsets[PA[[Y]],{2}]/.S,{Y,L@PA}];Fin=Select[POK,L@Intersection[Test,#]==0&];Facfin=T[FactorInteger[Fin[[V]]],{V,L@Fin}];end=T[Union@Flatten@T[First/@#[[W]],{W,L@#}]&[Facfin[[F]]],{F,L@Facfin}]/.Map[Reverse,S];PA=end;PT=DeleteDuplicates[RandomSample@end,Intersection@##=!={}&];If[L@Flatten@PT<L@H,While[uu<1000,PT=DeleteDuplicates[RandomSample@end,Intersection@##=!={}&];If[L@Flatten@PT==L@H,Break[],uu++]]]]];Grid@Final]


นี่สำหรับผู้หญิง 26 คน

แก้ไข
ฉันทำการเปลี่ยนแปลงบางอย่างและฉันคิดว่ามันใช้งานได้! รหัสในตอนนี้ได้รับการตั้งค่าให้แก้ปัญหา [5,4] (ซึ่งเป็น "ปัญหานักกอล์ฟโซเชียล") และรับผลในไม่กี่วินาที อย่างไรก็ตามปัญหา [5,3] ยากขึ้นและคุณจะต้องรอ 10-20 นาที แต่คุณจะได้รับการผสมผสานที่ถูกต้องตลอดทั้งวัน สำหรับกรณีที่ง่ายขึ้นมันรวดเร็วมาก

ต่อไปที่คุณสามารถลองและเห็นผล
ลองออนไลน์ได้ที่นี่
คัดลอกและวางการใช้ Ctrl-V
กด Shift + Enter เพื่อเรียกใช้รหัส
ที่คุณสามารถเปลี่ยนการรับสัญญาณที่จุดเริ่มต้นของรหัส -> Inp = {5,4}
เรียกใช้ รหัสหลาย ๆ ครั้งเพื่อรับพีชคณิตที่แตกต่างกัน


แม้ว่าสิ่งนี้จะน่าประทับใจและมีความก้าวหน้าอย่างมากในการแก้ปัญหา แต่ก็ยังไม่สมบูรณ์ แม้ว่ามันจะใช้ได้กับกรณีทดสอบขนาดเล็ก แต่ก็ไม่สามารถแก้ปัญหาที่ใหญ่กว่าได้รวมถึง[5,3]กรณีทดสอบปัญหาทั้งหมดนี้เกิดจาก นอกจากนี้สิ่งนี้สามารถเล่นกอล์ฟได้มากขึ้น มีชื่อตัวแปรหลายตัวที่ใหญ่กว่าที่พวกเขาต้องการและบางฟังก์ชั่นสามารถทำให้สั้นลงด้วย@สัญกรณ์หรือมัด ฉันหวังว่าคุณจะทำงานต่อไป!
Scott Milner

ขอบคุณสำหรับการตรวจสอบ ฉันจะพยายามทำให้งานนี้เป็นอันดับแรกและจากนั้นเล่นกอล์ฟ ...
J42161217

1
คุณควรจะสามารถบันทึกจำนวนมากของไบต์โดยการตั้งชื่อตัวแปรของคุณตัวอักษรตัวเดียวและกำหนดฟังก์ชั่นที่คุณใช้มากกว่าหนึ่งครั้งให้กับตัวแปรและแทนที่ฟังก์ชั่นด้วยตัวแปรเหล่านั้น :)
numbermaniac

2
@numbermaniac เพียงแค่เปลี่ยนชื่อตัวแปรฉันก็สามารถทำให้มันลงไป914ได้ มันควรจะลงสนามได้ประมาณ 850
สกอตต์มิลเนอร์

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