Skip to content

Commit

Permalink
Solve p18, p67 in js
Browse files Browse the repository at this point in the history
  • Loading branch information
LivInTheLookingGlass committed Sep 3, 2024
1 parent 9d66502 commit e7954b7
Show file tree
Hide file tree
Showing 11 changed files with 192 additions and 13 deletions.
2 changes: 1 addition & 1 deletion README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ Olivia's Project Euler Solutions
| | Microsoft, Oracle, |br| | | |CodeQL| |br| |
| | Semeru, Temurin, & Zulu | | |Java-lint| |
+------------+----------------------------+--------+-------------------+
| JavaScript | Node 12+ |br| | 30 | |JavaScript| |br| |
| JavaScript | Node 12+ |br| | 32 | |JavaScript| |br| |
| | Bun 1.0+ |br| | | |Js-Cov| |br| |
| | Browser [#]_ | | |CodeQL| |br| |
| | | | |ESLint| |
Expand Down
4 changes: 2 additions & 2 deletions docs/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ Problems Solved
+-----------+------------+------------+------------+------------+------------+------------+------------+
|:prob:`17` |:c-d:`0017` |:cp-d:`0017`|:cs-d:`0017`|:ja-d:`0017`|:js-d:`0017`|:py-d:`0017`|:rs-d:`0017`|
+-----------+------------+------------+------------+------------+------------+------------+------------+
|:prob:`18` | | | | | |:py-d:`0018`|:rs-d:`0018`|
|:prob:`18` | | | | |:js-d:`0018`|:py-d:`0018`|:rs-d:`0018`|
+-----------+------------+------------+------------+------------+------------+------------+------------+
|:prob:`19` |:c-d:`0019` |:cp-d:`0019`|:cs-d:`0019`|:ja-d:`0019`|:js-d:`0019`|:py-d:`0019`|:rs-d:`0019`|
+-----------+------------+------------+------------+------------+------------+------------+------------+
Expand Down Expand Up @@ -192,7 +192,7 @@ Problems Solved
+-----------+------------+------------+------------+------------+------------+------------+------------+
|:prob:`63` | | | | | |:py-d:`0063`| |
+-----------+------------+------------+------------+------------+------------+------------+------------+
|:prob:`67` | | | | | |:py-d:`0067`|:rs-d:`0067`|
|:prob:`67` | | | | |:js-d:`0067`|:py-d:`0067`|:rs-d:`0067`|
+-----------+------------+------------+------------+------------+------------+------------+------------+
|:prob:`69` | | | | | |:py-d:`0069`|:rs-d:`0069`|
+-----------+------------+------------+------------+------------+------------+------------+------------+
Expand Down
10 changes: 10 additions & 0 deletions docs/src/javascript/lib/triangles.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
triangles.js
============

View source code :source:`javascript/src/lib/triangles.js`

.. js:autofunction:: triangles.reduceTriangle

.. literalinclude:: ../../../../javascript/src/lib/triangles.js
:language: javascript
:linenos:
12 changes: 12 additions & 0 deletions docs/src/javascript/p0018.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
JavaScript Implementation of Problem 18
=======================================

View source code :source:`javascript/src/p0018.js`

.. js:autofunction:: p0018

.. literalinclude:: ../../../javascript/src/p0018.js
:language: javascript
:linenos:

.. tags:: combinatorics, path-finding
12 changes: 12 additions & 0 deletions docs/src/javascript/p0067.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
JavaScript Implementation of Problem 67
=======================================

View source code :source:`javascript/src/p0067.js`

.. js:autofunction:: p0067

.. literalinclude:: ../../../javascript/src/p0067.js
:language: javascript
:linenos:

.. tags:: combinatorics, path-finding, file-io
2 changes: 2 additions & 0 deletions javascript/README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,7 @@ Problems Solved
- ☒ `15 <./src/p0015.js>`__
- ☒ `16 <./src/p0016.js>`__
- ☒ `17 <./src/p0017.js>`__
- ☒ `18 <./src/p0019.js>`__
- ☒ `19 <./src/p0019.js>`__
- ☒ `20 <./src/p0020.js>`__
- ☒ `22 <./src/p0022.js>`__
Expand All @@ -127,5 +128,6 @@ Problems Solved
- ☒ `41 <./src/p0041.js>`__
- ☒ `46 <./src/p0046.js>`__
- ☒ `60 <./src/p0060.js>`__
- ☒ `67 <./src/p0067.js>`__
- ☒ `76 <./src/p0076.js>`__
- ☒ `836 <./src/p0836.js>`__
3 changes: 3 additions & 0 deletions javascript/euler.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ const answers = {
15: [require('./src/p0015.js'), false],
16: [require('./src/p0016.js'), false],
17: [require('./src/p0017.js'), false],
18: [require('./src/p0018.js'), false],
19: [require('./src/p0019.js'), false],
20: [require('./src/p0020.js'), false],
22: [require('./src/p0022.js'), false],
23: [require('./src/p0023.js'), false],
Expand All @@ -50,6 +52,7 @@ const answers = {
41: [require('./src/p0041.js'), false],
46: [require('./src/p0046.js'), false],
60: [require('./src/p0060.js'), false],
67: [require('./src/p0067.js'), false],
836: [require('./src/p0836.js'), false],
76: [require('./src/p0076.js'), true],
};
Expand Down
18 changes: 18 additions & 0 deletions javascript/src/lib/triangles.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
/**
* Compute the factorial of a given number. Note that, unlike the version of this in other languages, this does not
* guard against imprecision or overflow.
* @param {Array<Array<number>>} triangle
* @return {number}
*/
exports.reduceTriangle = function reduceTriangle(triangle) {
centering = triangle[triangle.length - 1].length + 1;
const potentialTotals = new Array(centering).fill(0);
const _triangle = Array.from(triangle);
_triangle.reverse();
for (const parent of _triangle) {
for (let i = 0; i < parent.length; i++) {
potentialTotals[i] = Math.max(potentialTotals[i], potentialTotals[i + 1]) + parent[i];
}
}
return potentialTotals[0];
};
67 changes: 67 additions & 0 deletions javascript/src/p0018.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
/**
* Project Euler Problem 18
*
* Thinking from the bottom up got the answer
*
* Problem:
*
* By starting at the top of the triangle below and moving to adjacent numbers on the row below, the maximum total from
* top to bottom is 23.
*
* .. code-block::
*
* 3
* 7 4
* 2 4 6
* 8 5 9 3
*
* That is, 3 + 7 + 4 + 9 = 23.
*
* Find the maximum total from top to bottom of the triangle below:
*
* .. code-block::
*
* 75
* 95 64
* 17 47 82
* 18 35 87 10
* 20 04 82 47 65
* 19 01 23 75 03 34
* 88 02 77 73 07 63 67
* 99 65 04 28 06 16 70 92
* 41 41 26 56 83 40 80 70 33
* 41 48 72 33 47 32 37 16 94 29
* 53 71 44 65 25 43 91 52 97 51 14
* 70 11 33 28 77 73 17 78 39 68 17 57
* 91 71 52 38 17 14 91 43 58 50 27 29 48
* 63 66 04 68 89 53 67 30 73 16 69 87 40 31
* 04 62 98 27 23 09 70 98 73 93 38 53 60 04 23
*
* NOTE: As there are only 16384 routes, it is possible to solve this problem by trying every route. However, Problem
* 67, is the same challenge with a triangle containing one-hundred rows; it cannot be solved by brute force, and
* requires a clever method! ;o)
*
* @return {number}
*/
exports.p0018 = function() {
const rows = [
[75],
[95, 64],
[17, 47, 82],
[18, 35, 87, 10],
[20, 4, 82, 47, 65],
[19, 1, 23, 75, 3, 34],
[88, 2, 77, 73, 7, 63, 67],
[99, 65, 4, 28, 6, 16, 70, 92],
[41, 41, 26, 56, 83, 40, 80, 70, 33],
[41, 48, 72, 33, 47, 32, 37, 16, 94, 29],
[53, 71, 44, 65, 25, 43, 91, 52, 97, 51, 14],
[70, 11, 33, 28, 77, 73, 17, 78, 39, 68, 17, 57],
[91, 71, 52, 38, 17, 14, 91, 43, 58, 50, 27, 29, 48],
[63, 66, 4, 68, 89, 53, 67, 30, 73, 16, 69, 87, 40, 31],
[4, 62, 98, 27, 23, 9, 70, 98, 73, 93, 38, 53, 60, 4, 23],
];
return triangles.reduceTriangle(rows);
};

const triangles = require('./lib/triangles.js');
36 changes: 36 additions & 0 deletions javascript/src/p0067.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
/**
* Project Euler Problem 67
*
* Thinking from the bottom up got the answer
*
* Problem:
*
* By starting at the top of the triangle below and moving to adjacent numbers on the row below, the maximum total from
* top to bottom is 23.
*
* 3
* 7 4
* 2 4 6
* 8 5 9 3
*
* That is, 3 + 7 + 4 + 9 = 23.
*
* Find the maximum total from top to bottom in triangle.txt (right click and 'Save Link/Target As...'), a 15K text file
* containing a triangle with one-hundred rows.
*
* NOTE: This is a much more difficult version of Problem 18. It is not possible to try every route to solve this
* problem, as there are 2^99 altogether! If you could check one trillion (10^12) routes every second it would take
* over twenty billion years to check them all. There is an efficient algorithm to solve it. ;o)
*
* @return {number}
*/
exports.p0067 = function() {
const rows = [];
for (const line of utils.get_data_file('p0067_triangle.txt').trim().split(/\r?\n|\r|\n/g)) {
rows.push(line.split(' ').map(Number));
}
return triangles.reduceTriangle(rows);
};

const triangles = require('./lib/triangles.js');
const utils = require('./lib/utils.js');
39 changes: 29 additions & 10 deletions rust/src/problems/p0018.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
Project Euler Problem 67
Project Euler Problem 18
Thinking from the bottom up got the answer
Expand All @@ -8,19 +8,38 @@ Problem:
By starting at the top of the triangle below and moving to adjacent numbers on the row below, the maximum total from top
to bottom is 23.
3
7 4
2 4 6
8 5 9 3
.. code-block::
3
7 4
2 4 6
8 5 9 3
That is, 3 + 7 + 4 + 9 = 23.
Find the maximum total from top to bottom in triangle.txt (right click and 'Save Link/Target As...'), a 15K text file
containing a triangle with one-hundred rows.
Find the maximum total from top to bottom of the triangle below:
.. code-block::
75
95 64
17 47 82
18 35 87 10
20 04 82 47 65
19 01 23 75 03 34
88 02 77 73 07 63 67
99 65 04 28 06 16 70 92
41 41 26 56 83 40 80 70 33
41 48 72 33 47 32 37 16 94 29
53 71 44 65 25 43 91 52 97 51 14
70 11 33 28 77 73 17 78 39 68 17 57
91 71 52 38 17 14 91 43 58 50 27 29 48
63 66 04 68 89 53 67 30 73 16 69 87 40 31
04 62 98 27 23 09 70 98 73 93 38 53 60 04 23
NOTE: This is a much more difficult version of Problem 18. It is not possible to try every route to solve this problem,
as there are 2^99 altogether! If you could check one trillion (10^12) routes every second it would take over twenty
billion years to check them all. There is an efficient algorithm to solve it. ;o)
NOTE: As there are only 16384 routes, it is possible to solve this problem by trying every route. However, Problem 67,
is the same challenge with a triangle containing one-hundred rows; it cannot be solved by brute force, and requires a
clever method! ;o)
*/
use crate::include::triangles::reduce_triangle;
use crate::include::utils::Answer;
Expand Down

0 comments on commit e7954b7

Please sign in to comment.