Bentangkan Masalah Siswi Kirkman

22

Bagi Anda yang tidak terbiasa, Problem Schoolgirl Kirkman berbunyi sebagai berikut:

Lima belas wanita muda di sekolah berjalan tiga mengikuti selama tujuh hari berturut-turut: diperlukan untuk mengatur mereka setiap hari sehingga tidak ada dua yang berjalan dua kali mengikuti.

Kita bisa melihat ini seperti bersarang 3 oleh 5 daftar (atau matriks):

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

Pada dasarnya, tujuan dari masalah asli adalah untuk mencari tahu 7 cara berbeda untuk mengatur matriks di atas sehingga dua huruf tidak pernah berbagi baris lebih dari satu kali . Dari MathWorld (ditautkan di atas), kami menemukan solusi ini:

[[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]]

Sekarang, bagaimana jika ada jumlah siswi yang berbeda? Mungkinkah ada hari kedelapan? Ini tantangan kita.

Dalam hal ini tidak ada †† , tetapi belum tentu untuk dimensi array lain
†† Kami dapat dengan mudah menunjukkan ini, karena amuncul berturut-turut dengan setiap huruf lainnya.


Tantangan:

Diberi masukan dimensi (baris, dari kolom) dari array siswi (yaitu 3 x 5, 4 x 4, atau [7,6],[10,10] , dll), output set kemungkinan terbesar dari 'hari' yang sesuai dengan persyaratan yang ditentukan di atas.

Memasukkan:
Dimensi untuk array siswi (formulir input masuk akal yang Anda inginkan).

Keluaran:
Serangkaian array terbesar yang sesuai dengan persyaratan di atas (bentuk wajar apa pun).

Kasus uji:

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. 

* Terima kasih kepada @Frozenfrank untuk mengoreksi test case 3 : jika hanya ada satu kolom, hanya ada satu hari, karena urutan baris tidak masalah.

Ini adalah kompetisi - jawaban terpendek menang.

Scott Milner
sumber
Apakah ini berhubungan dengan pesawat proyektif yang terbatas dengan cara apa pun atau apakah saya memikirkan masalah yang berbeda?
Neil
@ Neil aku tidak tahu. Saya khawatir saya tidak memenuhi syarat untuk menjawab itu. ;-)
Scott Milner
Apakah ada batasan waktu?
Artyer
@Artyer Tidak, tapi saya ingin dapat menguji kode ...
Scott Milner
2
@Neil itu wikipedia yang asyik dibaca.
Magic Gurita Guci

Jawaban:

12

Mathematica, 935 byte

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]


ini untuk 26 wanita maks

EDIT
Saya membuat beberapa perubahan dan saya pikir itu berhasil! Kode sekarang diatur untuk menyelesaikan [5,4] (yang merupakan "masalah pegolf sosial") dan mendapatkan hasilnya dalam beberapa detik. Namun [5,3] masalahnya lebih sulit dan Anda harus menunggu 10-20 menit tetapi Anda akan mendapatkan kombinasi yang tepat untuk semua hari. Untuk kasus yang lebih mudah, ini sangat cepat.

lagi pula Anda dapat mencobanya dan melihat hasilnya
Coba online di sini
salin dan tempel menggunakan ctrl-v
tekan shift + enter untuk menjalankan kode
Anda dapat mengubah input pada awal kode -> Inp = {5,4}
jalankan kode beberapa kali untuk mendapatkan permutasi yang berbeda

J42161217
sumber
Meskipun ini mengesankan, dan membuat banyak kemajuan dalam memecahkan masalah, itu masih belum lengkap. Meskipun ini berfungsi untuk kasus uji yang lebih kecil, ini tidak dapat menyelesaikan yang lebih besar, termasuk [5,3]kasus uji yang menjadi dasar masalah ini. Selain itu, ini bisa lebih banyak golf; ada beberapa nama variabel yang lebih besar dari yang seharusnya, dan beberapa fungsi dapat disingkat @atau ditambahkan notasi. Saya harap Anda akan tetap bekerja!
Scott Milner
terima kasih sudah memeriksanya. Saya akan mencoba untuk membuat ini bekerja pertama dan kemudian golf itu ...
J42161217
1
Anda harus dapat menyimpan banyak byte dengan membuat nama variabel Anda menjadi huruf tunggal, dan menetapkan beberapa fungsi yang Anda gunakan lebih dari satu kali ke variabel dan mengganti fungsi dengan variabel-variabel tersebut :)
numbermaniac
2
@numbermaniac Dengan hanya mengganti nama variabel, saya bisa mendapatkannya 914. Seharusnya golf turun menjadi sekitar 850.
Scott Milner
3
Saya memperbaiki test case. Pertama-tama saya ingin ini berfungsi. Itu sebabnya saya belum bermain golf. Terima kasih atas semua komentar Anda. Saya pikir sekarang sudah siap.
J42161217