Sekwencja przełączania

11

Wprowadzenie

Sekwencja przełączania jest zdefiniowana w następujący sposób:

Zacznij od nosób stojących w kręgu ( 6w tym przykładzie).

 1  2
6    3
 5  4

Zaczynając od osoby 1, osoba znajdująca się na lewo od „wybranej” osoby jest usuwana.

 1
6    3
 5  4

Osoba usunięta może „zmienić” metodę usuwania:

  • Jeśli usunięta osoba jest parzysta (tak jest w tym przypadku), następna usunięta osoba będzie na prawo od następnej „wybranej” osoby.
  • Jeśli usunięta osoba jest nieparzysta, następna usunięta osoba będzie na lewo od następnej „wybranej” osoby.

Kolejna wybrana osoba zależy również od poprzednio usuniętej osoby.

  • Jeśli usunięta osoba jest parzysta, następna wybrana osoba będzie po prawej stronie poprzedniej wybranej osoby.
  • Jeśli usunięta osoba jest nieparzysta, patrz wyżej, ale zamień „prawo” na „lewo”.

Zatem następna wybrana osoba jest 6.

Teraz usuwamy osobę po prawej stronie 6, czyli 5:

 1
6    3
    4

Ponieważ 5jest to dziwne, usunięta osoba jest teraz po lewej stronie. Nowa wybrana osoba to 1.

Teraz usuwamy 3:

 1
6
    4

Kontynuujemy ten proces, dopóki nie zostanie nam 1 liczba - w tym przykładzie ostatnia liczba to 1. Tak więc S(6) = 1.

Pierwsze kilka liczb to:

 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

Zadanie

Twoim zadaniem jest stworzenie programu (lub funkcji), który zwraca S(n)( nnumer th w sekwencji przełączania), gdy jest podany n, przy użyciu najmniejszej ilości bajtów.

Przykładowe dane wejściowe i wyjściowe:

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

Masz gwarancję uzyskania dodatniej liczby całkowitej.

To jest , więc wygrywa najkrótszy kod w bajtach!

Uwaga: Nie ma sekwencji OEIS (co?), Aby zaoszczędzić ci kłopotu z wyszukiwaniem.

clismique
źródło
7
Brak trafień w Oeis, aby zapisać wyszukiwanie użytkownikom.
xnor
Oczywiście 2nigdy nie pozostaje, ale czy tak 7?
Jonathan Allan
1
@JonathanAllan Właśnie sprawdziłem pierwsze 1000 terminów, a wynik jest obecnie „nie”. Nie jestem jednak pewien - czy powinienem uznać to za „wyzwanie poboczne”, które ludzie mogą próbować udowodnić? Jest przeznaczony na punkty brownie, więc nie umniejsza wyzwania.
clismique
Może stanie się to oczywiste, gdy ktoś wymyśli inną metodę niż przestrzeganie twoich instrukcji ...
Jonathan Allan,
3
Jak oczekujesz, że ludzie rozwiązują ten problem bez OEIS? Proszę, niech ktoś popchnie OEIS?
Erik the Outgolfer

Odpowiedzi:

4

Python 2, 183 94 bajty

-4 bajty dzięki Artyerowi (użyj input()i printzamiast defi return)
-1 bajt dzięki FlipTack (użyj print-~p[0]zamiast 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

To po prostu zgodnie z podanymi instrukcjami, zauważyłem jakiś wzorzec, może może być wykorzystany?

Jedyne zmiany to:

  • używać 0indeksowania opartego na (więc nawet ludzie są nieparzyści i odwrotnie) - pozwala to zaoszczędzić 5 bajtów w logice gry w golfa i na końcu jest poprawiane za pomocą+1
  • używać 1jako lewy i -1prawy (aby użyć zasięgu - tak jak wszyscy zamiast tego są skierowani na zewnątrz)
  • aby zmienić logikę kroku, w którym znajduje się następna wybrana osoba, która bierze udział w poptworzeniu listy, czyniąc indeks „wskaźnika” już krokiem w prawo na liście (lub w lewo w oryginalnej terminologii).

Nie golfowany:

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
Jonathan Allan
źródło
Czy ostatnia linia może być print-~p[0]?
FlipTack
Dlaczego tak może!
Jonathan Allan