Комбінаторика транзистора


20

У відеоігри Transistor представлена ​​дуже цікава система здібностей. Ви збираєте 16 "функцій", які ви можете використовувати в 16 різних слотах. Цікаво, що є 3 типи слотів, і кожна функція поводиться по-різному, відповідно до того, у якому слоті ви її використовуєте:

  • Є 4 пасивні слоти .
  • Є 4 активних слота .
  • Кожен активний слот має 2 слота для оновлення .

Ми хочемо розібратися, скільки різних наборів навичок дає нам.

Однак деякі комбінації рівноцінні. Зокрема, для кожної з цих груп слотів конкретне положення функції не має значення. З іншого боку, дія функції в Upgrade Slot робить залежати від конкретної функції , використовуваної в батьківському активному інтервалі.

Тому, використовуючи шістнадцяткові цифри для підтвердження функцій, наступні комбінації є рівнозначними:

Passive Slots:    0     1     2     3
Active Slots:     4     5     6     7
Upgrade Slots:   8 9   A B   C D   E F

Passive Slots:    2     0     1     3    # Permutation of passive slots.
Active Slots:     4     5     6     7
Upgrade Slots:   8 9   A B   C D   E F

Passive Slots:    0     1     2     3
Active Slots:     5     6     4     7    # Permutation of active slots together
Upgrade Slots:   A B   C D   8 9   E F   # with their upgrade slots.

Passive Slots:    0     1     2     3
Active Slots:     4     5     6     7
Upgrade Slots:   8 9   B A   C D   F E   # Permutation within upgrade slots.

а також будь-яку комбінацію цих перестановок. Зауважте, що в третьому випадку слоти для оновлення були замінені разом з активними слотами, щоб підтримувати той самий загальний ефект.

З іншого боку, наступні комбінації відрізняються від вищевказаного набору:

Passive Slots:    4     5     6     7    # Passive slots swapped
Active Slots:     0     1     2     3    # with active slots.
Upgrade Slots:   8 9   A B   C D   E F

Passive Slots:    0     1     2     3
Active Slots:     5     4     6     7    # Permutation of active slots without
Upgrade Slots:   8 9   A B   C D   E F   # changing upgrade slots.

Passive Slots:    0     1     2     3
Active Slots:     4     5     6     7
Upgrade Slots:   8 A   9 B   C D   E F   # Permutation between different upgrade slots.

За моїм підрахунком, це дає вам 2270 268 000 можливих (функціонально виразних) комбінацій, припускаючи, що використовуються всі функції.

Якщо у вас є менше 16 функцій, деякі слоти залишаться порожніми. Однак зауважте, що ви не можете розмістити функцію в слоті для оновлення, якщо батьківський активний слот порожній.

Змагання

Ви можете визначити кількість можливих конфігурацій залежно від того, скільки функцій у вас є. Крім того, я трохи узагальнив проблему, зробивши кількість слотів змінними, щоб запобігти тривіальним рішенням жорсткого кодування.

Напишіть програму або функцію, яка з урахуванням двох цілих чисел M ≥ 1і 1 ≤ N ≤ 4Mвизначає кількість можливих (функціонально відмінних) наборів навичок, припускаючи, що саме Nрізні функції використовуються для заповнення якомога більше Mпасивних, Mактивних та 2Mоновлених слотів.

Ви можете написати програму або функцію, взявши введення через STDIN (або найближчу альтернативу), аргумент командного рядка або аргумент функції та вивівши результат через STDOUT (або найближчу альтернативу), значення повернення функції або параметр функції (out).

Ваш код повинен мати можливість обробляти будь-який ввід до M = 8однієї хвилини, включаючи його на розумній настільній машині. У цьому є деяка свобода, але вона повинна виключати грубі рішення. В принципі, вирішувати будь-який з цих входів потрібно не менше секунди.

Це код гольфу, найкоротша відповідь (у байтах) виграє.

Випробування

Кожен тестовий випадок є у формі M N => Result.

