Поля урна гортає та котить


13

Постановка проблеми

Поля знову грає зі своєю урною і хоче, щоб ти допоміг йому обчислити певні ймовірності.

У цьому експерименті урни у Полі є урна, яка спочатку містить 1 червону та 1 синю намистину.

Кожну ітерацію він досягає і витягує намистинку, потім оглядає колір і розміщує бісер назад в урну.

Потім він перекидає справедливу монету, якщо монета приземлиться головами, він вставить в урну справедливу 6-сторону маточку такого ж кольорового бісеру, якщо вона висадить хвости, він видалить половину кількості такого ж кольорового бісеру з урни ( Використання цілого поділу - тому, якщо кількість намистин вибраного кольору непарна, він видалить, (c-1)/2де c - кількість намистин цього кольору)

Враховуючи ціле число n ≥ 0 і десятковий r> 0, наведіть ймовірність у 2 десяткових знаках, що відношення між кольорами бісеру після n ітерацій більше або дорівнює r у найменшій кількості байтів.

Приклад набору ітерацій:

Нехай (x, y) визначає урну так, щоб вона містила x червоних намистин та y синіх намистин.

Iteration    Urn       Ratio
0            (1,1)     1
1            (5,1)     5        //Red bead retrieved, coin flip heads, die roll 4
2            (5,1)     5        //Blue bead retrieved, coin flip tails
3            (3,1)     3        //Red bead retrieved, coin flip tails
4            (3,4)     1.333... //Blue bead retrieved, coin flip heads, die roll 3

Як видно, коефіцієнт r завжди ≥ 1 (тож більший на червоний або синій, поділений на менший)

Тестові приклади:

Нехай F (n, r) визначає застосування функції для n ітерацій і відношення r

F(0,5) = 0.00
F(1,2) = 0.50
F(1,3) = 0.42
F(5,5) = 0.28
F(10,4) = 0.31
F(40,6.25) = 0.14

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


Я відчуваю, що для цього є формула ...
Втілення Невігластва

Щось робити з бета-біномінами, можливо, але це може бути довше, щоб виписати це
Термін дії даних закінчився

залежить від мови; R і Mathematica могли б зробити це ефективно.
Джузеппе

Відповіді:


6

JavaScript (ES7),  145 ... 129 124  123 байт

Вводиться як " (r)(n). Це наївне рішення, яке фактично виконує всю симуляцію.

r=>g=(n,B=s=0,R=0,h=d=>++d<7?h(d,[0,d].map(b=>g(n,B/-~!!b,R/-~!b)&g(n,B+b,R+d-b))):s/24**-~n)=>n--?h``:s+=~B<=r*~R|~R<=r*~B

Спробуйте в Інтернеті!

Занадто повільно для останніх 2 тестових випадків.

Прокоментував

r =>                    // r = target ratio
g = (                   // g is a recursive function taking:
  n,                    //   n = number of iterations
  B =                   //   B = number of blue beads, minus 1
  s = 0,                //   s = number of times the target ratio was reached
  R = 0,                //   R = number of red beads, minus 1
  h = d =>              //   h = recursive function taking d = 6-sided die value
    ++d < 7 ?           // increment d; if d is less than or equal to 6:
      h(                //   do a recursive call to h:
        d,              //     using the new value of d
        [0, d].map(b => //     for b = 0 and b = d:
          g(            //       do a first recursive call to g:
            n,          //         leave n unchanged
            B / -~!!b,  //         divide B by 2 if b is not equal to 0
            R / -~!b    //         divide R by 2 if b is equal to 0
          ) & g(        //       do a second recursive call to g:
            n,          //         leave n unchanged
            B + b,      //         add b blue beads
            R + d - b   //         add d - b red beads
          )             //       end of recursive calls to g
        )               //     end of map()
      )                 //   end of recursive call to h
    :                   // else (d > 6):
      s / 24 ** -~n     //   stop recursion and return s / (24 ** (n + 1))
) =>                    // body of g:
  n-- ?                 //   decrement n; if n was not equal to 0:
    h``                 //     invoke h with d = [''] (coerced to 0)
  :                     //   else:
    s +=                //     increment s if:
      ~B <= r * ~R |    //       either (-B-1) <= r*(-R-1), i.e. (B+1)/(R+1) >= r
      ~R <= r * ~B      //       or     (-R-1) <= r*(-B-1), i.e. (R+1)/(B+1) >= r

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

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