Розкрийте проблему школярки Кіркмана


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

А що робити, якщо було б різну кількість школярки? Чи може бути восьмий день? Це наше завдання.

У цьому випадку немає †kl , але це не обов'язково для інших розмірів масиву.
† Це ми можемо легко показати, оскільки 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 : якщо є лише один стовпець, може бути лише один день, оскільки порядок рядків не має значення.

Це змагання з - виграє найкоротша відповідь.


Чи стосується це якимось чином обмежених проективних площин чи я думаю про іншу проблему?
Ніл

@Neil У мене немає поняття. Боюся, я не кваліфікований, щоб відповісти на це. ;-)
Скотт Мілнер

Чи існує обмеження часу?
Artyer

@Artyer Ні, але я хотів би мати можливість перевірити код ...
Скотт Мілнер

2
@Neil, що це було цікаве прочитання wikipedia.
Чарівна восьминога урна

Відповіді:


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 дам макс

EDIT
Я вніс деякі зміни і, думаю, це працює! Код зараз встановлений для вирішення [5,4] (що є "проблемою соціальних гольфістів") і отримує результат за кілька секунд. Однак проблема [5,3] є складнішою, і вам доведеться почекати 10-20 хвилин, але ви отримаєте правильну комбінацію на всі дні. Для легших випадків це дуже швидко.

у будь-якому випадку ви можете спробувати його і побачити результати
Спробуйте його онлайн,
скопіюйте та вставте за допомогою ctrl-v
натисніть shift + введіть, щоб запустити код,
ви можете змінити вхід на початку коду -> Inp = {5,4}
запустіть команду код кілька разів, щоб отримати різні перестановки


Хоча це вражає і робить великий прогрес у вирішенні проблеми, воно все ще є неповним. Хоча він працює для менших тестових випадків, він не міг вирішити жодних більших, включаючи [5,3]тестовий випадок, на якому базується вся ця проблема. Крім того, це можна більше гольфу; Є кілька імен змінних, які є більшими, ніж потрібно, і деякі функції можна скоротити за допомогою @або інфіксувати позначення. Я сподіваюся, що ти продовжиш працювати!
Скотт Мілнер

дякую за перевірку. Я спробую спочатку зробити цю роботу, а потім
пограти в

1
Ви повинні бути в змозі зберегти багато байтів, зробивши імена змінних одними літерами та призначивши деякі функції, які ви не раз використовуєте для змінних, і замінивши функції цими змінними :)
numbermaniac

2
@numbermaniac Просто замінивши імена змінних, я зміг її звести 914. Вона повинна бути golfable приблизно до 850.
Scott Мілнер

3
Я зафіксував тестовий випадок. Перш за все я хочу, щоб це працювало. Ось чому я ще не грав його в гольф. Дякую за всі ваші коментарі. Я думаю, зараз він готовий.
J42161217
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.