1 1 => 2
1 2 => 4
1 3 => 9
1 4 => 12
2 1 => 2
2 2 => 6
2 3 => 21
2 4 => 78
2 5 => 270
2 6 => 810
2 7 => 1890
2 8 => 2520
3 1 => 2
3 2 => 6
3 3 => 23
3 4 => 98
3 5 => 460
3 6 => 2210
3 7 => 10290
3 8 => 44520
3 9 => 168840
3 10 => 529200
3 11 => 1247400
3 12 => 1663200
4 1 => 2
4 2 => 6
4 3 => 23
4 4 => 100
4 5 => 490
4 6 => 2630
4 7 => 14875
4 8 => 86030
4 9 => 490140
4 10 => 2652300
4 11 => 13236300
4 12 => 59043600
4 13 => 227026800
4 14 => 718918200
4 15 => 1702701000
4 16 => 2270268000
5 1 => 2
5 2 => 6
5 3 => 23
5 4 => 100
5 5 => 492
5 6 => 2672
5 7 => 15694
5 8 => 98406
5 9 => 644868
5 10 => 4306932
5 11 => 28544670
5 12 => 182702520
5 13 => 1101620520
5 14 => 6122156040
5 15 => 30739428720
5 16 => 136670133600
5 17 => 524885961600
5 18 => 1667284819200
5 19 => 3959801445600
5 20 => 5279735260800
6 1 => 2
6 2 => 6
6 3 => 23
6 4 => 100
6 5 => 492
6 6 => 2674
6 7 => 15750
6 8 => 99862
6 9 => 674016
6 10 => 4787412
6 11 => 35304654
6 12 => 265314588
6 13 => 1989295308
6 14 => 14559228684
6 15 => 101830348620
6 16 => 667943115840
6 17 => 4042651092480
6 18 => 22264427465280
6 19 => 110258471363040
6 20 => 484855688116800
6 21 => 1854067032417600
6 22 => 5894824418683200
6 23 => 14025616720315200
6 24 => 18700822293753600
7 1 => 2
7 2 => 6
7 3 => 23
7 4 => 100
7 5 => 492
7 6 => 2674
7 7 => 15752
7 8 => 99934
7 9 => 676428
7 10 => 4849212
7 11 => 36601554
7 12 => 288486132
7 13 => 2349550632
7 14 => 19504692636
7 15 => 162272450340
7 16 => 1328431104000
7 17 => 10507447510560
7 18 => 78942848624640
7 19 => 554967220167360
7 20 => 3604592589998400
7 21 => 21411337810262400
7 22 => 115428212139240000
7 23 => 561247297649438400
7 24 => 2439121536313862400
7 25 => 9283622495827680000
7 26 => 29520583763711040000
7 27 => 70328449554723360000
7 28 => 93771266072964480000
8 1 => 2
8 2 => 6
8 3 => 23
8 4 => 100
8 5 => 492
8 6 => 2674
8 7 => 15752
8 8 => 99936
8 9 => 676518
8 10 => 4852992
8 11 => 36722169
8 12 => 291621462
8 13 => 2418755196
8 14 => 20834571186
8 15 => 184894557705
8 16 => 1672561326150
8 17 => 15217247948760
8 18 => 137122338089880
8 19 => 1204392465876600
8 20 => 10153538495100000
8 21 => 81007229522419200
8 22 => 604136189949692400
8 23 => 4168645459350372000
8 24 => 26403795950145213600
8 25 => 152700324078982680000
8 26 => 803784718213396920000
8 27 => 3838761204861983400000
8 28 => 16503742828841748480000
8 29 => 62545434470667308160000
8 30 => 198853691115980300400000
8 31 => 474189571122722254800000
8 32 => 632252761496963006400000

Це всі вхідні дані, з якими ваш код повинен обробитись протягом однієї хвилини (кожен), але він, в принципі, повинен працювати для більшого введення. Ви можете використовувати деякі з наступних M = 10тестових випадків, щоб перевірити, що:

10 1 => 2
10 2 => 6
10 3 => 23
10 4 => 100
10 5 => 492
10 6 => 2674
10 7 => 15752
10 8 => 99936
10 9 => 676520
10 10 => 4853104
10 11 => 36727966
10 12 => 291849866
10 13 => 2426074222
10 14 => 21033972388
10 15 => 189645995396
10 16 => 1773525588406
10 17 => 17155884420532
10 18 => 171073929494468
10 19 => 1750412561088334
10 20 => 18258387148774916
10 21 => 192475976310317700
10 22 => 2028834600633220380
10 23 => 21127206177119902860
10 24 => 214639961631544809360
10 25 => 2101478398293813739200
10 26 => 19602967930531817832000
10 27 => 172444768103233181556000
10 28 => 1417975382888905296456000
10 29 => 10820259026484304813416000
10 30 => 76213534343700480310584000
10 31 => 493916052421168703366040000
10 32 => 2941900199368102067135040000
10 33 => 16113144277547868007416960000
10 34 => 81222252655277786422930560000
10 35 => 376309102059179385262246080000
10 36 => 1589579966324953534441910400000
10 37 => 5981477408861097281112374400000
10 38 => 19005991357166148698688124800000
10 39 => 45381652832417130566255318400000
10 40 => 60508870443222840755007091200000

Чи обов’язково потрібно заповнити якомога більше слотів?
feersum

7
Я здогадуюсь, я краще зачекаю своїх, turn()перш ніж я help()вам get()відповіді load(), інакше мені, можливо, знадобиться ping()вам void()після того, як я spark()і crash()..... Людина ...
FryAmTheEggman

@feersum Так, всі Nфункції використовуються.
Мартін Ендер

Відповіді:


18

CJam (56 байт)

