Neue Bestellung Nr. 2: Turn My Way

15

Einleitung (kann ignoriert werden)

Es ist ein bisschen langweilig, alle positiven Zahlen in der regulären Reihenfolge (1, 2, 3, ...) anzuordnen, nicht wahr? Hier ist also eine Reihe von Herausforderungen im Zusammenhang mit Permutationen (Umformungen) aller positiven Zahlen. Dies ist die zweite Herausforderung in dieser Reihe. Die erste Herausforderung finden Sie hier .

Bei dieser Herausforderung verwenden wir Gray-Codes, um die natürlichen Zahlen neu zu ordnen. Ein Gray-Code oder "gespiegelter Binärcode" ist eine Binärcodierung, bei der sich zwei aufeinanderfolgende Werte in nur einem Bit unterscheiden. Eine praktische Anwendung dieser Kodierung ist die Verwendung in Drehgebern , daher mein Verweis auf "Turn My Way" .

Drehgeber für Winkelmessgeräte mit 3-Bit-Binärkennzeichnung.

Beachten Sie, dass diese Codierung einen gewissen Freiheitsgrad lässt. Beispielsweise gibt es nach der Binärzahl 1100 vier mögliche folgende Codes: 1101, 1110, 1000 und 0100. Aus diesem Grund definiere ich als den kleinsten, bisher nicht verwendeten Wert, der sich in der Binärkodierung nur um ein Zeichen unterscheidet. Diese Reihenfolge entspricht A163252 .ein(n)

Da dies eine „reine Sequenz“ Herausforderung ist, die Aufgabe zu Ausgang ist für ein gegebenen als Eingabe, wobei ist A163252 .ein(n)nein(n)

Aufgabe

Bei einer Ganzzahleingabe wird im Ganzzahlformat ( nicht im Binärformat) ausgegeben.nein(n)

ein(n)a ( n - 1 ) a ( n ) ist definiert als die am wenigsten positive Ganzzahl, die nicht früher in der Sequenz auftritt, so dass sich und in nur einem Bit unterscheiden, wenn sie in Binärform geschrieben sind.ein(n-1)ein(n)

Hinweis: Hier wird eine 1-basierte Indizierung angenommen. Sie können eine 0-basierte Indizierung verwenden, also usw. Bitte erwähnen Sie dies in Ihrer Antwort, wenn Sie dies verwenden möchten.ein(0)=1;ein(1)=3

Testfälle

Input | Output
--------------
1     | 1
5     | 4
20    | 18
50    | 48
123   | 121
1234  | 1333
3000  | 3030
9999  | 9997

Regeln

  • Eingabe und Ausgabe sind ganze Zahlen (Ihr Programm sollte mindestens Eingabe und Ausgabe im Bereich von 1 bis 32767 unterstützen)
  • Ungültige Eingaben (0, Gleitkommazahlen, Zeichenfolgen, negative Werte usw.) können zu unvorhergesehenen Ausgaben, Fehlern oder (un) definiertem Verhalten führen. In A163252 wird als 0 definiert. Bei dieser Herausforderung werden wir dies ignorieren.ein(0)
  • Es gelten die Standard- E / A-Regeln .
  • Standardlücken sind verboten.
  • Das ist , also gewinnt die kürzeste Antwort in Bytes

Schlussbemerkung

Siehe die folgenden verwandten (aber nicht gleichen) PP & CG-Fragen:

wie auch immer
quelle

Antworten:

1

Stax , 19 17 Bytes

