freeCodeCamp/curriculum/challenges/italian/10-coding-interview-prep/project-euler/problem-86-cuboid-route.md

2.6 KiB

id title challengeType forumTopicId dashedName
5900f3c31000cf542c50fed5 Problema 86: percorso del cuboide 1 302200 problem-86-cuboid-route

--description--

Un ragno, S, si trova in un angolo di una stanza cuboide, che misura 6 x 5 x 3, e una mosca, F, si trova nell'angolo opposto. Muovendosi sulla superficie della stanza la più corta distanza "linea dritta" da S a F è 10 e il percorso è mostrato nel diagramma.

un diagramma del percorso di un ragno e una mosca da un vertice di una stanza cuboidale al vertice opposto

Invece, ci sono fino a tre candidati come percorso "più corto" per ogni dato cuboide e il percorso non ha sempre una lunghezza intera.

Si può mostrare che ci sono esattamente 2060 cuboidi distinti, ignorando le rotazioni, con lati interi, fino a una dimensione massima di M per M per M, per cui il percorso più corto ha una lunghezza intera per M = 100. Questo è il valore più piccolo di M per cui il numero delle soluzioni eccede per la prima volta il duemila; il numero delle soluzioni per M = 99 è 1975.

Trova l'ultimo valore di M per cui il numero delle soluzioni eccede per primo n.

--hints--

cuboidRoute(2000) dovrebbe restituire un numero.

assert(typeof cuboidRoute(2000) === 'number');

cuboidRoute(2000) dovrebbe restituire 100.

assert.strictEqual(cuboidRoute(2000), 100);

cuboidRoute(25000) dovrebbe restituire 320.

assert.strictEqual(cuboidRoute(25000), 320);

cuboidRoute(500000) dovrebbe restituire 1309.

assert.strictEqual(cuboidRoute(500000), 1309);

cuboidRoute(1000000) dovrebbe restituire 1818.

assert.strictEqual(cuboidRoute(1000000), 1818);

--seed--

--seed-contents--

function cuboidRoute(n) {

  return true;
}

cuboidRoute(2000);

--solutions--

function cuboidRoute(n) {
  // Based on https://www.mathblog.dk/project-euler-86-shortest-path-cuboid/
  function getLength(a, b) {
    return Math.sqrt(a ** 2 + b ** 2);
  }

  let M = 2;
  let counter = 0;

  while (counter < n) {
    M++;
    for (let baseHeightWidth = 3; baseHeightWidth <= 2 * M; baseHeightWidth++) {
      const pathLength = getLength(M, baseHeightWidth);
      if (Number.isInteger(pathLength)) {
        if (baseHeightWidth <= M) {
          counter += Math.floor(baseHeightWidth / 2);
        } else {
          counter += 1 + M - Math.floor((baseHeightWidth + 1) / 2);
        }
      }
    }
  }

  return M;
}