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


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.