JavaScript
function findFloor(f){
var max = 1;
var min = 0;
//First egg.
var n = 1;
while (f(max)) {
min = max;
n += 1;
max = tetrahedral(n);
}
if (max <= min + 1){
return min;
}
//Second egg.
do {
var range = max - min;
var floor = min + reverseTriangle(range);
var smashed = !f(floor);
if (smashed) {
max = floor;
} else {
min = floor;
}
} while (!smashed && max > min + 1);
if (max <= min + 1){
return min;
}
//Third egg.
while (max > min + 1){
var floor = min + 1;
var smashed = !f(floor);
if (smashed) {
max = floor;
} else {
min = floor;
}
if (smashed) {
break;
}
}
return min;
}
function reverseTriangle(x) {
return Math.ceil((-1 + Math.sqrt(1 + 8 * x)) / 2);
}
function tetrahedral(n) {
return n * (n + 1) * (n + 2) / 6;
}
var testCases = [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];
var score = 0;
var scores = {};
function generateF(X) {
var eggsLeft = 3;
scores[X] = 0;
function f(n) {
if (eggsLeft <= 0) {
console.log('Disqualified!');
}
score += 1;
scores[X] += 1;
if (n > X) {
eggsLeft--;
}
return n <= X;
}
return f;
}
for (var i = 0; i < testCases.length; i++) {
var testCase = testCases[i];
var floor = findFloor(generateF(testCase));
if (floor != testCase) {
...