Mở rộng vấn đề nữ sinh của Kirkman


22

Đối với những người bạn không quen thuộc, Vấn đề nữ sinh của Kirkman diễn ra như sau:

Mười lăm cô gái trẻ trong một trường học đi bộ ba lần trong bảy ngày liên tiếp: bắt buộc phải sắp xếp họ hàng ngày để không có hai người đi bộ hai lần.

Chúng ta có thể xem xét điều này như một lồng nhau 3 của 5 danh sách (hoặc ma trận):

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

Về cơ bản, mục tiêu của vấn đề ban đầu là tìm ra 7 cách khác nhau để sắp xếp ma trận trên sao cho hai chữ cái không bao giờ chia sẻ một hàng nhiều lần . Từ MathWorld (được liên kết ở trên), chúng tôi tìm thấy giải pháp này:

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

Bây giờ, nếu có một số lượng nữ sinh khác nhau thì sao? Có thể có một ngày thứ tám? Đây là thách thức của chúng tôi.

Trong trường hợp này không †† , nhưng không nhất thiết phải cho kích thước mảng khác
†† Chúng ta có thể dễ dàng hiển thị này, kể từ khi axuất hiện trong một hàng với mỗi lá thư khác.


Các thách thức:

Với một đầu vào kích thước (hàng, cột hơn) của một mảng của nữ sinh (tức là 3 x 5, 4 x 4hoặc [7,6], [10,10]vv), sản lượng các thiết lập lớn nhất có thể của 'ngày' phù hợp với các yêu cầu đã nêu ở trên.

Đầu vào:
Kích thước cho mảng nữ sinh (bất kỳ hình thức nhập hợp lý nào bạn muốn).

Đầu ra:
Chuỗi mảng lớn nhất có thể phù hợp với các yêu cầu trên (bất kỳ dạng hợp lý nào).

Các trường hợp thử nghiệm:

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. 

* Cảm ơn @F Frozenfrank đã sửa trường hợp kiểm tra 3 : nếu chỉ có một cột, chỉ có thể có một ngày, vì thứ tự hàng không thành vấn đề.

Đây là cuộc thi - câu trả lời ngắn nhất sẽ thắng.


Điều này có liên quan đến các mặt phẳng chiếu hữu hạn theo bất kỳ cách nào hay tôi đang nghĩ về một vấn đề khác?
Neil

@Neil tôi không có manh mối. Tôi sợ rằng tôi không đủ điều kiện để trả lời điều đó. ;-)
Scott Milner

Co giơi hạn thơi gian không?
Artyer

@Artyer Không, nhưng tôi muốn có thể kiểm tra mã ...
Scott Milner

2
@Neil đó là một wikipedia vui vẻ đọc.
Bạch tuộc ma thuật Urn

Câu trả lời:


12

Toán học, 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]


cái này dành cho 26 người phụ nữ

EDIT
Tôi đã thực hiện một số thay đổi và tôi nghĩ rằng nó hoạt động! Mã ngay bây giờ được đặt để giải quyết [5,4] (đó là "vấn đề của người chơi gôn xã hội") và nhận được kết quả sau vài giây. Tuy nhiên, vấn đề [5,3] khó khăn hơn và bạn sẽ phải chờ 10-20 phút nhưng bạn sẽ có được sự kết hợp đúng đắn cho tất cả các ngày. Đối với trường hợp dễ dàng hơn, nó rất nhanh chóng.

dù sao bạn cũng có thể dùng thử và xem kết quả
Hãy thử trực tuyến tại đây
sao chép và dán bằng cách sử dụng ctrl-v
nhấn shift + enter để chạy mã
bạn có thể thay đổi đầu vào khi bắt đầu mã -> Inp = {5,4}
chạy mã nhiều lần để có được hoán vị khác nhau


Mặc dù điều này rất ấn tượng và có nhiều tiến bộ trong việc giải quyết vấn đề, nhưng nó vẫn chưa hoàn thành. Mặc dù nó hoạt động cho các trường hợp thử nghiệm nhỏ hơn, nhưng nó không thể giải quyết bất kỳ trường hợp thử nghiệm nào lớn hơn, bao gồm cả [5,3]trường hợp thử nghiệm mà toàn bộ vấn đề này được dựa trên. Ngoài ra, điều này có thể được chơi golf nhiều hơn; có một số tên biến lớn hơn mức cần thiết và một số hàm có thể được rút ngắn bằng @ký hiệu hoặc ký hiệu. Tôi hy vọng bạn sẽ tiếp tục làm việc, mặc dù!
Scott Milner

cảm ơn vì đã kiểm tra nó Tôi sẽ cố gắng để làm cho công việc này đầu tiên và sau đó chơi golf ...
J42161217

1
Bạn sẽ có thể lưu rất nhiều byte bằng cách đặt tên biến của mình thành các chữ cái đơn và gán một số hàm bạn sử dụng nhiều lần cho các biến và thay thế các hàm bằng các biến đó :)
numbermaniac

2
@numbermaniac Chỉ bằng cách thay thế tên biến, tôi đã có thể chuyển nó xuống 914. Nó có thể chơi được xuống khoảng 850.
Scott Milner

3
Tôi đã sửa trường hợp thử nghiệm. Trước hết tôi muốn điều này làm việc. Đó là lý do tại sao tôi chưa chơi golf. Cảm ơn tất cả các ý kiến ​​của bạn. Tôi nghĩ bây giờ nó đã sẵn sàng.
J42161217
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.