Wir definieren die Funktion g als g (n) = n XOR (n * 2) für eine beliebige ganze Zahl n> 0 .
Wenn x> 0 ist , finde die kleinste ganze Zahl y> 0, so dass g k (y) = x für einige k> 0 ist .
Beispiel
x = 549
549 = 483 XOR (483 * 2) (as binary: 1000100101 = 111100011 XOR 1111000110)
483 = 161 XOR (161 * 2) (as binary: 111100011 = 10100001 XOR 101000010)
Was bedeutet, dass g 2 (161) = 549 ist . Wir können nicht weiter gehen, da es keine n , so dass g (n) 161 = . Die erwartete Ausgabe für x = 549 ist also y = 161 .
Regeln
- Sie dürfen keine ungültigen Einträge unterstützen. Für den Eingabewert x ist garantiert ein Paar (y, k) vorhanden .
- Das ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes!
Testfälle
3 --> 1
5 --> 1
6 --> 2
9 --> 7
10 --> 2
23 --> 13
85 --> 1
549 --> 161
960 --> 64
1023 --> 341
1155 --> 213
1542 --> 2
9999 --> 2819
57308 --> 19124
57311 --> 223
983055 --> 1
a(n) = g(n)
Antworten:
Java 8,
68575352 Bytes-5 Bytes dank @ OlivierGrégoire .
Probieren Sie es online aus.
Erläuterung:
quelle
n->{for(int i=0;i<n;)i-=(i*2^i)==n?n=i:-1;return n;}
(52 Bytes). Sorry ^^ 'for(int i=0;n>i-=i+i^i^n?-1:n=i;);
?i+i^i^n?
ist es kein Boolescher Wert, daher wird es nicht einmal kompiliert. Außerdemn>i-=...
wird parenthesis (n>(i-=...)
) benötigt undn=i
ist in der else-Klausel des ternary-if nicht erlaubt, nur in der if-Klausel (diese letzte weiß ich nicht warum, aber das ist es leider in Java ).n=i
ist in der else-Klausel des ternary-if nicht erlaubt". Weil Java es als(i-=(i*2^i)!=n?-1:n)=i
illegal analysieren würde .Python 2 ,
5453 BytesProbieren Sie es online!
quelle
JavaScript, 53 Byte
G
istg^-1
, die festgelegti
auf ,0
wenn der Erfolg, setzen Siei
auf ,1
wenn fehlgeschlagen.quelle
f=n=>(g=n=>n<2?0/!n:n%2+2*g(n/2^n%2))(n)?f(g(n)):n
. Leider ist der langweilige Ansatz 12 Bytes kürzer.Pyth ,
13 1210 Bytes1 Byte dank @MrXcoder und 2 weitere Bytes nach ihrem Vorschlag gespeichert
Probieren Sie es online aus
Erläuterung:
quelle
T
für 12 Bytes löschen.R ,
7365 BytesProbieren Sie es online!
Vielen Dank, Giuseppe (-8), aufgrund deiner Optimierungen, so einfach und doch sehr effektiv
quelle
f=
da die Funktion Bedürfnisse gebunden sein , umf
richtig zu funktionieren. Davon abgesehen, gute Arbeit, und nimm eine +1 von mir!JavaScript,
3836 BytesOnline testen - Startet das Auslösen von Überlauffehlern zwischen
9999
&57308
.quelle
Gelee ,
87 BytesVerwenden Sie
⁺¿
diese Option , um das letzte Element ungleich Null zurückzugeben (danke Dennis für -1 Byte).Probieren Sie es online!
Brute Force gewinnt erneut :(
quelle
^Ḥ)i$⁺¿
Speichert ein Byte.C (gcc) ,
57565551 Bytes!=
~-
.ein Bytefünf Bytes dank Rogem ; Verwendung des ternären Ausdrucks und der GCC-Macken.Probieren Sie es online!
quelle
X(O,R)
for(R=1;R;O=R?R:O)
Speichert ein Byte.R=O;
am ende scheint das unnötig zu sein und erspart euch weitere 4 bytes.Z80Golf , 22 Bytes
Portierung der Java-Antwort von @ KevinCruijssen
Beispiel mit Eingabe von 9-Online ausprobieren!
Beispiel mit Eingabe von 85-Online ausprobieren!
Versammlung:
Assembly-Beispiel zum Aufrufen der Funktion und zum Drucken des Ergebnisses:
quelle
a
stattdessen den Schleifenzähler erstellend
, können Sie dield d,0
Anweisungen durchxor a
beide Male ersetzen , wodurch zwei Bytes eingespart werden.Java (JDK 10) , 78 Byte
Probieren Sie es online!
quelle
JavaScript (Node.js),
484538 Bytes-7 Bytes dank @Neil, der unten eine rekursive Version meiner iterativen Version erstellt. Funktioniert nicht für große Testfälle.
Probieren Sie es online aus.
Iterative 45-Byte- Version, die für alle Testfälle funktioniert:
Port meiner Java-Antwort.
-3 Bytes dank @Arnauld .
Probieren Sie es online aus.
quelle
i-=i*2^i^n?-1:n=i
(aber leider nicht in Java).1
in JS. Vielen Dank!f=(n,i=0)=>i<n?i*2^i^n?f(n,i+1):f(i):n
Ruby , 39 Bytes
Probieren Sie es online!
Wie in der rekursiven Version zu erwarten, wird in letzteren Testfällen eine zu tiefe Stapelebene beanstandet.
quelle
Jelly ,
119 BytesProbieren Sie es online!
Tipps: Verwenden Sie rekursive Funktionen anstelle von Schleifen.
Sehr schnell, verliert leider an der Brute-Force-Annäherung.
Beachten Sie, dass:
Also haben wir wiederholt:
B
)^\
oderÄḂ
, sie haben den gleichen Effekt).?
) das Ende (letztes Element) (Ṫ
) des akkumulierten XOR ungleich Null ist (ungerade Popcount).ṛ
) zurückgegeben.quelle
B^\⁸Ḅß$Ṫ?
Viertens (gviertens) , 71 Bytes
Probieren Sie es online!
Erläuterung
quelle
Perl 6 , 44 Bytes
Versuch es
Erweitert:
quelle
Prolog (SWI) , 44 Bytes
Probieren Sie es online!
quelle
PHP, 49 Bytes
Basierend auf den Antworten von Kevin Cruijssen.
Laufen Sie als Pipe mit
-nr
oder versuchen Sie es online .quelle
F #, 92 Bytes
Probieren Sie es online!
Überprüft rekursiv die Zahlen von 1 bis
i-1
. Wenn eine Übereinstimmung vorliegt, suchen Sie nach einer kleineren für diese Nummer. Wenn es keine Übereinstimmung gibt, geben Sie die eingegebene Nummer zurück.quelle
JavaScript (Node.js) , 40 Byte
Probieren Sie es online!
Danke Shaggy für -1 Bytes.
Port meiner Gelee Antwort .
Schließlich gibt es eine Sprache, in der dieser Ansatz
kürzer ist( oops ). (Ich habe versucht, Python und Java , es funktioniert nicht)Kann mir jemand erklären, warum ich
/2
anstelle von verwenden kann>>1
?quelle
x/2
funktioniert wegen arithmetischem Unterlauf. Jede IEEE 754-Nummer wird schließlich als 0 gewertet, wenn sie zweimal geteilt wird. (Und der Dezimalteil wird beim XOR einfach ignoriert, daher hat dies keinen Einfluss auf das Ergebnis.)false
bei der letzten Iteration zurückgegebene Wert wird implizit0
vom bitweisen XOR-Operator umgewandelt.false
beteiligt . JS&&
verhält sich fast identisch zu Python / Luaand
.K (ngn / k) ,
3226 BytesProbieren Sie es online!
{
}
ist eine Funktion mit Argumentx
/
wendet es bis zur Konvergenz an$[
;
;
]
wenn-dann-sonst2\x
Binärziffern vonx
(dies ist spezifisch für ngn / k)+\
Teilsummen2!
mod 2a:
zuweisena
*|
last - reverse (|
) und get first (*
)Wenn der obige Wert 1 ist,
x
wird er zurückgegebenAndernfalls:
-1_a
Lasse das letzte Element von fallena
2/
binär dekodierenquelle
C 62 Bytes
Basierend auf Kevin Cruijssens Java:
int n(int j){for(int i=0;i<j;)i-=(i*2^i)==j?j=i:-1;return j;}
Zu testen:
Beim Ausführen gibt das Testprogramm Folgendes aus:
C 54 Bytes
Funktioniert nur mit C89 oder K & R C:
n(j){for(i=0;i<j;)i-=(i*2^i)==j?j=i:-1;return j;}
quelle
int n(int j){for(int i=0;j>i-=i*2^i^j?-1:j=i;);return j;}
Funktionieren diese 57 Bytes?Wolfram Language (Mathematica) , 58 Byte
Probieren Sie es online!
Beginnt mit einer Liste, die nur die Eingabe enthält. Ersetzt die Liste iterativ durch alle bereits enthaltenen Ganzzahlen oder ordnet sie durch die Operation double-and-xor zu. Dann
//.
sagt man dies bis zum Erreichen eines festen Punktes. Die Antwort ist das kleinste Element des Ergebnisses.quelle