Geschichte
Ich habe also ein Buch, das ich mit nichts als anderen Büchern von meinem Tisch trennen möchte. Ich möchte wissen, wie viele Bücher ich brauche, um dies mit Buchlängen zu erreichen .
Hier ist eine Visualisierung, die mein Freund bei Wolfram für mich gezeichnet hat:
Weitere Informationen zum Thema in Wolfram und Wikipedia .
Herausforderung
Geben Sie bei einer Ganzzahleingabe , wie viele Bücher erforderlich sind, damit das oberste Buch Buchlänge horizontal von der Tabelle entfernt ist. oder
Suchen Sie den kleinsten ganzzahligen Wert von für die Eingabe von mit der folgenden Ungleichung.
Bearbeiten: Verwenden Sie für Brüche mindestens einen IEEE-Gleitkommawert mit einfacher Genauigkeit. Entschuldigung für die Bearbeitungsaufforderung nach dem Posten
( OEIS A014537 )
Testfälle
1 4
2 31
3 227
5 12367
10 272400600
Antworten:
Oktave ,
414033 BytesDank @Dennis 1 Byte gespart
Probieren Sie es online!
Erläuterung
Dies nutzt die Tatsache, dass Oberwellenzahlen durch eine logarithmische Funktion niedriger begrenzt werden können.
Der
>=
Vergleich kann auch durch ersetzt werden,>
da harmonische Zahlen keine ganzen Zahlen sein können (danke, @Dennis!).quelle
Python 3 , 35 Bytes
Probieren Sie es online!
quelle
Schale , 8 Bytes
Probieren Sie es online!
Da Husk nach Möglichkeit rationale Zahlen verwendet, gibt es keine Fließkomma-Probleme
Erläuterung
quelle
JavaScript, 30 Bytes
Eine rekursive Funktion, die ziemlich früh ausfällt.
Probieren Sie es online aus
quelle
Haskell, 38 Bytes
quelle
Schnell , 65 Bytes
Probieren Sie es online!
Ungolfed
quelle
R , 39 Bytes
Probieren Sie es online!
Rohe Gewalt!
quelle
Javascript (ES6), 34 Byte
Ungolfed
Testfälle
Code-Snippet anzeigen
quelle
eval
Erklärung einschließen?eval
diei
Variablereturn
am Ende bearbeitet werden müsste , auf Kosten von ein paar Bytes mehr.Gelee , 8 Bytes
Das ist sehr langsam.
Probieren Sie es online!
quelle
Haskell,
714948 Bytes@BMO hat mir satte 22 Bytes erspart!
quelle
Julia 0,6 ,
3027 BytesProbieren Sie es online!
Funktioniert nur bis zu
n = 6
, da Julia keine Tail Call Optimierung hat.-3 Bytes dank Dennis .
quelle
TI-BASIC, 27 Bytes
Fordert den Benutzer zur Eingabe auf und zeigt die Ausgabe beim Beenden an. Hinweis: Ist
⁻¹
das -1 (inverse) Token.quelle
Ans
inN
sofort, dannInput N
oderPrompt N
eine Eingabemethode , die Ihnen ein Byte über spartAns→N
. UndM
kann durch ersetzt werdenAns
, so dass1→M
wird1
undM+1→M
wirdAns+1
. (Aber ich bin skeptisch, dass eine Ausgabe inAns
nicht angezeigt wird - sehen Sie das - vielleicht:Ans
ist es angebracht , mit zu enden : dann wird der Wert anstelle von "Done" angezeigt.)Ans→N
fühlte sich komisch an. Schöne Optimierungen. Habe auch deine Ratschläge zur Ausgabe nur zur Sicherheit genommen. Kommt immer noch mit einem Netz von -3 Bytes aus: D05AB1E , 11 Bytes
Probieren Sie es online!
Erläuterung
quelle
Pyth , 10 Bytes
Probieren Sie es online!
Extrem langsam.
Pyth , 10 Bytes
Probieren Sie es online!
quelle
Japt , 12 Bytes
Die gleiche Länge, aber etwas effizienter als die rekursive Option.
Versuch es
Erläuterung
quelle
J, 22 Bytes
-6 bytes dank frownyfrog
Probieren Sie es online!
ursprüngliche Antwort
Luis Antwort in J:
Ungolfed
Meist neugierig, ob es drastisch verbessert werden kann ( Husten Paging Meilen)
Erläuterung
Probieren Sie es online!
quelle
1+]i.~[:<.
->1+]I.~
->I.~0,
I.~0+/\@,
PHP, 35 Bytes
Führen Sie es mit der CLI aus:
quelle
Wolfram Language (Mathematica) , 40 Byte
Probieren Sie es online!
quelle
Java 8, 49 Bytes
Erläuterung:
Probieren Sie es online aus. (Zeitüberschreitung für oben genannte Testfälle
n=7
.)quelle
tinylisp , 98 bytes
Die letzte Zeile ist eine unbenannte Lambda-Funktion, die die Anzahl der Buchlängen und die Anzahl der benötigten Bücher zurückgibt. Probieren Sie es online!
Erläuterung
Der einzige numerische Datentyp, den tinylisp hat, sind Ganzzahlen. Daher berechnen wir die harmonische Reihe als Bruch, indem wir Zähler und Nenner verfolgen. Bei jedem Schritt
N
der Zähler,D
ist der Nenner undk
ist der Summenindex. Wir wollen, dass die neue TeilsummeN/D + 1/k
oder ist(N*k + D)/(D*k)
. Wir rekursieren also mit einem neuen Zähler vonN*K + D
, einem neuen Nenner vonD*k
und einem neuen Index vonk+1
.Die Rekursion sollte anhalten, sobald die Teilsumme größer oder gleich
#
der gewünschten Anzahl von Buchlängen ist. Zu diesem Zeitpunkt sind wir ein Buch zu weit gegangen und kehren zurückk-1
. Die Bedingung ist1/2 * N/D < #
;N < D*#*2
Wenn wir den Nenner multiplizieren, erhalten wir , was die golferischste Art ist, ihn zu schreiben.Die rekursive Hilfsfunktion
_
führt alle diese Berechnungen durch. Die Hauptfunktion ist lediglich ein einargumentigen wrapper dass Anrufe_
mit den richtigen Startwerten fürk
,N
, undD
.quelle