JSFiddle - React, Tailwind, and code Playground

by artgas_pro

JavaScript

// Функция для генерации случайных координат астероида
function generateAsteroidLocation() {
  const x = Math.floor(Math.random() * 101);
  const y = Math.floor(Math.random() * 101);
  const z = Math.floor(Math.random() * 101);
  return { x, y, z };
}

// Функция для вычисления расстояния между зондом и астероидом
function calculateDistance(probe, asteroid) {
  const dx = probe.x - asteroid.x;
  const dy = probe.y - asteroid.y;
  const dz = probe.z - asteroid.z;
  return Math.sqrt(dx ** 2 + dy ** 2 + dz ** 2);
}

// Функция для нахождения координат астероида и оптимального количества зондов
function findAsteroidCoordinates() {
  const asteroid = generateAsteroidLocation();
  const probes = {
    count: 0,
    coordinates: [],
  };

  let minX = 0;
  let maxX = 100;
  let minY = 0;
  let maxY = 100;
  let minZ = 0;
  let maxZ = 100;

  while (true) {
    const probeX = Math.floor((minX + maxX) / 2);
    const probeY = Math.floor((minY + maxY) / 2);
    const probeZ = Math.floor((minZ + maxZ) / 2);
    const probe = { x: probeX, y: probeY, z: probeZ };

    const distance = calculateDistance(probe, asteroid);
    probes.count++;
    probes.coordinates.push(probe);

    if (distance === 0) {
      break; // Найден астероид, выходим из цикла
    }

    // Обновляем границы пространства поиска
    if (probeX < asteroid.x) {
      minX = probeX;
    } else {
      maxX = probeX;
    }
    if (probeY < asteroid.y) {
      minY = probeY;
    } else {
      maxY = probeY;
    }
    if (probeZ < asteroid.z) {
      minZ = probeZ;
    } else {
      maxZ = probeZ;
    }
  }

  return {
    result: {
      location: asteroid,
      probes: probes,
    },
  };
}

// Пример использования
const result = findAsteroidCoordinates();
console.log(result);