Ihre Herausforderung:
Sie befinden sich im 0. Stock eines unendlich hohen Gebäudes. Auf jeder Etage können Sie zum Fenster gehen und ein Ei fallen lassen. Ihr Ziel ist es, den höchsten Stock herauszufinden, dem das Ei standhalten kann, ohne zu brechen. Sie haben jedoch maximal 3 Eier, um dies herauszufinden, aber Sie müssen die Anzahl der Versuche minimieren.
In formalen Begriffen:
- Sie erhalten eine Funktion,
f(n)
diebool(n <= X)
für ein Unbekanntes zurückgibtX
, wobei0 <= X
- Sie müssen den Wert von zurückgeben
X
(ohne direkt darauf zuzugreifen). f(n)
darf nurFalse
maximal3
oft zurückgegeben werden (in einem einzelnen Testfall). Wenn esFalse
mehr als das zurückgibt , wird Ihre Antwort disqualifiziert.
Beschränkungen
Ihre Punktzahl ist die Gesamtzahl der Anrufe, die Sie tätigen f(n)
(in den folgenden Testfällen).
Wenn Sie möchten, können Sie auf die Übergabe einer Funktion verzichten und die oben genannte Situation einfach "simulieren". Jedoch , Ihr Lösungsalgorithmus muss wissen nichts von X
.
Ihr Algorithmus sollte die Testfälle nicht oder maximal hart codieren X
. Wenn ich die Zahlen neu generieren oder weitere hinzufügen sollte, sollte Ihr Programm in der Lage sein, mit ihnen umzugehen (mit einer ähnlichen Punktzahl).
Wenn Ihre Sprache keine Ganzzahlen mit beliebiger Genauigkeit unterstützt, können Sie den long
Datentyp verwenden. Wenn Ihre Sprache auch nicht unterstützt, haben Sie kein Glück.
Der n-te Testfall wird wie folgt generiert :
g(n) = max(g(n-1)*random(1,1.5), n+1), g(0) = 0
oder ungefähr 1.25^n
Testfälle:
0,1,2,3,4,6,7,8,10,14,15,18,20,27,29,40,57,61,91,104,133,194,233,308,425,530,735,1057,1308,1874,2576,3162,3769,3804,4872,6309,7731,11167,11476,15223,15603,16034,22761,29204,35268,42481,56238,68723,83062,95681,113965,152145,202644,287964,335302,376279,466202,475558,666030,743517,782403,903170,1078242,1435682,1856036,2373214,3283373,4545125,6215594,7309899,7848365,8096538,10409246,15103057,20271921,22186329,23602446,32341327,33354300,46852754,65157555,93637992,107681394,152487773,181996529,225801707,324194358,435824227,579337939,600264328,827690923,1129093889,1260597310,1473972478,1952345052,1977336057,2512749509,3278750235,3747691805,5146052509
Dies ist eine Code-Herausforderung , und die Person mit der niedrigsten Punktzahl gewinnt!
quelle
Antworten:
Javascript,
44285944285774825 AnrufeHier testen
Ergebnisse für jeden einzelnen Testfall:
Wie es funktioniert:
1 Ei:
Wenn es ein Ei gibt, ist es die beste Strategie, jeweils 1 Etage nach oben zu gehen und die Etage direkt unter der Etage zurückzugeben, wo sie zuerst bricht.
2 Eier:
Wenn wir zwei Eier haben, ist die maximale Anzahl der zu überprüfenden Stockwerke das kleinste n, für das T n größer ist als der Bereich der zu überprüfenden Stockwerke. T n ist die n-te Dreieckszahl. Der erste Wurf wird im n-ten Stock ausgeführt. Der zweite Wurf erfolgt
n - 1
über dem ersten Wurf. Der m- te Wurf erfolgtn - m + 1
über demm - 1
th-ten Wurf. Nachdem das Ei zertrümmert ist, werdenn - m
Würfe benötigt, um den Boden nach der ersten Methode zu bestimmen.3 Eier:
Mit dem ersten unserer Eier sollten wir eine Obergrenze für den höchsten Stock festlegen. Ursprünglich habe ich dies getan, indem ich die Anzahl der Stockwerke jedes Mal verdoppelt habe. Nachdem ich den Algorithmus für 2 Eier analysiert hatte, dachte ich, dass es vielleicht besser wäre, wenn wir jedes Mal, wenn wir das Ei werfen, die maximalen Würfe für das Finden des richtigen Bodens mit 2 Eiern um 1 erhöhen würden. Dies kann durch Verwendung der tetraedrischen Zahlen erreicht werden. Nach den ersten Eierschlägen können wir die oben genannten Methoden für unsere verbleibenden Eier anwenden.
Die maximale Anzahl an Eiertropfen, die zur Bestimmung des Bodens erforderlich sind, sollte optimal sein. Es könnte jedoch wahrscheinlich ein besserer Algorithmus gefunden werden, bei dem die durchschnittlichen Eiertropfen besser sind.
quelle
Java, 68985 ruft auf
Testergebnisse:
Testprogramm:
Während der Optimierung wollte ich versuchen, die Anzahl der Versuche mit jedem Ei ungefähr gleich zu machen.
quelle
Ruby,
6746666026 AnrufeTestcode:
Ergebnisse:
Dieser Algorithmus funktioniert wie mein alter Algorithmus, weist jedoch einige Unterschiede auf:
Der erste Eiertropfen befindet sich im 8. Stock
Das erste Inkrement ist 8 * 8 = 64
Diese Zahlen sind das Ergebnis einer zufälligen Feinabstimmung von Hand.
quelle