êÑ{╚α8è╙mc┼σ▀»É▲ü

Führen Sie es aus und debuggen Sie es

Aufgrund der hartcodierten Iteration des Bitindex funktioniert es zu einem bestimmten Zeitpunkt nach der angegebenen Domäne nicht mehr. (32767)

Ausgepackt, ungolfed und kommentiert sieht es so aus.

z0,         push an empty array, literal zero, and the input, in that order
             - the zero represents the last calculated value in the sequence
             - the array contains all the previous ones
D           repeat the rest of the program n times (from input)
  +         append the last calculated value to the array
  17r       [0 .. 16] (these are the bit indices necessary to cover the input range)
  {|2nH|^m  calculate candidate values; previous value with each of these bits toggled 
  n-        remove all values previously calculated
  |m        keep the minimum candidate remaining

Führen Sie dieses aus

rekursiv
quelle
Sie sind 1 Byte hinter der kürzesten 05AB1E-Antwort. Planen Sie, dies weiter zu optimieren? Ansonsten akzeptiere ich Kevins Antwort ...
bis zum
1
Wenn ich die Gelegenheit habe, werde ich heute daran arbeiten, irgendwann in den nächsten 14 Stunden.
rekursiver
Gut. Ich werde es für einen weiteren Tag offen halten. Viel Glück!
Am
@agtoever: Danke. Ich bin jetzt fertig.
rekursiver
Gut gemacht! Du gewinnst! Herzliche Glückwünsche!
27.
4

JavaScript (ES6), 65 Byte

1-indiziert.

n=>{for(o=p=[k=1];o[k]|~-(i=p^k)&i?k++:k=o[p=k]=!!n--;);return p}

Probieren Sie es online!

Kommentiert

n => {                  // n = index of requested term
  for(                  // for loop:
    o =                 //   o = storage object for the terms of the sequence
    p =                 //   p = last term found in the sequence
      [k = 1];          //   k = current term
    o[k] |              //   if k was already encountered
    ~-(i = p ^ k) & i ? //   or (p XOR k) has more than 1 bit set:
      k++               //     increment k
    :                   //   else:
      k = o[p = k]      //     set o[k], set p to k
        = !!n--;        //     stop if n is equal to 0 or set k to 1; decrement n
  );                    // end of for()
  return p              // return p
}                       // end
Arnauld
quelle
Bei TIO wird ein Stapelüberlauf für n> ~ 1024 angezeigt. Irgendwelche Vorschläge, wie man damit in Abu anderen Umgebungen umgeht? Regel: " Ihr Programm sollte mindestens Eingaben und Ausgaben im theoretischen Bereich von 1 bis 32767 unterstützen "
bis zum
1
@agtoever Ich habe es auf eine nicht-rekursive Version aktualisiert.
Arnauld
4

Jelly , 26 20 Bytes

ṀBLŻ2*^1ị$ḟ⁸Ṃ;
0Ç⁸¡Ḣ

Probieren Sie es online!

Ein vollständiges Programm, das n als einziges Argument verwendet. Funktioniert für alle Testfälle. Beachten Sie auch, dass n = 0 gilt, obwohl dies nicht erforderlich ist.

Erläuterung

Hilfslink: Nächstes Semester suchen und voranstellen

Ṁ              | maximum of list so far
 B             | convert to binary
  L            | number of binary digits
   Ż           | 0..above number
    2*         | 2 to the power of each of the above
      ^        | exclusive or with...
       1ị$     | ... the most recent term in the list so far
          ḟ⁸   | filter out anything used already
            Ṃ  | find the minimum
             ; | prepend to existing list

Hauptlink

0              | start with zero
 Ç             | call the above link
  ⁸¡           | and repeat n times
    Ḣ          | take the last term added
Nick Kennedy
quelle
3

Java (JDK) , 142 138 124 123 132 130 98 Bytes

n->{int s[]=new int[9*n],j,k=0;for(;n-->0;s[k=j]++)for(j=0;s[++j]>0|n.bitCount(j^k)>1;);return k;}

Probieren Sie es online!

Daniel Widdis
quelle
1
Ich befürchte, Importe müssen in die Byteanzahl einbezogen werden. Sie können jedoch das import java.util.*;+ Set s=new HashSet();bis Golf spielen var s=new java.util.HashSet();. Darüber hinaus kann der Rest zu golfed werden: Integer i=0,j,k=0;for(;i++<n;s.add(k=j))for(j=0;s.contains(++j)|i.bitCount(j^k)>1;);return k;. Gute Antwort, also +1 von mir. :)
Kevin Cruijssen
1
2 weitere Bytes mit Stackanstatt gespeichert HashSet. Viel langsamer aber funktioniert!
Daniel Widdis
1
Ö(n)Ö(nn)
2
Mit dem zweiten Golf, den ich in meinem ersten Kommentar vorgeschlagen habe, können Sie es immer noch auf 126 Bytes spielen . :)
Kevin Cruijssen
2
98 Bytes .
Olivier Grégoire
2

Python 2 , 81 Bytes

1-basierte Indizierung

l=[0];p=0
exec"n=0\nwhile(p^n)&(p^n)-1or n in l:n+=1\np=n;l+=p,;"*input()
print p

Probieren Sie es online!


Python 2 , 79 Bytes

Dies nimmt viel Zeit in Anspruch (9999 wurde nach 7 Minuten lokaler Ausführung nicht beendet)

