Kirkman's Schoolgirl Problemini Genişletin


22

Tanıdık olmayanlarınız için, Kirkman's Schoolgirl Problemi şöyle devam eder:

Bir okuldaki on beş genç bayan art arda yedi gün boyunca üç kez dışarı çıkarlar: Bunları günlük olarak ayarlamak gerekir, böylece hiçbiri iki kez yanyana yürümeyecektir.

Biz iç içe geçmiş bir benzeri bu bakabilir 3 tarafından 5 listesinde (ya da matris):

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

Esasen, asıl sorunun amacı, yukarıdaki matrisi düzenlemenin 7 farklı yolunu bulmaktır; böylece iki harf hiçbir zaman bir defada bir satırı asla paylaşmaz . MathWorld'den (yukarıda bağlanmış), şu çözümü buluyoruz:

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

Şimdi, ya farklı sayıda kız öğrenci olsaydı? Sekizinci gün olabilir mi? Bu bizim mücadelemiz.

Bu durumda hiçbir †† , ancak diğer dizi boyutları için mutlaka gerekli değil
†† Bunu, aher diğer harfle üst üste göründüğü için kolayca gösterebiliriz .


Meydan okuma:

Schoolgirls (yani bir dizi (kolonlar daha satır) boyutlarda bir giriş göz önüne alındığında 3 x 5, 4 x 4ya da [7,6], [10,10]yukarıda belirtilen şartları uygun 'gün' mümkün olan en grubu ve benzeri), çıkışı.

Giriş:
Kız öğrenci dizisi için boyutlar (istediğiniz herhangi bir makul giriş formu).

Çıktı:
Yukarıdaki gereklilikleri karşılayan olası en geniş diziler dizisi (herhangi bir makul biçimde).

Test Durumları:

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. 

* Test durumu 3'ü düzeltmek için @ Frozenfrank sayesinde : satır sırası önemli olmadığından yalnızca bir sütun varsa, yalnızca bir gün olabilir.

Bu yarışmasıdır - en kısa cevap kazanır.


Bu, herhangi bir şekilde sonlu projektif düzlemlerle ilgili mi, yoksa farklı bir problem mi düşünüyorum?
Neil,

@Neil hiçbir fikrim yok. Korkarım buna cevap vermeye yetkim yok. ;-)
Scott Milner

Bir zaman sınırı var mı?
Artyer

@Artyer Hayır, ama kodu test edebilmek istiyorum ...
Scott Milner

2
@Neil eğlenceli bir wikipedia okumaktı.
Magic Octopus Urn

Yanıtlar:


12

Mathematica, 935 bayt

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]


bu maksimum 26 bayan içindir.

EDIT
Bazı değişiklikler yaptım ve işe yaradığını düşünüyorum! Şu anki kod [5,4] ("sosyal golfçüler sorunu") çözecek şekilde ayarlandı ve birkaç saniye içinde sonuç aldı. Ancak [5,3] problemi daha zor ve 10-20 dakika beklemeniz gerekecek ancak tüm günler için doğru kombinasyonu alacaksınız . Daha kolay durumlar için çok hızlı.

yine de deneyebilir ve sonuçları görebilirsiniz
Çevrimiçi deneyebilirsiniz burada
kopyalayıp yapıştırın ve ctrl-v
tuşlarına basarak yapıştırın + enter tuşuna basın kodu çalıştırmak
için girişi değiştirebilirsiniz -> Inp = {5,4} kodunu
çalıştırın. farklı izinler almak için birden çok kez kodlayın


Bu etkileyici olmakla birlikte, sorunu çözme konusunda çok fazla ilerleme kaydetmesine rağmen, hala eksik. Daha küçük test durumları için çalışırken, [5,3]tüm problemin dayandığı test durumu da dahil olmak üzere daha büyük olanları çözemedi . Ayrıca bu daha çok golf oynayabilir; olması gerekenden daha büyük olan birkaç değişken adı vardır ve bazı işlevler @gösterimde kısaltılabilir veya eklenebilir . Umarım çalışmaya devam edersin!
Scott Milner

kontrol ettiğiniz için teşekkürler. Önce bu işi yapıp sonra golf
oynamayı deneyeceğim

1
Sen :) bu değişkenler ile fonksiyonlarını da değişken isimler tek harf olunmasını ve değişkenlere kereden fazla kullanan bazı fonksiyonları atayarak ve değiştirerek bayt tasarrufu mümkün olmalıdır
numbermaniac

2
@ sayı_maniac Sadece değişken isimlerini değiştirerek, onu bulabildim 914. 850'ye kadar golf oynayabilir.
Scott Milner

3
Test vakasını düzelttim. Her şeyden önce bunun çalışmasını istiyorum. Bu yüzden henüz golf oynamamıştım. Tüm yorumlarınız için teşekkürler. Sanırım şimdi hazır.
J42161217
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.