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" .
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 .
Da dies eine „reine Sequenz“ Herausforderung ist, die Aufgabe zu Ausgang ist für ein gegebenen als Eingabe, wobei ist A163252 .
Aufgabe
Bei einer Ganzzahleingabe wird im Ganzzahlformat ( nicht im Binärformat) ausgegeben.
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.
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.
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.
- Es gelten die Standard- E / A-Regeln .
- Standardlücken sind verboten.
- Das ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes
Schlussbemerkung
Siehe die folgenden verwandten (aber nicht gleichen) PP & CG-Fragen:
JavaScript (ES6), 65 Byte
1-indiziert.
Probieren Sie es online!
Kommentiert
quelle
Jelly ,
2620 BytesProbieren 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
Hauptlink
quelle
Java (JDK) ,
14213812412313213098 BytesProbieren Sie es online!
quelle
import java.util.*;
+Set s=new HashSet();
bis Golf spielenvar 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. :)Stack
anstatt gespeichertHashSet
. Viel langsamer aber funktioniert!Python 2 , 81 Bytes
1-basierte Indizierung
Probieren Sie es online!
Python 2 , 79 Bytes
Dies nimmt viel Zeit in Anspruch (9999 wurde nach 7 Minuten lokaler Ausführung nicht beendet)
Probieren Sie es online!
quelle
Wolfram Language (Mathematica) , 74 Bytes
Probieren Sie es online!
quelle
APL (Dyalog Extended) , 46 Byte
Probieren Sie es online!
quelle
Kohle , 65 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:
Initialisiere das Ergebnis auf 0.
Loop-
n
Zeiten.Speichern Sie das vorherige Ergebnis, damit wir es nicht erneut verwenden.
Finden Sie das höchste Bit im vorherigen Ergebnis.
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.
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.
Geben Sie das Endergebnis am Ende der Schleife aus.
quelle
05AB1E ,
212018 BytesZiemlich ineffizient. Je größer die Eingabe, desto länger dauert es, das Ergebnis zu erhalten. Funktioniert aber auch für Eingaben
0
.Erläuterung:
quelle
Haskell , 101 Bytes
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.quelle
R , 90 Bytes
Probieren Sie es online!
quelle