Последовательность переключения


11

вступление

Последовательность переключения определяется следующим образом:

Начните с nлюдей, стоящих в кругу ( 6для этого примера).

 1  2
6    3
 5  4

Начиная с человека 1, человек, который находится слева от «выбранного» человека, удаляется.

 1
6    3
 5  4

Удаленный человек может «переключить» метод удаления вверх:

  • Если удаленный человек четный (что в данном случае), следующий удаленный будет справа от следующего «выбранного» человека.
  • Если удаленный человек нечетный, следующий удаленный человек будет слева от следующего «выбранного» человека.

Следующий выбранный человек также зависит от ранее удаленного человека.

  • Если удаленный человек четный, следующий выбранный человек будет справа от предыдущего выбранного человека.
  • Если удаленный человек странный, см. Выше, но замените «правый» на «левый».

Таким образом, следующий выбранный человек тогда 6.

Теперь мы удаляем человека справа 6, который является 5:

 1
6    3
    4

Потому 5что странно, удаленный человек теперь слева. Новый выбранный человек есть 1.

Теперь мы удалим 3:

 1
6
    4

Мы продолжаем этот процесс до тех пор, пока у нас не останется 1 номер - в этом примере последний номер - 1. Итак, поэтому S(6) = 1.

Первые несколько чисел:

 n | S(n)
---------
 1 | 1
 2 | 1
 3 | 3
 4 | 1
 5 | 5
 6 | 1
 7 | 3
 8 | 6
 9 | 5
10 | 6
11 | 9

задача

Ваша задача - создать программу (или функцию), которая будет возвращать S(n)(число nth в последовательности переключения), когда дано n, используя наименьшее количество байтов.

Пример входов и выходов:

1  -> 1
10 -> 6
13 -> 13

Вы гарантированно получите положительное целое число.

Это , поэтому выигрывает самый короткий код в байтах!

Примечание: нет последовательности OEIS (что?), Чтобы избавить вас от необходимости поиска.


7
Нет хитов на OEIS, чтобы спасти людей от поиска.
xnor

Очевидно, 2никогда не остается, но делает 7?
Джонатан Аллан

1
@JonathanAllan Я только что проверил первые 1000 терминов, и результат в настоящее время "нет". Хотя я не уверен - стоит ли говорить об этом как о «побочном вызове», который люди могут попытаться доказать или что-то в этом роде? Это для очков брауни, так что это не умаляет проблемы.
clismique

Может быть, это будет очевидно, если кто-то придумает метод, отличный от следования вашим инструкциям ...
Джонатан Аллан

3
Как вы ожидаете, что люди решат это без OEIS? Кто-нибудь подтолкнет OEIS, пожалуйста?
Эрик Outgolfer

Ответы:


4

Python 2, 183 94 байта

-4 байт благодаря Artyer (использование input()и printвместо того , defи return)
-1 байт благодаря FlipTack (использование print-~p[0]вместо print p[0]+1)

p=range(input())
d=i=1
while p[1:]:m=p.pop(i)%2;i-=m+m-(d<0);d=-m|1;i+=d;i%=len(p)
print-~p[0]

repl.it

Это просто следует приведенным инструкциям, я заметил какой-то шаблон, может быть, его можно использовать?

Единственные изменения:

  • использовать 0основанную индексацию (чтобы четные люди были нечетными и наоборот) - это экономит 5 байтов в логике игры в гольф и в конце исправляется+1
  • использовать 1как влево, так и -1вправо (использовать диапазон - так же, как все обращены наружу)
  • изменить логику шага, в котором найден следующий выбранный индивидуум, для учета popиз списка, сделав индекс «указатель» уже первым шагом вправо в списке (или слева в исходной терминологии).

Ungolfed:

def circle(n):
    people = range(n) # p
    direction = 1 # d
    removeIndex = 1 # i
    while n > 1:
        removingMod2 = people.pop(removeIndex) % 2 # m
        removeIndex -= removingMod2 + removingMod2 - (direction == -1)
        direction = -removingMod2 or 1
        removeIndex += direction
        n -= 1
        removeIndex %= n
    return people[0] + 1

Может ли быть последняя строка print-~p[0]?
FlipTack

Почему да, это может!
Джонатан Аллан
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.