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.


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

Czy ostatnia linia może być print-~p[0]?
— FlipTack

Dlaczego tak może!
— Jonathan Allan
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.