Einleitung (kann ignoriert werden)
Es ist ein bisschen langweilig, alle positiven ganzen Zahlen in die reguläre Reihenfolge (1, 2, 3, ...) zu bringen, nicht wahr? Hier ist also eine Reihe von Herausforderungen im Zusammenhang mit Permutationen (Umformungen) aller positiven ganzen Zahlen. Dies ist die sechste Herausforderung in dieser Reihe (Links zur ersten , zweiten , dritten , vierten und fünften Herausforderung).
Diese Herausforderung hat ein mildes Osterthema (weil es Ostern ist). Ich habe mich von diesem hoch dekorierten (und meiner persönlichen Meinung nach eher hässlichen) Gänseei inspirieren lassen.
Es erinnerte mich an die Ulam-Spirale , bei der alle positiven ganzen Zahlen in einer Spirale gegen den Uhrzeigersinn angeordnet sind. Diese Spirale hat einige interessante Merkmale im Zusammenhang mit Primzahlen, aber das ist für diese Herausforderung nicht relevant.
Wir kommen zur Permutation dieser Herausforderung von positiven ganzen Zahlen, wenn wir die Zahlen in der Ulam-Spirale nehmen und alle ganzen Zahlen in einer im Uhrzeigersinn drehenden Spirale ab 1 verfolgen. Auf diese Weise erhalten wir:
1, 6, 5, 4, 3, 2, 9, 8, 7, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 25, 24, 23, etc.
Wenn Sie beide Spiralen zeichnen würden, würden Sie eine Art unendliches Netz von (Eierschalen-) Spiralen erhalten ( beachten Sie die New Order- Referenz dort ).
Diese Sequenz ist im OEIS unter der Nummer A090861 vorhanden . Da dies eine „reine Sequenz“ Herausforderung ist, die Aufgabe zu Ausgang ist für eine gegebene als Eingabe, wobei ist A090861 .
Aufgabe
Bei einem gegebenen ganzzahligen Eingangs , Ausgabe im Ganzzahlformat, wobei ist A090861 .
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 | 3
20 | 10
50 | 72
78 | 76
123 | 155
1234 | 1324
3000 | 2996
9999 | 9903
29890 | 29796
Regeln
- Eingabe und Ausgabe sind Ganzzahlen.
- Ihr Programm sollte mindestens Eingaben 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.
- Es gelten die Standard- E / A-Regeln .
- Standardlücken sind verboten.
- Das ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes
JavaScript (ES7),
46 4541 Byte0-indiziert.
Probieren Sie es online!
Wie?
Dies basiert auf der 1-indizierten Formel, die in den Beispielprogrammen von A090861 verwendet wird .
Probieren Sie es online!
Probieren Sie es online!
Probieren Sie es online!
Welches kann übersetzt werden in:
Wenn Sie den Index auf 0 setzen, werden sofort 5 Bytes gespart:
Die Formel kann weiter vereinfacht werden durch:
was ausgedrückt werden kann als:
führt zu:
und schlussendlich:
quelle
Wolfram Language (Mathematica) , 60 Byte
Probieren Sie es online!
quelle
MATL ,
1211 BytesProbieren Sie es online!
Sehr speicherineffizient. Das Vorbereiten
X^k
macht es effizienter .quelle
C # (Visual C # Interactive Compiler) , 67 Byte
Probieren Sie es online!
quelle
Python 3.8,
10474656057 BytesEdit: Danke an Johnathan Allan für die 74 bis 57 Bytes!
Diese Lösung verwendet eine 0-basierte Indizierung.
quelle
>
anstelle von<=
undx*x
anstelle vonx**2
...def f(n):x=((n-1)**.5+1)//2;return 8*x**2+(-2,6)[n>4*x*x+2*x]*x+2-n
Python 3.8 (Vorabversion) , 53 Byte
Ein direkter Anschluss von Arnaulds JavaScript Antwort , geht upvote dass und / oder J42161217 Mathematica Antwort und / oder Kapocsi Python Antwort :)
0-indiziert.
Probieren Sie es online!
quelle
Befunge,
6757 BytesDiese Lösung setzt eine 0-basierte Indizierung der Eingabewerte voraus.
Probieren Sie es online!
Erläuterung
Wir beginnen mit der Berechnung des "Radius", bei dem die Eingabe n gefunden wird, mit einer Schleife:
Am Ende der Schleife ist der vorherige Wert von n der Versatz in die Spirale bei diesem Radius:
Wir können dann wie folgt feststellen, ob wir uns im oberen oder unteren Bereich der Spirale befinden:
Und wenn wir alle diese Details haben, wird der Spiralwert berechnet mit:
Der Radius ist der einzige Wert, den wir als "Variable" speichern müssen. Er ist in Befunge-93 auf einen Maximalwert von 127 begrenzt, sodass dieser Algorithmus Eingaben bis zu 65024 verarbeiten kann.
quelle
Japt , 15 Bytes
Port of Jonathans Jelly-Lösung. 1-indiziert.
Versuch es
quelle
x+(1-x%2)
istx|1
(ein Byte in Jelly zu speichern), die diese Antwort auch profitieren können, ich wette.C ++ (gcc) , 88 Bytes
1-indiziert; Verwendet die Formel auf der OEIS-Seite, wurde jedoch manipuliert, um einige Bytes zu sparen.
Probieren Sie es online!
quelle
sqrt(n-1)/2+.5
anstelle von(sqrt(n-1)+1)/2