Einführung
In dieser Herausforderung werden wir uns mit einer bestimmten Reihenfolge der positiven ganzen Zahlen befassen. Die Bestellung geht so:
3, 5, 7, 9, 11, ...
2*3, 2*5, 2*7, 2*9, 2*11, ...
4*3, 4*5, 4*7, 4*9, 4*11, ...
8*3, 8*5, 8*7, 8*9, 8*11, ...
16*3, 16*5, 16*7, 16*9, 16*11, ...
...
... 64, 32, 16, 8, 4, 2, 1
Wir listen zuerst alle ungeraden ganzen Zahlen größer als 1 in aufsteigender Reihenfolge auf. Dann führen wir zwei mal ungerade ganze Zahlen größer als 1, dann 4 - mal, dann 8 mal, und so weiter: für alle k , wir listen 2 k mal die ungeraden Zahlen größer als 1 , um aufzusteigen. Schließlich listen wir die Potenzen von zwei in absteigender Reihenfolge auf und enden bei 1. Jede positive ganze Zahl kommt in dieser "Liste" genau einmal vor.
Man betrachte genauer gesagt zwei verschiedene positive ganze Zahlen A = n · 2 p und B = m · 2 q , wobei n, m ≥ 1 ungerade sind und p, q ≥ 0 . In der Bestellung steht dann A vor B , wenn eine der folgenden Bedingungen zutrifft:
- n> 1 , m> 1 und p <q
- 1 <n <m und p = q
- n> m = 1
- n = m = 1 und p> q
Diese Ordnung kommt in dem überraschenden mathematischen Ergebnis vor, das als Sharkovski-Theorem bekannt ist und die periodischen Punkte dynamischer Systeme betrifft. Ich werde hier nicht auf die Details eingehen.
Die Aufgabe
Ihre Aufgabe bei dieser Herausforderung ist es, die obige Bestellung zu berechnen. Ihre Eingaben sind zwei positive ganze Zahlen A und B , die gleich sein können. Ihre Ausgabe ist ein wahrer Wert, wenn A in der Bestellung vor B steht , und ein falscher Wert, wenn nicht. Wenn A = B , sollte Ihre Ausgabe wahr sein. Sie können A und B in beliebiger Reihenfolge nehmen, solange Sie konsistent sind.
Sie müssen sich keine Gedanken über einen Ganzzahlüberlauf machen, aber Ihr Algorithmus sollte theoretisch für beliebig große Eingaben funktionieren.
Testfälle
Wahrheitsinstanzen
3 11
9 6
48 112
49 112
158 158
36 24
14 28
144 32
32 32
32 8
3 1
1 1
Falsche Instanzen
1 2
1 5
11 5
20 25
2 8
256 255
256 257
72 52
2176 1216
2176 2496
a&1|~b&1&f(a/2,b/2)
funktionierenb<2
es irgendwann wahr sein wird. Ein weiteres Problem ist, dass Sie mehr Iterationen als erforderlich verarbeiten und Gleitkommawerte erhalten. Aber ich kann kein Gegenbeispiel finden, das nicht wie erwartet funktioniert.b<2
ursprünglich nicht verwendet , aber ich denke, es wird jetzt funktionieren.f(a/2,b/2)
nur zurückkehrt0
,1
,false
odertrue
, ich brauche nicht einmal das&1
.Python 2, 50 Bytes
Jede Nummer wird einem Tripel zugeordnet, dessen sortierte Reihenfolge die gewünschte Reihenfolge ist.
[-n][n&n-1:]
, der die Potenzen von 2 am Ende behandelt. Das bitweise "und"n&n-1
ist genau dann Null, wennn
eine Potenz von ist2
. In diesem Fall erhalten wir die Liste[-n]
und ansonsten die leere Liste[]
. Dies setzt alle Potenzen von 2 am Ende der Reihenfolge in absteigender Reihenfolge.n&-n
extrahiert den Faktor der Zweierpotenz vonn
.n
tiebreaks gleich Potenzen von 2 zugunsten der größeren Anzahl.Die jeweiligen Tupel werden übergeben,
cmp
um festzustellen, ob dieser Vergleich vorliegt<=0
. Python 3 würde ein Byte mit Gleitkommadivision(n&n-1<1)/n
für den ersten Wert im Tripel speichern , aber es fehltcmp
.quelle
cmp(...)<=0
gleichbedeutend mitcmp(...)<1
?~
stattdessen<1
JavaScript (ES6),
7064 BytesKönnte wohl noch etwas mehr golfen werden, aber als ersten Versuch:
Übernimmt Eingaben mit Curry-Syntax
(x)(y)
. Rückgabe0
/1
.Testfälle
Code-Snippet anzeigen
quelle
b>a||(b==a&&y>=x)
herausnehmen, was für die Ausführung keinen Unterschied macht.[1, 5]
würde fälschlicherweise als wahr identifiziert.Perl 6 ,
8984 Bytes( Probieren Sie es online. )
Nicht gerade kurz, aber ich dachte, es wäre interessant, eine Lösung zu schreiben, die tatsächlich die Reihenfolge generiert (bis zu einer sicheren Obergrenze für jede Teilsequenz) und dann prüft, welche Eingabe zuerst darin erscheint.
Beispielsweise:
Für die Eingabe
... und stellt dann fest, dass2, 3
generiert es:3
das vorher erscheint2
.Für die Eingabe
... und stellt dann fest, dass9, 6
generiert es:9
das vorher erscheint6
.Es könnte intelligenter sein und noch weniger von der Sequenz erzeugen, aber das würde mehr Byte Code erfordern.
quelle
Python 2, 54 Bytes
Eine rekursive Lösung ähnlich der von Neil.
quelle
f(158,158)
ist falsch undf(2,8)
ist wahr.f(1,5)
ist falsch.f(1,5)
sollte False sein, aber der Code gibt True.Mathematica, 65 Bytes
Unbenannte Funktion, die eine Liste positiver Ganzzahlen aufnimmt und zurückgibt,
True
wenn die Liste eine aufsteigende Reihenfolge in der Sharkovskii-Reihenfolge bildet,False
andernfalls. (Insbesondere muss die Eingabeliste nicht nur zwei Elemente enthalten - wir erhalten die hinzugefügte Funktionalität kostenlos.)Das Herzstück des Algorithmus ist die Funktion
{1,#}&/@#//.{a_,b_/;EvenQ@b}->{2a,b/2}
, mit der wiederholt Faktoren von 2 verschoben werden, um eine ganze Zahl der Formm*2^k
mitm
ungeraden Werten in das geordnete Paar{2^k,m}
(und damit in jedes Element der Eingabeliste) umzuwandeln .OrderedQ
entscheidet dann, ob die resultierende Liste geordneter Paare bereits sortiert ist; Standardmäßig bedeutet dies, dass die Reihenfolge um das erste Element und die Reihenfolge um das zweite Element erhöht wird.Das ist genau das, was wir wollen, außer dass Zahlen, die Potenzen von 2 sind, unterschiedlichen Regeln folgen. Bevor
OrderingQ
wir mit einchecken , wenden wir eine letzte Regel an/.{a_,1}->{∞,-a}
, die (zum Beispiel){64,1}
in konvertiert{∞,-64}
; das setzt Potenzen von 2 an der richtigen Stelle in der Reihenfolge.quelle
Haskell,
143138 BytesGrundsätzlich eine relativ einfache Umsetzung der Kriterien:
Probieren Sie es online!
quelle
Python,
159158153144142141 BytesGespeichert
eine2 - Byte dank Kritixi Lithos!Dies dient hauptsächlich zum Üben des Golfspiels mit meiner Python!
Verwendete die vom OP gegebene Formel und nicht die Art und Weise aller klügeren Antworten
quelle
(a, b)
der zweiten Zeile, in der Sie das Leerzeichen zwischen dem Komma und entfernen könnenb
.