пс. ищите все другие мои решения проблем Advent of Code здесь.

День 19

Подробности челленджа смотрите здесь.

Сначала я подошел к сегодняшней задаче как к упражнению по динамическому программированию, но быстро понял, что есть гораздо лучший способ сделать это, как только я понял, что часть 1 на самом деле является проблемой Иосифа и у нее есть простое решение.

Чтобы понять вышеизложенное, посмотрите видео на YouTube в разделе ссылок ниже.

Часть 2

Осознавая глупость своих правил обмена подарками, эльфы вместо этого соглашаются
украсть подарки у эльфа прямо через круг. Если два эльфа находятся поперек
круга, то крадет тот, что слева (с точки зрения похитителя),
из которого. Остальные правила остаются неизменными: эльфы без подарков удаляются из
круга полностью, а остальные эльфы немного приближаются, чтобы сохранить круг
равномерно.

Например, с пятью эльфами (снова пронумерованными от 1 до 5):

  • Эльфы сидят в кругу; Эльф 1 ходит первым:
1
5   2
 4 3
  • Эльфы 3 и 4 расположены поперек круга; Подарок Эльфа 3 украден, он
    слева. Эльф 3 выходит из круга, а остальные эльфы входят:
1           1
5   2  -->  5   2
 4 -          4
  • Эльф 2 крадет у Эльфа прямо через круг, Эльф 5:
1         1 
-   2  -->     2
  4         4
  • Next is Elf 4 who, choosing between Elves 1 and 2, steals from Elf 1:
-          2  
    2  -->
 4          4
  • Наконец, Elf 2 крадет у Elf 4:
2
    -->  2  
 -

Итак, с пятью эльфами эльф, который сидит в начале позиции 2, получает все
подарки.

Учитывая количество эльфов, указанное в вашей головоломке, какой из эльфов теперь получит все
подарки?

Я не знаю об этой вариации задачи Иосифа Флавия, но готов поспорить, что в результатах, аналогичных результатам в части 1, будет какая-то закономерность, поэтому я собрал решение для динамического программирования, чтобы получить некоторые результаты. (ps. решение недостаточно хорошо для ввода, так как возврат займет слишком много времени)

С помощью этого я вижу появляющуюся закономерность:

n : ответ

1 : 1
2 : 2
3 : 3
4 : 1
5 : 2
6 : 3
7 : 5
8 : 7
9 : 9
10 : 1
11 : 2
12 : 3
13 : 4
14 : 5
15 : 6
16 : 7
17 : 8
18 : 9
19 : 11
20 : 13
21 : 15
22 : 17
23 : 19
24 : 21
25 : 23
26 : 25
27 : 27
28 : 1
29 : 2
30 : 3

  • где n — степень числа 3, тогда ответ сам по себе
  • иначе n может быть выражено как m + l, где m степень числа 3
  • где l ‹= m (например, n = 5 = 3 + 2, где m = 3 и l = 2), тогда ответ просто l
  • иначе ответ будет m + (l — m) * 2 (например, n = 7 = 3 + 4, где m = 3 и l = 4 и m + (l — m) * 2 = 5)

Ссылки