Dies ist ein mathematisches Problem, das ziemlich viele Dinge in Frage stellt und es ziemlich herausfordernd macht, und wie Sie vielleicht vermutet haben, ist es ein Code-Golf, also sollte es so kurz wie möglich sein.
Der Eingang , n
ist jede ganzzahlige Anzahl (mindestens Unterstützung ganze Zahlen, müssen aber nicht darauf beschränkt zu sein). Die Ausgabe ist der Durchschnitt von:
n
- Das Quadrat von
n
- Die nächste Primzahl zu
n
- Die nächstliegende Zahl
n
in der Fibonacci-Sequenz
In Kürze sollte das Programm das Ergebnis von auf dem Standardausgangskanal ausgeben .(n+(n*n)+closestPrime(n)+closestFib(n))/4
Sie müssen sich nicht um mögliche Überläufe usw. kümmern. Normale Gleitkomma-Genauigkeit ist ebenfalls in Ordnung.
Die Art und Weise, wie die Eingabe erfolgt, liegt ganz bei Ihnen. Das kürzeste Programm (in Zeichen) gewinnt, wie immer bei Code Golfs.
Wählen Sie eine der folgenden Optionen, falls bei der Suche nach der nächstgelegenen ein Unentschieden auftritt:
- Geh hinauf
- Gehen
- Wähle eine zufällig aus
Antworten:
Python 160 Zeichen
Eine kleine Erklärung zum nächsten Fib-Teil:
quelle
[b,a][2*N-a-b<0]
:)GolfScript, 59 Zeichen
Dieses Skript erfüllt einige der Anforderungen nicht:
n >= 2
, sonst stürzt es ab.n
Eine kurze Anleitung zum Code:
~:N..*
Die Eingabe wird in N gespeichert und wir drücken beiden
und das Quadratn*n
sofort..,2>
Wir werden eine Liste von Primzahlen erzeugen, indem wir das Array filtern[2..n*n]
. Wir verwenden unsere vorherige Berechnung vonn*n
als (sehr schlechte!) Obergrenze, um eine Primzahl zu finden, die größer als n ist.{:P{(.P\%}do(!},
Unser bisheriges Array wird nach Testdivision gefiltert. Jede Ganzzahl P wird gegen jede Ganzzahl [P-1..1] getestet.{{N-.*}$0=}:C~
Sortiert das vorherige Array basierend auf dem Abstand zun
und erfasst das erste Element. Jetzt haben wir die nächste Primzahl.[1.{.@+.N<}do]C
Wir erzeugen Fibonnacis, bis wir eins größer als erhaltenn
. Glücklicherweise verfolgt dieser Algorithmus natürlich die vorherigen Fibonnaci, sodass wir beide in ein Array werfen und unsere frühere Entfernungssortierung verwenden. Jetzt haben wir die nächsten Fibonnaci.+++4/
Durchschnittlich. Beachten Sie, dass GolfScript keine Floats unterstützt, sodass das Ergebnis abgeschnitten wird.GolfScript, 81 Zeichen
Hier ist eine Variante, die alle Anforderungen erfüllt.
Um ein einwandfreies Verhalten zu gewährleisten
n<2
, vermeide ich2<
(stürzt ab, wenn das Array klein ist) und verwende stattdessen3,|2,^
. Dies stellt sicher, dass das Hauptkandidatenarray genau[2]
dann ist, wennn < 2
. Ich habe die Obergrenze für die nächste Primzahl vonn*n
nach2*n
( Bertrands Postulat ) geändert . Auch 0 gilt als Fibonnaci-Zahl. Das Ergebnis wird am Ende in Festkomma-Mathematik berechnet. Interessanterweise scheint das Ergebnis immer in Vierteln zu sein (0, .25, .5, .75), daher hoffe ich, dass 2 Dezimalstellen Genauigkeit ausreichen.Mein erster Riss bei der Verwendung von GolfScript, ich bin sicher, es gibt Raum für Verbesserungen!
quelle
JavaScript, 190
[257]
Unkomprimiert:
quelle
a=0
und positiv erhöhen. AnstattisPrime
nacha
und zu suchenb
, überprüfen Sie einfachisPrime(n+a)
undisPrime(n-a)
. Sie könnten wahrscheinlich alles zu einer verrückten ternären Aussage zusammenfassen, aber ich bin schrecklich mit Javascript.function closestPrime(n,o){return isPrime(n+o)?n+o:isPrime(n-o)?n-o:closestPrime(n,o+1);}
. Nennen Sie es alsclosestPrime(n,0)
und es wird von selbst funktionieren. Bei Bedarf kürzen.Mathematica,
7069 BytesDank Sp3000 wird ein Byte gespart (manchmal sind integrierte Funktionen nicht der beste Weg).
Dies definiert eine unbenannte Funktion, die eine ganze Zahl verwendet und den exakten Mittelwert als rationale Zahl liefert. Bei Gleichstand wird die kleinere Primzahl / Fibonacci-Zahl gewählt.
Dies ist für große Eingaben sehr ineffizient, da die ersten
2n
Primzahlen und Fibonacci-Zahlen generiert werden, bevor die nächstgelegenen ausgewählt werden.quelle
#&@@#
.. Huh?#
ist das Argument einer reinen Funktion (vonf
). In diesem Fall ist es eigentlich eine Funktion selbst, daf
aufPrime
und angewendet wirdFibonacci
. Damit wird#@Range@...
die angegebene Funktion auf jede Ganzzahl im Bereich angewendet. Dann#&@@
ist es nur eine gute Möglichkeit , das erste Element einer Liste zu extrahieren. Es funktioniert, indem es#&
auf die Liste angewendet wird, eine Funktion, die lediglich das erste Argument zurückgibt.Q, 119
Nicht die effizienteste.
quelle
MATLAB 88 Zeichen
n ist deine ganze Zahl
Funktioniert mit Nicht-Ganzzahlen, soweit ich es getestet habe, funktioniert es auch mit sehr großen Zahlen, läuft auch verdammt schnell.
quelle
Scala 299
Test und Aufruf:
Die Frage spricht,
any Integer
aber das Problem ist für Werte unter 0 nicht so interessant. Doch wie fangen wir an? Bei 0? Um 1? Und was ist die nächste Primzahl für 11? 11 selbst?Die Idee, im Falle eines Unentschieden das nächstgrößere oder niedrigere zuzulassen, ist schlecht, weil es das Vergleichen unnötig schwierig macht. Wenn Ihre Ergebnisse unterschiedlich sind, können sie die andere Fib, die andere Primzahl, die andere Fib und die andere Primzahl gewählt haben, oder Ihre sind falsch, oder das Ergebnis der anderen Person ist falsch, oder es ist eine Kombination: andere Wahl, aber falsch obwohl, vielleicht beide falsch.
quelle