Die Schaltsequenz

11

Intro

Die Schaltsequenz ist wie folgt definiert:

Beginnen Sie mit nPersonen, die in einem Kreis stehen ( 6für dieses Beispiel).

 1  2
6    3
 5  4

Ausgehend von der Person 1wird die Person entfernt, die sich links von der "ausgewählten" Person befindet.

 1
6    3
 5  4

Die entfernte Person kann die Entfernungsmethode "umschalten":

  • Wenn die entfernte Person gerade ist (was in diesem Fall der Fall ist), befindet sich die nächste entfernte Person rechts von der nächsten "ausgewählten" Person.
  • Wenn die entfernte Person ungerade ist, befindet sich die nächste entfernte Person links von der nächsten "ausgewählten" Person.

Die nächste ausgewählte Person ist auch von der zuvor entfernten Person abhängig.

  • Wenn die entfernte Person gerade ist, befindet sich die nächste ausgewählte Person rechts von der zuvor ausgewählten Person.
  • Wenn die entfernte Person ungerade ist, siehe oben, aber ersetzen Sie "rechts" durch "links".

Also ist die nächste gewählte Person dann 6.

Jetzt entfernen wir die Person rechts von 6, das ist 5:

 1
6    3
    4

Weil 5es seltsam ist, befindet sich die entfernte Person jetzt links. Die neu gewählte Person ist 1.

Wir entfernen jetzt 3:

 1
6
    4

Wir setzen diesen Prozess fort, bis wir 1 Nummer haben - in diesem Beispiel ist die endgültige Nummer 1. Also deshalb S(6) = 1.

Die ersten Zahlen sind:

 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

Aufgabe

Ihre Aufgabe ist es, ein Programm (oder eine Funktion) zu erstellen, das bei Angabe mit der geringsten Anzahl von Bytes S(n)(die ndritte Nummer in der Schaltsequenz) zurückgibt n.

Beispiel für Ein- und Ausgänge:

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

Sie erhalten garantiert eine positive Ganzzahl.

Dies ist , also gewinnt der kürzeste Code in Bytes!

Hinweis: Es gibt keine OEIS-Sequenz (was?), Um Ihnen die Suche zu ersparen.

Clismique
quelle
7
Keine Treffer auf oeis, um den Leuten die Suche zu ersparen.
xnor
Offensichtlich 2bleibt nie, aber tut 7?
Jonathan Allan
1
@ JonathanAllan Ich habe gerade nach den ersten 1000 Begriffen gesucht und das Ergebnis ist derzeit "Nein". Ich bin mir jedoch nicht sicher - sollte ich das als "Nebenherausforderung" bezeichnen, die die Leute zu beweisen versuchen können oder so? Es ist für Brownie-Punkte, damit es die Herausforderung nicht beeinträchtigt.
Clismique
Vielleicht wird es offensichtlich sein, wenn jemand eine andere Methode findet, als Ihren Anweisungen zu folgen ...
Jonathan Allan
3
Wie erwarten Sie, dass Menschen dies ohne OEIS lösen? Jemand schiebt bitte einen OEIS?
Erik der Outgolfer

Antworten:

4

Python 2, 183 94 Bytes

-4 Bytes dank Artyer (verwenden input()und printstatt defund return)
-1 Byte dank FlipTack (verwenden print-~p[0]statt und 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

Dies folgt nur den Anweisungen gegeben, ich habe ein Muster bemerkt, vielleicht könnte es ausgenutzt werden?

Die einzigen Änderungen sind:

  • um eine 0basierte Indizierung zu verwenden (so dass gerade Leute ungerade sind und umgekehrt) - dies spart 5 Bytes in der Golflogik und wird am Ende mit korrigiert+1
  • Gebrauch 1als links und -1als rechts (eine Auswahl verwenden - wie jeder nach außen statt konfrontiert ist )
  • Um die Logik des Schritts zu ändern, in dem die nächste ausgewählte Person popaus der Liste berücksichtigt wird , wird der "Zeiger" -Index bereits Schritt eins rechts in der Liste (oder links in der ursprünglichen Terminologie).

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
Jonathan Allan
quelle
Kann die letzte Zeile sein print-~p[0]?
FlipTack
Warum ja kann es!
Jonathan Allan