커크 먼의 여학생 문제 확장


22

Kirkman의 여학생 문제 는 익숙하지 않은 사람들을 위해 다음과 같이 진행됩니다.

한 학교의 15 명의 젊은 여성이 7 일 연속으로 3 개의 나란히 걸어 다닌다. 두 사람이 나란히 두 번 걷지 않도록 매일 그들을 배치해야한다.

이것을 중첩 된 3 x 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. 

* 테스트 사례 3 을 수정 한 @Frozenfrank 에게 감사합니다 . 열이 하나만 있으면 행 순서가 중요하지 않으므로 하루 만있을 수 있습니다.

이것은 경쟁입니다-최단 답변이 이깁니다.


이것은 어떤 방식으로 유한 투영 평면과 관련이 있습니까? 아니면 다른 문제를 생각하고 있습니까?
Neil

@ 닐 나는 단서가 없다. 대답 할 자격이 없습니다. ;-)
Scott Milner

시간 제한이 있습니까?
Artyer

아니 @Artyer,하지만 난 ... 코드를 테스트 할 수 있도록하고 싶습니다
스콧 밀너에게

2
@ 닐은 재미있는 위키 백과를 읽었습니다.
매직 문어 Urn

답변:


12

매스 매 티카, 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를 사용하여 붙여 넣기
코드 실행 Enter 키를 눌러 이동 +를
사용하면 코드의 시작에 입력을 변경할 수 있습니다 -> INP은 = {5,4}는
을 실행 다른 순열을 얻기 위해 여러 번 코딩


이것은 인상적이며 문제 해결을 위해 많은 진전을 이루지 만 여전히 불완전합니다. 더 작은 테스트 사례에서는 작동하지만 [5,3]이 전체 문제의 기반이 되는 테스트 사례를 포함하여 더 큰 테스트 사례를 해결할 수 없습니다 . 또한 골프를 더 많이 할 수 있습니다. 필요한 것보다 더 큰 변수 이름이 여러 개 있으며 일부 함수는 짧게 @하거나 부호를 사용 하여 표기 할 수 있습니다 . 그래도 계속 일하기를 바랍니다!
Scott Milner

확인해 주셔서 감사합니다.
먼저이

1
당신은 :) 그 변수 기능을 당신의 변수 이름을 한 글자를 만들고, 당신은 변수에 한 번 이상 사용하는 일부 기능을 할당하고 대체하여 바이트을 많이 절약 할 수 있어야한다
numbermaniac

2
@numbermaniac 변수 이름을 바꾸면 변수를로 바꿀 수있었습니다 914. 850
Scott Milner

3
테스트 사례를 수정했습니다. 우선 나는 이것이 작동하기를 원합니다. 내가 아직 골프를 치지 않은 이유는 모든 의견에 감사드립니다. 이제 준비가되었다고 생각합니다.
J42161217
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.