2021-06-15 00:49:18 -07:00
---
id: 5900f3c71000cf542c50feda
2021-11-04 07:53:18 -07:00
title: 'Problema 91: Triângulos retângulos com coordenadas inteiras'
2021-06-15 00:49:18 -07:00
challengeType: 5
forumTopicId: 302208
dashedName: problem-91-right-triangles-with-integer-coordinates
---
# --description--
2021-11-04 07:53:18 -07:00
Os pontos ${P}(x_1, y_1)$ e ${Q}(x_2, y_2)$ são desenhados em coordenadas de números inteiros e ligadas à origem, ${O}(0, 0)$, para formar ${\Delta}OPQ$.
2021-06-15 00:49:18 -07:00
2021-11-04 07:53:18 -07:00
< img class = "img-responsive center-block" alt = "um gráfico mostrando os pontos P (x_1, y_1) e Q(x_2, y_2) em coordenadas inteiras ligadas à origem O (0, 0)" src = "https://cdn-media-1.freecodecamp.org/project-euler/right-triangles-integer-coordinates-1.png" style = "background-color: white; padding: 10px;" / >
2021-06-15 00:49:18 -07:00
2021-11-04 07:53:18 -07:00
Há exatamente catorze triângulos contendo um ângulo reto que podem ser formados quando cada coordenada se encontra entre 0 e 2, ou seja, $0 ≤ x_1, y_1, x_2, y_2 ≤ 2$.
2021-06-15 00:49:18 -07:00
2021-11-04 07:53:18 -07:00
< img class = "img-responsive center-block" alt = "um diagrama mostrando os 14 triângulos contendo um ângulo reto que podem ser formadas quando cada coordenada está entre 0 e 2" src = "https://cdn-media-1.freecodecamp.org/project-euler/right-triangles-integer-coordinates-2.png" style = "background-color: white; padding: 10px;" / >
2021-06-15 00:49:18 -07:00
2021-11-04 07:53:18 -07:00
Considerando $0 ≤ x_1, y_1, x_2, y_2 ≤ limit$, quantos triângulos retângulos podem ser formados?
2021-06-15 00:49:18 -07:00
# --hints--
2021-11-04 07:53:18 -07:00
`rightTrianglesIntCoords(2)` deve retornar um número.
2021-06-15 00:49:18 -07:00
```js
assert(typeof rightTrianglesIntCoords(2) === 'number');
```
2021-11-04 07:53:18 -07:00
`rightTrianglesIntCoords(2)` deve retornar `14` .
2021-06-15 00:49:18 -07:00
```js
assert.strictEqual(rightTrianglesIntCoords(2), 14);
```
2021-11-04 07:53:18 -07:00
`rightTrianglesIntCoords(10)` deve retornar `448` .
2021-06-15 00:49:18 -07:00
```js
assert.strictEqual(rightTrianglesIntCoords(10), 448);
```
2021-11-04 07:53:18 -07:00
`rightTrianglesIntCoords(25)` deve retornar `3207` .
2021-06-15 00:49:18 -07:00
```js
assert.strictEqual(rightTrianglesIntCoords(25), 3207);
```
2021-11-04 07:53:18 -07:00
`rightTrianglesIntCoords(50)` deve retornar `14234` .
2021-06-15 00:49:18 -07:00
```js
assert.strictEqual(rightTrianglesIntCoords(50), 14234);
```
# --seed--
## --seed-contents--
```js
function rightTrianglesIntCoords(limit) {
return true;
}
rightTrianglesIntCoords(2);
```
# --solutions--
```js
function rightTrianglesIntCoords(limit) {
function isRightTriangle(points) {
for (let i = 0; i < points.length ; i + + ) {
const pointA = points[i];
const pointB = points[(i + 1) % 3];
const pointC = points[(i + 2) % 3];
const vectorAB = [pointB[0] - pointA[0], pointB[1] - pointA[1]];
const vectorAC = [pointC[0] - pointA[0], pointC[1] - pointA[1]];
if (isRightAngleBetween(vectorAB, vectorAC)) {
return true;
}
}
return false;
}
function isRightAngleBetween(vector1, vector2) {
return vector1[0] * vector2[0] + vector1[1] * vector2[1] === 0;
}
function getSetKey(points) {
return (
'0.0,' +
points
.sort((a, b) => a[0] - b[0])
.map(point => point.join('.'))
.join(',')
);
}
const pointO = [0, 0];
const rightTriangles = new Set();
for (let x1 = 1; x1 < = limit; x1++) {
for (let y1 = 0; y1 < = limit; y1++) {
const pointP = [x1, y1];
for (let x2 = 0; x2 < = limit; x2++) {
for (let y2 = 1; y2 < = limit; y2++) {
const pointQ = [x2, y2];
if (pointP[0] === pointQ[0] & & pointP[1] === pointQ[1]) {
continue;
}
if (isRightTriangle([pointO, pointP, pointQ])) {
rightTriangles.add(getSetKey([pointP, pointQ]));
}
}
}
}
}
return rightTriangles.size;
}
```