Алмазная дюжина, в чём проблема?

javascript (https://codecombat.com/play/level/diamond-dozen)
Я видел что есть несколько постов по этому уровню, но там везде были ошибки либо синтаксические, либо логические (не пользуются функцией valueOverDistance() а выбирают самую дорогую монету). Уровень я прошёл, но вопросы остались. Чисто его пройти не получалось. Как мне кажется, я правильно закончил функцию findBestItem(), но без дополнительного кода никак не получалось собрать нужное количество монет.
Если в главном цикле пользоваться методом hero.moveXY() для подбирания монет, то иногда, после подбирания первой монеты, герой нацеливается на вторую, и когда та исчезает, он всё равно продолжает двигаться до позиции на которую нацелился и тем самым теряет время. Чтобы этого избежать я воспользовался функцией, которую написал несколько уровней ранее (stepToTarget(), смотреть код ниже).
Вопрос: это так задумано чтобы игрок пораскинул мозгами, или всё таки у меня проблема с кодом, а может проблема со скоростью персонажа?
Код:

Функция findBestItem
function findBestItem(items) {
    var bestItem = null;
    var bestValue = 0;
    var itemsIndex = 0;
    
    // Перебери массив предметов.
    // Найди предмет с наибольшим значением `valueOverDistance()`.
    while(itemsIndex < items.length) {
        var value = valueOverDistance(items[itemsIndex]);
        if (value > bestValue) {
            bestValue = value;
            bestItem = items[itemsIndex];
        }
        itemsIndex++;
    }
    return bestItem;
}
Весь код
// Собирай монеты, разгоняя мародёрствующих огров.

function findMostHealth(enemies) {
    var target = null;
    var targetHealth = 0;
    var enemyIndex = 0;
    while(enemyIndex < enemies.length) {
        var enemy = enemies[enemyIndex];
        if(enemy.health > targetHealth) {
            target = enemy;
            targetHealth = enemy.health;
        }
        enemyIndex += 1;
    }
    return target;
}

function valueOverDistance(item) {
    return item.value / hero.distanceTo(item);
}

// Возврати предмет с наибольшим значением `valueOverDistance(item)`.
function findBestItem(items) {
    var bestItem = null;
    var bestValue = 0;
    var itemsIndex = 0;
    
    // Перебери массив предметов.
    // Найди предмет с наибольшим значением `valueOverDistance()`.
    while(itemsIndex < items.length) {
        var value = valueOverDistance(items[itemsIndex]);
        if (value > bestValue) {
            bestValue = value;
            bestItem = items[itemsIndex];
        }
        itemsIndex++;
    }
    return bestItem;
}

function stepToTarget(target) { //шагаем на 5 по направлению к цели
    var x = (target.pos.x - hero.pos.x) * 5 / hero.distanceTo(target);
    var y = (target.pos.y - hero.pos.y) * 5 / hero.distanceTo(target);
    hero.moveXY(hero.pos.x + x, hero.pos.y + y);
}

while(true) {
    var enemies = hero.findEnemies();
    var enemy = findMostHealth(enemies);
    if(enemy && enemy.health > 15) {
        while(enemy.health > 0) {
            hero.attack(enemy);
        }
    } else {
        var coins = hero.findItems();
        var coin = null;
        coin = findBestItem(coins);
        if(coin) {
            //hero.moveXY(coin.pos.x, coin.pos.y);
            stepToTarget(coin);
        }
    }
}