l={0};p=0;n=input()
exec'p=min({p^2**k for k in range(n)}-l);l|={p};'*n
print p

Probieren Sie es online!

ovs
quelle
1
Die maximale Eingabe 32767 wird nicht unterstützt (die Standard-Rekursionstiefe ist nicht systemabhängig).
Erik der Outgolfer
Auch der angegebene Testfall 9999 wird nicht unterstützt. :)
Daniel Widdis
@EriktheOutgolfer Es wurde in einen iterativen Ansatz geändert. Wahrscheinlich wird es auf TIO immer noch nicht rechtzeitig beendet, läuft aber lokal einwandfrei.
Ovs
@ovs Oh, Timeouts alleine sind egal.
Erik der Outgolfer
Cool! Ich habe es gerade für n = 9999 ausprobiert und es wurde nach ungefähr einer Stunde erfolgreich abgeschlossen. +1. Yay! ;-)
seit dem
1

Kohle , 65 Bytes

≔⁰θFN«⊞υθ≔¹ηW¬‹θ⊗η≦⊗ηW∧›η¹∨¬&θη№υ⁻θη≧÷²ηW№υ⁻|θη&θη≦⊗η≔⁻|θη&θηθ»Iθ

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:

≔⁰θ

Initialisiere das Ergebnis auf 0.

FN«

Loop- nZeiten.

⊞υθ

Speichern Sie das vorherige Ergebnis, damit wir es nicht erneut verwenden.

≔¹ηW¬‹θ⊗η≦⊗η

Finden Sie das höchste Bit im vorherigen Ergebnis.

W∧›η¹∨¬&θη№υ⁻θη≧÷²η

Während dieses Bit größer als 1 ist, versuchen Sie, wenn das Bit im vorherigen Ergebnis gesetzt ist, dieses Bit zu subtrahieren, um festzustellen, ob das Ergebnis ein unsichtbares Ergebnis ist. Dies stellt sicher, dass die potenziellen Ergebnisse in aufsteigender Reihenfolge des Werts versucht werden.

W№υ⁻|θη&θη≦⊗η

Versuchen Sie nun, das Bit mit dem vorherigen Ergebnis zu XOREN, und verdoppeln Sie das Bit, bis ein unsichtbares Ergebnis gefunden wird. Dies behandelt die Fälle, in denen ein Bit gesetzt werden muss, wieder in aufsteigender Reihenfolge des Werts, aber auch den Fall, in dem das niedrigstwertige Bit umgeschaltet werden muss, was die vorherige Schleife nicht zu testen läst (weil es golfer zu testen ist) das hier). Wenn die vorherige Schleife ein unsichtbares Ergebnis liefert, wird diese Schleife nie ausgeführt. Wenn dies nicht der Fall ist, wird diese Schleife diese Ergebnisse unnötigerweise erneut testen.

≔⁻|θη&θηθ

Aktualisieren Sie das Ergebnis, indem Sie das Bit damit tatsächlich XOR-verknüpfen.

»Iθ

Geben Sie das Endergebnis am Ende der Schleife aus.

Neil
quelle
1

05AB1E , 21 20 18 Bytes

ÎFˆ∞.Δ¯θy^bSO¯yå_*

Ziemlich ineffizient. Je größer die Eingabe, desto länger dauert es, das Ergebnis zu erhalten. Funktioniert aber auch für Eingaben 0.

n

Erläuterung:

Î                # Push 0 and the input
 F               # Loop the input amount of times:
  ˆ              #  Pop the current number and add it to the global_array
  ∞.Δ            #  Inner loop starting at 1 to find the first number which is truthy for:
     ¯θy^        #   XOR the last number of the global_array with the loop-number `y`
         b       #   Convert it to binary
          SO     #   Sum it's binary digits
     ¯yå_        #   Check if the loop-number `y` is NOT in the global_array yet
            *    #   Multiply both (only if this is 1 (truthy), the inner loop will stop)
                 # (after the loops, output the top of the stack implicitly)
Kevin Cruijssen
quelle
1

Haskell , 101 Bytes

import Data.Bits
(u!n)0=n
(u!n)m|q<-minimum[x|r<-[0..62],x<-[xor(2^r)n],notElem x u]=(n:u)!q$m-1
[]!0

Probieren Sie es online!

Es scheint eine Schande zu sein, einen Import zu tätigen xor, aber ich habe noch keine gute Lösung gefunden. Ich frage mich auch, ob es einen besseren Weg gibt, die Schleife auszudrücken.

dfeuer
quelle