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


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)( nчислом у послідовності комутації) при наданні n, використовуючи найменшу кількість байтів.

Приклади входів і виходів:

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

Ви гарантовано отримаєте додатне ціле число.

Це , тому найкоротший код у байтах виграє!

Примітка. Немає послідовності OEIS (що?), Щоб заощадити проблеми пошуку.


7
Немає показів на Oeis, щоб врятувати людей від пошуку.
xnor

Очевидно, 2ніколи не залишається, але чи так 7?
Джонатан Аллан

1
@JonathanAllan Я щойно перевірив перші 1000 термінів, і результат наразі "ні". Але я не впевнений - чи варто це ставити як "побічний виклик", який люди можуть спробувати довести чи щось таке? Це для окулярів окулярів, тому це не зменшує виклик.
клісмік

Можливо, це стане очевидним, коли хтось придумає інший метод, ніж дотримуючись ваших вказівок ...
Джонатан Аллан

3
Як ви очікуєте, що люди вирішать це без ОЕІС? Хтось штовхає ОЕІС, будь ласка?
Ерік Аутгольфер

Відповіді:


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в списку, роблячи покажчик "покажчик" вже кроком один праворуч у списку (або зліва в оригінальній термінології).

Безголівки:

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.