q~4@:Nm*:$_&{:+1$\-N),&},f{1$1$:+-\0-:(_e`0f=+++:m!:/}:+

Демонстрація в Інтернеті

NнкmnМN

Х0ХМN-ХN!Х!(N-Х)!N-ХМ3

λ0,λ1,,λкλ0λ1(N-Х)!λ0!λ1!...λк!λi=λjмкi3 2 2 1мк3=1мк2=2мк1=1λiλi способи вибору активної функції.

Отже, для кожного розділу є кількість розподілів функцій

N!Х!(λ0-1)!(λк-1)!мк1!мк2!мк3!

Код, наведений вище, обчислює розділи, використовуючи той самий підхід, що і Денніс (він очевидний і короткий, хоча і не дуже масштабований), а потім обробляє кожен розділ у масив, схожий на [N X λ_0-1 ... λ_k-1 μ_1 μ_2 μ_3]який він може підняти функціональну функцію, а потім скласти поділ.


9

CJam, 74 67 байт

q~4@:Mm*:$L|{:+W$\-M),&},f{0-:F1@@{_m!\I-:Nm!/I(m!/*N}fI;Fm!Fe=/}:+

Я перевірив усі тестові випадки на своєму настільному комп’ютері за допомогою інтерпретатора Java . На це знадобилося 2,2 секунди протягом 1 ≤ M ≤ 8 і 3,5 хвилини для M = 10 .

Спробуйте цю загадку в інтерпретаторі CJam або перевірте перші 84 тестові справи одразу .

Ідея

В принципі, ми можемо заповнити кожен активний слот та його відповідні слоти для оновлення за допомогою 0 , 1 , 2 або 3 функцій. Для слотів в загальному, ми приймаємо всі вектори V з {0, 1, 2, 3} М і відфільтрувати ті , для яких сума (V)> N (більше функцій в не-пасивних слотів , ніж загальний обсяг доступних функцій) або суми ( V) + M <N (недостатньо пасивних слотів для неактивних функцій). Ми сортуємо та придумуємо всі збережені вектори, оскільки порядок сімейства ігор у цьому не важливий.

Маючи N функцій та V = (x 1 ,…, x M ) функцій у не пасивних частинах сімейства слотів, обчислюємо кількість комбінацій таким чином:

  1. Якщо x 1 = 0 , існує лише одна можливість для цієї родини слотів.

    Якщо x 1 = 1 , є N можливостей, оскільки у нас є N функцій, і функція повинна переходити в активний слот.

    Якщо x 1 = 2 , ми повинні розмістити одну функцію в активному слоті, а іншу в слоті для оновлення (не важливо, яка). Є N вибору для активного слота та N-1, що залишився на вибір слота для оновлення, що дає загальну кількість N (N-1) комбінацій.

    Якщо x 1 = 3 , є N вибору для активного слота, N - 1 залишається вибір для першого слота для оновлення та N - 2 для другого слота для оновлення. Оскільки слоти для оновлення не мають порядку, це рахує кожну комбінацію двічі, тому є N (N - 1) (N - 2) унікальних комбінацій.

    У будь-якому випадку, є N! / ((N - x 1 )! × (x 1 - 1)! Комбінації для цієї родини.

  2. Ми використали функції x 1 , тому встановіть N: = N - x 1 і повторіть крок 1 для x 2 , потім x 3 і т.д.

  3. Якщо V містить дублікати, добуток вищевказаних результатів буде рахувати всі комбінації кілька разів. Для кожного унікального елемента V , якщо він зустрічається r разів у V , є r! еквівалентні способи розташування цих сімейств ігор, тому результат зверху повинен бути розділений r! .

  4. Кінцевий результат кількість унікальних комбінацій для цього V .

Для того, щоб обчислити загальну кількість унікальних комбінацій, все , що залишилося зробити , це обчислити суму результатів для кожного V .

Код

q~        e# Read an evaluate all input from STDIN. Pushes M and N.
4@:M      e# Push 4, rotate the M, and formally save it in M.
m*        e# Push {0, 1, 2, 3}^M.
:$        e# Sort each vector.
L|        e# Perform set union with the empty list (deduplicates).
{         e# For each sorted vector:
  :+      e#   Compute the sum of its coordinates.
  W$\-    e#   Subtract the sum from N (bottom of the stack).
  M),&    e#   Push [0 ... M] and intersect.
},        e# If the intersection was not empty, keep the vector.
f{        e# For each kept vector, push N and V; then:
  0-:F    e#   Save the non-zero elements of V in F.
  1@@     e#   Push 1 (accumulator), and rotate N and F on top of it.
  {       e#   For each I in F:
    _m!   e#     Push I and push factorial(I).
    \I-:N e#     Subtract I from N and update N.
    m!/   e#     Divide factorial(N) (original N) by factorial(N) (updated N).
    I(m!/ e#     Divide the quotient by factorial(I - 1).
    *     e#    Multiply the accumulator by the resulting quotient.
    N     e#    Push N for the next iteration.
  }fI     e#
  ;       e#   Pop N.
  Fm!     e#   Push all non-unique permutations of F.
  Fe=     e#   Count the number of times F appears.
  /       e#   Divide the accumulator by the result.
}         e#
:+        e# Add all resulting quotients.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.