Compare commits
15 Commits
d4300cb5af
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
414fe258a4 | ||
|
|
f6bf8d2582 | ||
|
|
23d26c769d | ||
|
|
506ef02f1a | ||
|
|
ee268061e8 | ||
|
|
901d91cecc | ||
|
|
a322653542 | ||
|
|
f2c0867cd6 | ||
|
|
f3ee63aac1 | ||
|
|
a9ea174313 | ||
|
|
f0007cabe0 | ||
|
|
5a24488608 | ||
|
|
d058877d99 | ||
|
|
6a2ab5033f | ||
|
|
8c8f0cef1a |
14
README.md
14
README.md
@@ -26,8 +26,11 @@ For each notebook you can hover on the title to see a description, or click the
|
||||
| [co](https://colab.research.google.com/github/norvig/pytudes/blob/main/ipynb/lispy.ipynb) [nb](https://nbviewer.jupyter.org/github/norvig/pytudes/blob/main/ipynb/lispy.ipynb) | 2026 | <a href="ipynb/lispy.ipynb" title="Tutorial on interpreters.">(How to Write a (Lisp) Interpreter (in Python))</a> |
|
||||
| [co](https://colab.research.google.com/github/norvig/pytudes/blob/main/ipynb/RationalPi.ipynb) [nb](https://nbviewer.jupyter.org/github/norvig/pytudes/blob/main/ipynb/RationalPi.ipynb) | 2026 | <a href="ipynb/RationalPi.ipynb" title="Using continued fractions to find fractions (like 22/7) that are close to pi.">Approximating Pi with a Fraction</a> |
|
||||
| [co](https://colab.research.google.com/github/norvig/pytudes/blob/main/ipynb/clvr.ipynb) [nb](https://nbviewer.jupyter.org/github/norvig/pytudes/blob/main/ipynb/clvr.ipynb) | 2026 | <a href="ipynb/clvr.ipynb" title="Guess famous phrases from letter shapes. Beginner level.">Did you solve it? R y clvr ngh t rd ths sntnc?</a> |
|
||||
| [co](https://colab.research.google.com/github/norvig/pytudes/blob/main/ipynb/Euler3.ipynb) [nb](https://nbviewer.jupyter.org/github/norvig/pytudes/blob/main/ipynb/Euler3.ipynb) | 2026 | <a href="ipynb/Euler3.ipynb" title="For beginner programmers: How to find the largest prime factor of a number">Project Euler #3: Largest prime factor</a> |
|
||||
| [co](https://colab.research.google.com/github/norvig/pytudes/blob/main/ipynb/Euler.ipynb) [nb](https://nbviewer.jupyter.org/github/norvig/pytudes/blob/main/ipynb/Euler.ipynb) | 2026 | <a href="ipynb/Euler.ipynb" title="Solutions to the first 100 Project Euler math/programming problems">Project Euler 1–100</a> |
|
||||
| [co](https://colab.research.google.com/github/norvig/pytudes/blob/main/ipynb/Euler3.ipynb) [nb](https://nbviewer.jupyter.org/github/norvig/pytudes/blob/main/ipynb/Euler3.ipynb) | 2026 | <a href="ipynb/Euler3.ipynb" title="For beginner programmers: How to find the largest prime factor of a number. Project Euler #3.">Largest prime factor</a> |
|
||||
| [co](https://colab.research.google.com/github/norvig/pytudes/blob/main/ipynb/Euler-Fable.ipynb) [nb](https://nbviewer.jupyter.org/github/norvig/pytudes/blob/main/ipynb/Euler-Fable.ipynb) | 2026 | <a href="ipynb/Euler-Fable.ipynb" title="Solutions to Project Euler math/programming problems by Claude Fable LLM">Project Euler #1–100 by Fable LLM</a> |
|
||||
| [co](https://colab.research.google.com/github/norvig/pytudes/blob/main/ipynb/Euler-Kimi.ipynb) [nb](https://nbviewer.jupyter.org/github/norvig/pytudes/blob/main/ipynb/Euler-Kimi.ipynb) | 2026 | <a href="ipynb/Euler-Kimi.ipynb" title="Solutions to Project Euler math/programming problems by Kimi LLM">Project Euler #1–100 by Kimi LLM</a> |
|
||||
| [co](https://colab.research.google.com/github/norvig/pytudes/blob/main/ipynb/Euler-Opus.ipynb) [nb](https://nbviewer.jupyter.org/github/norvig/pytudes/blob/main/ipynb/Euler-Opus.ipynb) | 2026 | <a href="ipynb/Euler-Opus.ipynb" title="Solutions to Project Euler math/programming problems by Claude Opus LLM">Project Euler #1–100 by Opus LLM</a> |
|
||||
| [co](https://colab.research.google.com/github/norvig/pytudes/blob/main/ipynb/Euler.ipynb) [nb](https://nbviewer.jupyter.org/github/norvig/pytudes/blob/main/ipynb/Euler.ipynb) | 2026 | <a href="ipynb/Euler.ipynb" title="Solutions to the first 100 Project Euler math/programming problems">Project Euler #1–100 by a Human</a> |
|
||||
| [co](https://colab.research.google.com/github/norvig/pytudes/blob/main/ipynb/TruncatablePrimes.ipynb) [nb](https://nbviewer.jupyter.org/github/norvig/pytudes/blob/main/ipynb/TruncatablePrimes.ipynb) | 2026 | <a href="ipynb/TruncatablePrimes.ipynb" title="Prime numbers where you can remove digits and still get primes.">Truncatable Primes</a> |
|
||||
| [co](https://colab.research.google.com/github/norvig/pytudes/blob/main/ipynb/Advent-2025.ipynb) [nb](https://nbviewer.jupyter.org/github/norvig/pytudes/blob/main/ipynb/Advent-2025.ipynb) | 2025 | <a href="ipynb/Advent-2025.ipynb" title="Puzzle site with a coding puzzle for 12 days of Christmas, December 2025">Advent of Code 2025</a> |
|
||||
| [co](https://colab.research.google.com/github/norvig/pytudes/blob/main/ipynb/Advent-2025-AI.ipynb) [nb](https://nbviewer.jupyter.org/github/norvig/pytudes/blob/main/ipynb/Advent-2025-AI.ipynb) | 2025 | <a href="ipynb/Advent-2025-AI.ipynb" title="Using large language coding models to solve AoC puzzles">Advent of Code 2025: AI LLM Edition</a> |
|
||||
@@ -65,8 +68,11 @@ For each notebook you can hover on the title to see a description, or click the
|
||||
| [co](https://colab.research.google.com/github/norvig/pytudes/blob/main/ipynb/Advent-2017.ipynb) [nb](https://nbviewer.jupyter.org/github/norvig/pytudes/blob/main/ipynb/Advent-2017.ipynb) | 2017 | <a href="ipynb/Advent-2017.ipynb" title="Puzzle site with a coding puzzle each day of Advent, December 2017">Advent of Code 2017</a> |
|
||||
| [co](https://colab.research.google.com/github/norvig/pytudes/blob/main/ipynb/Advent-2016.ipynb) [nb](https://nbviewer.jupyter.org/github/norvig/pytudes/blob/main/ipynb/Advent-2016.ipynb) | 2016 | <a href="ipynb/Advent-2016.ipynb" title="Puzzle site with a coding puzzle each day of Advent, December 2016">Advent of Code 2016</a> |
|
||||
| [co](https://colab.research.google.com/github/norvig/pytudes/blob/main/ipynb/AdventUtils.ipynb) [nb](https://nbviewer.jupyter.org/github/norvig/pytudes/blob/main/ipynb/AdventUtils.ipynb) | 2022 | <a href="ipynb/AdventUtils.ipynb" title="Utility functions for Advent of Code puzzles">Advent of Code Utilities</a> |
|
||||
| [co](https://colab.research.google.com/github/norvig/pytudes/blob/main/ipynb/Euler.ipynb) [nb](https://nbviewer.jupyter.org/github/norvig/pytudes/blob/main/ipynb/Euler.ipynb) | 2026 | <a href="ipynb/Euler.ipynb" title="Solutions to the first 100 Project Euler math/programming problems">Project Euler 1–100</a> |
|
||||
| [co](https://colab.research.google.com/github/norvig/pytudes/blob/main/ipynb/Euler3.ipynb) [nb](https://nbviewer.jupyter.org/github/norvig/pytudes/blob/main/ipynb/Euler3.ipynb) | 2026 | <a href="ipynb/Euler3.ipynb" title="For beginner programmers: How to find the largest prime factor of a number">Project Euler #3: Largest prime factor</a> |
|
||||
| [co](https://colab.research.google.com/github/norvig/pytudes/blob/main/ipynb/Euler.ipynb) [nb](https://nbviewer.jupyter.org/github/norvig/pytudes/blob/main/ipynb/Euler.ipynb) | 2026 | <a href="ipynb/Euler.ipynb" title="Solutions to the first 100 Project Euler math/programming problems">Project Euler #1–100 by a Human</a> |
|
||||
| [co](https://colab.research.google.com/github/norvig/pytudes/blob/main/ipynb/Euler-Fable.ipynb) [nb](https://nbviewer.jupyter.org/github/norvig/pytudes/blob/main/ipynb/Euler-Fable.ipynb) | 2026 | <a href="ipynb/Euler-Fable.ipynb" title="Solutions to Project Euler math/programming problems by Claude Fable LLM">Project Euler #1–100 by Fable LLM</a> |
|
||||
| [co](https://colab.research.google.com/github/norvig/pytudes/blob/main/ipynb/Euler-Opus.ipynb) [nb](https://nbviewer.jupyter.org/github/norvig/pytudes/blob/main/ipynb/Euler-Opus.ipynb) | 2026 | <a href="ipynb/Euler-Opus.ipynb" title="Solutions to Project Euler math/programming problems by Claude Opus LLM">Project Euler #1–100 by Opus LLM</a> |
|
||||
| [co](https://colab.research.google.com/github/norvig/pytudes/blob/main/ipynb/Euler-Kimi.ipynb) [nb](https://nbviewer.jupyter.org/github/norvig/pytudes/blob/main/ipynb/Euler-Kimi.ipynb) | 2026 | <a href="ipynb/Euler-Kimi.ipynb" title="Solutions to Project Euler math/programming problems by Kimi LLM">Project Euler #1–100 by Kimi LLM</a> |
|
||||
| [co](https://colab.research.google.com/github/norvig/pytudes/blob/main/ipynb/Euler3.ipynb) [nb](https://nbviewer.jupyter.org/github/norvig/pytudes/blob/main/ipynb/Euler3.ipynb) | 2026 | <a href="ipynb/Euler3.ipynb" title="For beginner programmers: How to find the largest prime factor of a number. Project Euler #3.">Largest prime factor</a> |
|
||||
|
||||
|
||||
|Open|Year|Probability and Uncertainty|
|
||||
|
||||
4739
ipynb/Euler-Fable.ipynb
Normal file
4739
ipynb/Euler-Fable.ipynb
Normal file
File diff suppressed because it is too large
Load Diff
4801
ipynb/Euler-Kimi.ipynb
Normal file
4801
ipynb/Euler-Kimi.ipynb
Normal file
File diff suppressed because it is too large
Load Diff
5191
ipynb/Euler-Opus.ipynb
Normal file
5191
ipynb/Euler-Opus.ipynb
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -15,7 +15,7 @@
|
||||
" The prime factors of 13195 are 5, 7, 13 and 29.\n",
|
||||
" What is the largest prime factor of the number 600851475143?\n",
|
||||
"\n",
|
||||
"I'll describe here how I think about this problem, at alevel suitable for a novice programmer. There are two things to get right: the general plan of how to attack this problem, and the details of how to say it in Python.\n",
|
||||
"I'll describe here how I think about this problem, at a level suitable for a novice programmer. There are two things to get right: the general plan of how to attack this problem, and the details of how to say it in Python.\n",
|
||||
"\n",
|
||||
"## The General Plan\n",
|
||||
"\n",
|
||||
@@ -105,7 +105,7 @@
|
||||
"id": "8bf8dd51-8e06-4572-85fa-fe42875e0305",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"We can represent the execution of the program as a series of equations, one per line. Using `F` as an abbreviation for `largest_prime_factor`, here is hjow we find the largest prime factor of 360:\n",
|
||||
"We can represent the execution of the program as a series of equations, one per line. Using `F` as an abbreviation for `largest_prime_factor`, here is how we find the largest prime factor of 360:\n",
|
||||
"\n",
|
||||
" F(360) = max(2, F(180))\n",
|
||||
" F(180) = max(2, F(90))\n",
|
||||
@@ -113,7 +113,7 @@
|
||||
" F(45) = max(3, F(15))\n",
|
||||
" F(15) = max(3, F(5))\n",
|
||||
" F(5) = 5\n",
|
||||
" F(36) = max(2, max(2, max(2, 3, 3, 5))) = 5"
|
||||
" F(36) = max(2, max(2, max(2, 3, max(3, 5)))) = 5"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -156,7 +156,7 @@
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"[11, 'out of', 11, 'tests pass']"
|
||||
"[12, 'out of', 12, 'tests pass']"
|
||||
]
|
||||
},
|
||||
"execution_count": 4,
|
||||
@@ -173,11 +173,12 @@
|
||||
" 6: 3, # composite\n",
|
||||
" 32: 2, # power of 2\n",
|
||||
" 49: 7, # square of a prime\n",
|
||||
" 97: 97, # bigger prime\n",
|
||||
" 99991: 99991, # even bigger prime\n",
|
||||
" 97**9: 97, # even bigger power of a prime\n",
|
||||
" 360: 5, # test case for equations above\n",
|
||||
" 600851475143: 6857 # Project Euler #3\n",
|
||||
" 997: 997, # bigger prime\n",
|
||||
" 997**9: 997, # bigger power of a prime\n",
|
||||
" 99991: 99991, # even bigger prime\n",
|
||||
" 600851475143: 6857, # Project Euler #3\n",
|
||||
" 99999989: 99999989 # An 8-digit prime number\n",
|
||||
" }\n",
|
||||
" correct = sum(largest_prime_factor(n) == cases[n] for n in cases)\n",
|
||||
" return [correct, 'out of', len(cases), 'tests pass']\n",
|
||||
@@ -192,7 +193,7 @@
|
||||
"source": [
|
||||
"## Efficiency\n",
|
||||
"\n",
|
||||
"How long does it take to get our answer? We can use `%time` to see it is just a few hundred microseconds (μs):"
|
||||
"How long does it take to run all the test cases?"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -205,14 +206,14 @@
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"CPU times: user 181 μs, sys: 0 ns, total: 181 μs\n",
|
||||
"Wall time: 183 μs\n"
|
||||
"CPU times: user 2.01 s, sys: 15 ms, total: 2.02 s\n",
|
||||
"Wall time: 2.03 s\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"6857"
|
||||
"[12, 'out of', 12, 'tests pass']"
|
||||
]
|
||||
},
|
||||
"execution_count": 5,
|
||||
@@ -221,45 +222,7 @@
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"%time largest_prime_factor(600851475143)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "c8ead8e9-199f-47c6-ad76-360b1ebdaa02",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"The algorithm is slowest when *n* is prime, because the `for` loop has to go all the way up to *n*. How long would it take for the largest 8-digit prime, 99,999,989?"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"id": "7323d528-96d7-4c05-a05d-125e99605443",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"CPU times: user 1.9 s, sys: 18.4 ms, total: 1.92 s\n",
|
||||
"Wall time: 1.92 s\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"99999989"
|
||||
]
|
||||
},
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"n8 = 99999989 # An 8-digit number that happens to be prime \n",
|
||||
"%time largest_prime_factor(n8)"
|
||||
"%time tests()"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -269,14 +232,14 @@
|
||||
"source": [
|
||||
"About 2 seconds. Maybe that's good enough. But could we speed things up?\n",
|
||||
"\n",
|
||||
"In trying to find a *p* that evenly divides *n*, the algorithm tests all the integers from 2 to *n*. But do we really have to test all those potential factors? No! Either *n* is prime, or it has two factors *p* and *q* such that *p* × *q* = *n*. Of those two factors, one must be less than or equal to the square root of *n*. So to determine if *n* has a prime factor other than itself, we only have to check integers up to √*n*, not all the way up to *n*. That's a big difference! for an 8-digit prime it is the difference between roughly 100 million steps versus a mere 10 thousand steps.\n",
|
||||
"In trying to find a *p* that evenly divides *n*, the algorithm tests all the integers from 2 to *n*. But do we really have to test all those potential factors? No! Either *n* is prime, or it has two factors *p* and *q* such that *p* × *q* = *n*. Of those two factors, one must be less than or equal to the square root of *n*. So to determine if *n* has a prime factor other than itself, we only have to check integers up to √*n*, not all the way up to *n*. That's a big difference! For an 8-digit prime it is the difference between roughly 100 million steps versus a mere 10 thousand steps.\n",
|
||||
"\n",
|
||||
"Let's change the definition of `largest_prime_factor` to incorporate this new trick. (We will `import` the square root function, `sqrt`, from the `math` module.)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 7,
|
||||
"execution_count": 6,
|
||||
"id": "b90b5407-4666-4925-99d2-6a3a6b192fac",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
@@ -294,46 +257,17 @@
|
||||
" return n # n is prime or 1"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "c39b08b9-06ed-49c0-a277-db248de909fd",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Any time you change a function, you should re-run the tests to give you some confidence that you didn't introduce a bug:"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 8,
|
||||
"id": "4026dc87-a0aa-4c75-b92a-96ec24cda1b7",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"[11, 'out of', 11, 'tests pass']"
|
||||
]
|
||||
},
|
||||
"execution_count": 8,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"tests()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "6cddf393-a0fd-4cc2-9eef-3341339106bd",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Now we can see how fast the new function is on the 8-digit prime:"
|
||||
"Now we can see how fast the new function is, and verify that it still passes all the tests:"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 9,
|
||||
"execution_count": 7,
|
||||
"id": "d3d0c13e-5c01-4112-b372-60f7eb302d25",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
@@ -341,23 +275,23 @@
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"CPU times: user 196 μs, sys: 0 ns, total: 196 μs\n",
|
||||
"Wall time: 196 μs\n"
|
||||
"CPU times: user 523 μs, sys: 5 μs, total: 528 μs\n",
|
||||
"Wall time: 548 μs\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"99999989"
|
||||
"[12, 'out of', 12, 'tests pass']"
|
||||
]
|
||||
},
|
||||
"execution_count": 9,
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"%time largest_prime_factor(n8)"
|
||||
"%time tests()"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -365,14 +299,14 @@
|
||||
"id": "82b008ea-f6b5-4bcd-8768-09c8dab089cb",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"As predicted, this is about 10,000 times faster.\n",
|
||||
"This is thousands of times faster.\n",
|
||||
"\n",
|
||||
"We should be able to handle a 16-digit prime in about 2 seconds:"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 10,
|
||||
"execution_count": 8,
|
||||
"id": "9b6030ef-626a-4195-aedb-ef2edac65da4",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
@@ -380,8 +314,8 @@
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"CPU times: user 1.96 s, sys: 19.3 ms, total: 1.97 s\n",
|
||||
"Wall time: 1.97 s\n"
|
||||
"CPU times: user 2.12 s, sys: 13 ms, total: 2.13 s\n",
|
||||
"Wall time: 2.14 s\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -390,7 +324,7 @@
|
||||
"9927935178558959"
|
||||
]
|
||||
},
|
||||
"execution_count": 10,
|
||||
"execution_count": 8,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
@@ -414,17 +348,25 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 11,
|
||||
"execution_count": 9,
|
||||
"id": "0308612c-6860-49b0-bcd6-856fa08133b1",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"CPU times: user 522 μs, sys: 1 μs, total: 523 μs\n",
|
||||
"Wall time: 525 μs\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"[11, 'out of', 11, 'tests pass']"
|
||||
"[12, 'out of', 12, 'tests pass']"
|
||||
]
|
||||
},
|
||||
"execution_count": 11,
|
||||
"execution_count": 9,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
@@ -440,9 +382,10 @@
|
||||
"\n",
|
||||
"def smallest_prime_factor(n):\n",
|
||||
" \"\"\"The smallest prime that evenly divides n (or n itself if no prime divisors).\"\"\"\n",
|
||||
" return next((p for p in range(2, int(sqrt(n) + 1)) if n % p == 0), n)\n",
|
||||
" divisors = (p for p in range(2, int(sqrt(n) + 1)) if n % p == 0)\n",
|
||||
" return next(divisors, n)\n",
|
||||
"\n",
|
||||
"tests()"
|
||||
"%time tests()"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -455,17 +398,25 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 12,
|
||||
"execution_count": 10,
|
||||
"id": "b8907a8f-872f-4531-825c-fae9c70211c1",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"CPU times: user 490 μs, sys: 1 μs, total: 491 μs\n",
|
||||
"Wall time: 492 μs\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"[11, 'out of', 11, 'tests pass']"
|
||||
"[12, 'out of', 12, 'tests pass']"
|
||||
]
|
||||
},
|
||||
"execution_count": 12,
|
||||
"execution_count": 10,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
@@ -485,15 +436,23 @@
|
||||
" p = p + 1\n",
|
||||
" return max(n, largest)\n",
|
||||
" \n",
|
||||
"tests()"
|
||||
"%time tests()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "4f44c6ec-7126-4bc8-9ce2-3fb23154791d",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3 (ipykernel)",
|
||||
"display_name": "Python [conda env:base] *",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
"name": "conda-base-py"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"<div align=\"right\">Peter Norvig, Nov. 2017</div>\n",
|
||||
"<div align=\"right\"><i>Peter Norvig<br>Nov. 2017</i></div>\n",
|
||||
"\n",
|
||||
"# Bad Grade, Good Experience\n",
|
||||
"\n",
|
||||
@@ -12,11 +12,11 @@
|
||||
"\n",
|
||||
"> *As a student, did you ever get a bad grade on a programming assignment?* \n",
|
||||
"\n",
|
||||
"I've forgotten most of my assignments, but there is one I do remember. It was something like this:\n",
|
||||
"There is one that I do remember. It was in an introductory programming class where they wanted the students to get experience in a different language. It went something like this:\n",
|
||||
"\n",
|
||||
"# The Concordance Assignment\n",
|
||||
"\n",
|
||||
"> *Using the [`Snobol`](http://www.snobol4.org/) language, read lines of text from the standard input and print a **concordance**, which is an alphabetized list of words in the text, with the line number(s) where each word appears. Words with different capitalization (like \"A\" and \"a\") should be merged into one entry.*\n",
|
||||
"> *Using the [Snobol](http://www.snobol4.org/) language, read lines of text from the standard input and print a **concordance**, which is an alphabetized list of words in the text, with the line number(s) where each word appears. Words with different capitalization (like \"A\" and \"a\") should be merged into one entry.*\n",
|
||||
"\n",
|
||||
"After studying Snobol a bit, I realized that the expected solution was along these lines:\n",
|
||||
"\n",
|
||||
@@ -28,28 +28,27 @@
|
||||
"\n",
|
||||
"That would be around 40 to 60 lines of code; an easy task. But I noticed three interesting things about Snobol:\n",
|
||||
"\n",
|
||||
"* '`$`' is an *indirection* operator, so if the variable `'word'` has the value `\"A\"`, then `'$word = x'` is the same as `'A = x'`.\n",
|
||||
"* Uninitialized variables are treated as the empty string, so `'A = A + \"text\"'` works even if we haven't seen `'A'` before.\n",
|
||||
"* When the program ends, the Snobol interpreter \n",
|
||||
"- '`$`' is an *indirection* operator, so if the variable `'word'` has the value `\"A\"`, then `'$word = x'` is the same as `'A = x'`.\n",
|
||||
"- Uninitialized variables are treated as the empty string, and coercion to string (e.g. from int) is automatic.\n",
|
||||
" - (For example, `A = A + 1 + \", \"'` sets `A` to `\"1, \"` if `A` was initially undefined.)\n",
|
||||
"- When the program ends, the Snobol interpreter \n",
|
||||
"prints out each variable (in sorted order), with its value, as a debugging aid.\n",
|
||||
"\n",
|
||||
"That means I could use `$` to do away with the hash table and array data structures, eliminating steps 1, 3, 4, and 5, and just do step 2! \n",
|
||||
"\n",
|
||||
"# The Concordance Solution\n",
|
||||
"\n",
|
||||
"I ended up with a program similar to the following (translated from Snobol to Python, but with `'$word'` indirection):"
|
||||
"I ended up with a program similar to the following (translated from Snobol to Python, but using `'$word'` indirection):"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"metadata": {
|
||||
"collapsed": true
|
||||
},
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"program = \"\"\"\n",
|
||||
"for i, line in enumerate(input):\n",
|
||||
"for i, line in enumerate(input, 1):\n",
|
||||
" for word in re.findall(\"[A-Z]+\", line.upper()):\n",
|
||||
" $word = $word + i + \", \"\n",
|
||||
"\"\"\""
|
||||
@@ -61,12 +60,13 @@
|
||||
"source": [
|
||||
"That's just 3 lines, not 40 to 60! \n",
|
||||
"\n",
|
||||
"To test the program, I'll write a mock Snobol/Python interpreter, which at heart is just a call to the Python interpreter, `exec(program)`, except that it handles the three things I mentioned about the Snobol interpreter, plus one more:\n",
|
||||
"# The Snobol/Python Interpreter\n",
|
||||
"\n",
|
||||
"To test the program, I'll write a mock Snobol/Python interpreter, which calls the Python interpreter, `exec(program, _globals)`, except that it handles the three things I mentioned about the Snobol interpreter:\n",
|
||||
"\n",
|
||||
"1. `$word` gets translated as `_globals[word]`.\n",
|
||||
"2. The interpreter calls `exec(program, _globals)`, where `_globals` is a `defaultdict` that makes variables default to the empty string.\n",
|
||||
"3. After the `exec` completes, the user-defined variables (but not the built-in ones) are printed.\n",
|
||||
"4. Concatenating a string with an integer coerces the `int` to `str` automatically. I'll handle that with a `Str` class.\n"
|
||||
"2. Undefined variables default to an empty `Str` (a class that coerces for concatenation).\n",
|
||||
"4. After the `exec` completes, the user-defined variables (but not the built-in ones) are printed.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -79,23 +79,25 @@
|
||||
"import re\n",
|
||||
"\n",
|
||||
"def snobol(program, data=''):\n",
|
||||
" \"\"\"A Python interpreter with four Snobol-ish features:\n",
|
||||
" 1. $word indirection; 2. variables default to empty string; \n",
|
||||
" 3. post-mortem dump; 4. automatic coercing to string\"\"\"\n",
|
||||
" program = re.sub(r'\\$(\\w+)', r'_globals[\\1]', program) # 1. \n",
|
||||
" _globals = defaultdict(Str, vars(__builtins__)) # 4., 2.\n",
|
||||
" _globals.update(re=re, input=data.splitlines(), _globals=_globals)\n",
|
||||
" \"\"\"A Python interpreter with three Snobol-ish features:\n",
|
||||
" • $word indirection; \n",
|
||||
" • variables default to empty string and concatenation coerces to string\n",
|
||||
" • post-mortem dump of all user-defined variables\"\"\"\n",
|
||||
" program = re.sub(r'\\$(\\w+)', r'_globals[\\1]', program) # $ is indirection\n",
|
||||
" _globals = defaultdict(Str) # default var is empty Str\n",
|
||||
" _globals.update(vars(__builtins__), _globals=_globals, # load builtin functions\n",
|
||||
" input=data.splitlines(), re=re)\n",
|
||||
" builtins = set(_globals) | {'__builtins__'}\n",
|
||||
" try:\n",
|
||||
" exec(program, _globals)\n",
|
||||
" finally:\n",
|
||||
" print('-' * 79) # 3. \n",
|
||||
" finally: # post-mortem dump\n",
|
||||
" print('-' * 79) \n",
|
||||
" for name in sorted(_globals):\n",
|
||||
" if name not in builtins:\n",
|
||||
" print('{:10} = {}'.format(name, _globals[name]))\n",
|
||||
" \n",
|
||||
"class Str(str):\n",
|
||||
" \"String class with automatic coercion for +\"\n",
|
||||
" \"\"\"String subclass with automatic coercion for concatenation with +\"\"\"\n",
|
||||
" def __add__(self, other): return Str(str(self) + str(other))\n",
|
||||
" def __radd__(self, other): return Str(str(other) + str(self))\n"
|
||||
]
|
||||
@@ -104,7 +106,7 @@
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Now we can run the program on some data:"
|
||||
"Now we can define some data and run the program on it:"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -113,7 +115,7 @@
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"data = \"\"\"\n",
|
||||
"data = \"\"\"\\\n",
|
||||
"There she was just a-walkin' down the street, \n",
|
||||
"Singin' \"Do wah diddy diddy dum diddy do\"\n",
|
||||
"Snappin' her fingers and shufflin' her feet, \n",
|
||||
@@ -223,7 +225,7 @@
|
||||
],
|
||||
"source": [
|
||||
"program = \"\"\"\n",
|
||||
"for i, line in enumerate(input):\n",
|
||||
"for i, line in enumerate(input, 1):\n",
|
||||
" for word in re.findall(\"[A-Z]+\", line.upper()):\n",
|
||||
" $word = $word + i + \", \"\n",
|
||||
"del i, line, word\n",
|
||||
@@ -247,7 +249,7 @@
|
||||
"# TFW you flunk AI\n",
|
||||
"\n",
|
||||
"Here's another example that I had completely forgotten about until 2016, when I was cleaning out a filing cabinet and came across my old college transcript. It turns out that *I flunked an AI course!* (Or at least, didn't complete it.) This course was offered by Prof. Richard Millward in the Cognitive Science program. I certainly remember a lot of influential material from this class: we read David Marr, we read Winston's just-published *Psychology of Computer Vision*, we read a chapter from Duda and Hart which was then only a few years old. The things I learned in that course have stuck with me for decades, but one thing that didn't stick is that, according to my transcript, I never completed the course! I'm not sure what happened. I did an independent study with Ulf Grenander that semester; my best guess\n",
|
||||
"is that when I started doing the independent study that would have put me over some limit, and so I had to drop the AI course. \n",
|
||||
"is that when I started doing the independent study that would have put me over some limit for number of credits taken, and so I had to drop the AI course. \n",
|
||||
"\n",
|
||||
"So in both the concordance program and the Cognitive Science AI class, I had a great experience and I learned a lot, even if it wasn't well-reflected in official credit. The moral is: look for the good experiences, and don't worry about the official credit.\n"
|
||||
]
|
||||
@@ -255,7 +257,7 @@
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3",
|
||||
"display_name": "Python 3 (ipykernel)",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
@@ -269,9 +271,9 @@
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.5.3"
|
||||
"version": "3.13.9"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 2
|
||||
"nbformat_minor": 4
|
||||
}
|
||||
|
||||
254
ipynb/euler_data.py
Normal file
254
ipynb/euler_data.py
Normal file
@@ -0,0 +1,254 @@
|
||||
#### Project Euler: data and problem running harness
|
||||
#### Used by Euler.ipynb and Euler-LLM.upynb
|
||||
|
||||
from pathlib import Path
|
||||
from statistics import mean, median
|
||||
import time
|
||||
|
||||
#### Harness: `run(euler_1)` to record and data and `runs()` to display it
|
||||
|
||||
RUNS = {}
|
||||
|
||||
class run:
|
||||
"""Verify that calling `euler_n()` computes the `EXPECTED` result.
|
||||
Store run objects in `RUNS`."""
|
||||
def __init__(self, euler_n):
|
||||
n = int(euler_n.__name__.split('_')[1])
|
||||
self.n = n
|
||||
RUNS[n] = self
|
||||
self.title = (euler_n.__doc__ or '?:').split(':')[0]
|
||||
start = time.perf_counter()
|
||||
self.got = euler_n()
|
||||
self.msecs = round((time.perf_counter() - start) * 1000)
|
||||
|
||||
def __repr__(self) -> str:
|
||||
expected = EXPECTED[self.n]
|
||||
check = ('✅' if (self.got == expected) else f'❌ (expected {expected})')
|
||||
speed = ('🐌' if self.msecs > 1000 else '') # Snail icon for run times over a second
|
||||
return f'{self.n:3}: {self.title:40} {self.msecs:6,d} msec ⇒ {self.got:<16} {check} {speed}'
|
||||
|
||||
def runs() -> None:
|
||||
"""Summary report on all the runs."""
|
||||
T = [answer.msecs / 1000 for answer in RUNS.values()]
|
||||
print(f'Problems: {len(T)}\n'
|
||||
f'Run time in seconds: total: {sum(T):.1f}, max: {max(T):.1f}, '
|
||||
f'mean: {mean(T):.3f}, median: {median(T):.3f}\n')
|
||||
for i in sorted(RUNS):
|
||||
print(RUNS[i])
|
||||
|
||||
#### Expected answers
|
||||
|
||||
EXPECTED = {
|
||||
1: 233168, 2: 4613732, 3: 6857, 4: 906609, 5: 232792560, 6: 25164150,
|
||||
7: 104743, 8: 23514624000, 9: 31875000, 10: 142913828922, 11: 70600674,
|
||||
12: 76576500, 13: 5537376230, 14: 837799, 15: 137846528820, 16: 1366,
|
||||
17: 21124, 18: 1074, 19: 171, 20: 648, 21: 31626, 22: 871198282,
|
||||
23: 4179871, 24: 2783915460, 25: 4782, 26: 983, 27: -59231, 28: 669171001,
|
||||
29: 9183, 30: 443839, 31: 73682, 32: 45228, 33: 100, 34: 40730, 35: 55,
|
||||
36: 872187, 37: 748317, 38: 932718654, 39: 840, 40: 210, 41: 7652413,
|
||||
42: 162, 43: 16695334890, 44: 5482660, 45: 1533776805, 46: 5777,
|
||||
47: 134043, 48: 9110846700, 49: 296962999629, 50: 997651, 51: 121313,
|
||||
52: 142857, 53: 4075, 54: 376, 55: 249, 56: 972, 57: 153, 58: 26241,
|
||||
59: 107359, 60: 26033, 61: 28684, 62: 127035954683, 63: 49, 64: 1322,
|
||||
65: 272, 66: 661, 67: 7273, 68: 6531031914842725, 69: 510510, 70: 8319823,
|
||||
71: 428570, 72: 303963552391, 73: 7295372, 74: 402, 75: 161667,
|
||||
76: 190569291, 77: 71, 78: 55374, 79: 73162890, 80: 40886, 81: 427337,
|
||||
82: 260324, 83: 425185, 84: 101524, 85: 2772, 86: 1818, 87: 1097343,
|
||||
88: 7587457, 89: 743, 90: 1217, 91: 14234, 92: 8581146, 93: 1258,
|
||||
94: 518408346, 95: 14316, 96: 24702, 97: 8739992577, 98: 18769, 99: 709,
|
||||
100: 756872327473,
|
||||
}
|
||||
|
||||
#### Data
|
||||
|
||||
#### 13 problems have data from a file
|
||||
#### 4 problems have data mentioned in the problem description and copied here
|
||||
|
||||
def read_data(filename) -> str:
|
||||
"""Read a file from the data/ subdirectory and return the contents as a stripped string."""
|
||||
return ("data" / Path(filename)).read_text().strip()
|
||||
|
||||
DATA = {
|
||||
22: read_data("0022_names.txt"),
|
||||
42: read_data("0042_words.txt"),
|
||||
54: read_data("0054_poker.txt"),
|
||||
59: read_data("0059_cipher.txt"),
|
||||
67: read_data("0067_triangle.txt"),
|
||||
79: read_data("0079_keylog.txt"),
|
||||
81: read_data("0081_matrix.txt"),
|
||||
82: read_data("0082_matrix.txt"),
|
||||
83: read_data("0083_matrix.txt"),
|
||||
89: read_data("0089_roman.txt"),
|
||||
96: read_data("0096_sudoku.txt"),
|
||||
98: read_data("0098_words.txt"),
|
||||
99: read_data("0099_base_exp.txt"),
|
||||
|
||||
|
||||
8: """
|
||||
73167176531330624919225119674426574742355349194934
|
||||
96983520312774506326239578318016984801869478851843
|
||||
85861560789112949495459501737958331952853208805511
|
||||
12540698747158523863050715693290963295227443043557
|
||||
66896648950445244523161731856403098711121722383113
|
||||
62229893423380308135336276614282806444486645238749
|
||||
30358907296290491560440772390713810515859307960866
|
||||
70172427121883998797908792274921901699720888093776
|
||||
65727333001053367881220235421809751254540594752243
|
||||
52584907711670556013604839586446706324415722155397
|
||||
53697817977846174064955149290862569321978468622482
|
||||
83972241375657056057490261407972968652414535100474
|
||||
82166370484403199890008895243450658541227588666881
|
||||
16427171479924442928230863465674813919123162824586
|
||||
17866458359124566529476545682848912883142607690042
|
||||
24219022671055626321111109370544217506941658960408
|
||||
07198403850962455444362981230987879927244284909188
|
||||
84580156166097919133875499200524063689912560717606
|
||||
05886116467109405077541002256983155200055935729725
|
||||
71636269561882670428252483600823257530420752963450
|
||||
""",
|
||||
|
||||
11: """
|
||||
08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08
|
||||
49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00
|
||||
81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65
|
||||
52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91
|
||||
22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80
|
||||
24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50
|
||||
32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70
|
||||
67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21
|
||||
24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72
|
||||
21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95
|
||||
78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92
|
||||
16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57
|
||||
86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58
|
||||
19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40
|
||||
04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66
|
||||
88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69
|
||||
04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36
|
||||
20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16
|
||||
20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54
|
||||
01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48
|
||||
""",
|
||||
|
||||
18: """
|
||||
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
|
||||
""",
|
||||
|
||||
|
||||
13: """
|
||||
37107287533902102798797998220837590246510135740250
|
||||
46376937677490009712648124896970078050417018260538
|
||||
74324986199524741059474233309513058123726617309629
|
||||
91942213363574161572522430563301811072406154908250
|
||||
23067588207539346171171980310421047513778063246676
|
||||
89261670696623633820136378418383684178734361726757
|
||||
28112879812849979408065481931592621691275889832738
|
||||
44274228917432520321923589422876796487670272189318
|
||||
47451445736001306439091167216856844588711603153276
|
||||
70386486105843025439939619828917593665686757934951
|
||||
62176457141856560629502157223196586755079324193331
|
||||
64906352462741904929101432445813822663347944758178
|
||||
92575867718337217661963751590579239728245598838407
|
||||
58203565325359399008402633568948830189458628227828
|
||||
80181199384826282014278194139940567587151170094390
|
||||
35398664372827112653829987240784473053190104293586
|
||||
86515506006295864861532075273371959191420517255829
|
||||
71693888707715466499115593487603532921714970056938
|
||||
54370070576826684624621495650076471787294438377604
|
||||
53282654108756828443191190634694037855217779295145
|
||||
36123272525000296071075082563815656710885258350721
|
||||
45876576172410976447339110607218265236877223636045
|
||||
17423706905851860660448207621209813287860733969412
|
||||
81142660418086830619328460811191061556940512689692
|
||||
51934325451728388641918047049293215058642563049483
|
||||
62467221648435076201727918039944693004732956340691
|
||||
15732444386908125794514089057706229429197107928209
|
||||
55037687525678773091862540744969844508330393682126
|
||||
18336384825330154686196124348767681297534375946515
|
||||
80386287592878490201521685554828717201219257766954
|
||||
78182833757993103614740356856449095527097864797581
|
||||
16726320100436897842553539920931837441497806860984
|
||||
48403098129077791799088218795327364475675590848030
|
||||
87086987551392711854517078544161852424320693150332
|
||||
59959406895756536782107074926966537676326235447210
|
||||
69793950679652694742597709739166693763042633987085
|
||||
41052684708299085211399427365734116182760315001271
|
||||
65378607361501080857009149939512557028198746004375
|
||||
35829035317434717326932123578154982629742552737307
|
||||
94953759765105305946966067683156574377167401875275
|
||||
88902802571733229619176668713819931811048770190271
|
||||
25267680276078003013678680992525463401061632866526
|
||||
36270218540497705585629946580636237993140746255962
|
||||
24074486908231174977792365466257246923322810917141
|
||||
91430288197103288597806669760892938638285025333403
|
||||
34413065578016127815921815005561868836468420090470
|
||||
23053081172816430487623791969842487255036638784583
|
||||
11487696932154902810424020138335124462181441773470
|
||||
63783299490636259666498587618221225225512486764533
|
||||
67720186971698544312419572409913959008952310058822
|
||||
95548255300263520781532296796249481641953868218774
|
||||
76085327132285723110424803456124867697064507995236
|
||||
37774242535411291684276865538926205024910326572967
|
||||
23701913275725675285653248258265463092207058596522
|
||||
29798860272258331913126375147341994889534765745501
|
||||
18495701454879288984856827726077713721403798879715
|
||||
38298203783031473527721580348144513491373226651381
|
||||
34829543829199918180278916522431027392251122869539
|
||||
40957953066405232632538044100059654939159879593635
|
||||
29746152185502371307642255121183693803580388584903
|
||||
41698116222072977186158236678424689157993532961922
|
||||
62467957194401269043877107275048102390895523597457
|
||||
23189706772547915061505504953922979530901129967519
|
||||
86188088225875314529584099251203829009407770775672
|
||||
11306739708304724483816533873502340845647058077308
|
||||
82959174767140363198008187129011875491310547126581
|
||||
97623331044818386269515456334926366572897563400500
|
||||
42846280183517070527831839425882145521227251250327
|
||||
55121603546981200581762165212827652751691296897789
|
||||
32238195734329339946437501907836945765883352399886
|
||||
75506164965184775180738168837861091527357929701337
|
||||
62177842752192623401942399639168044983993173312731
|
||||
32924185707147349566916674687634660915035914677504
|
||||
99518671430235219628894890102423325116913619626622
|
||||
73267460800591547471830798392868535206946944540724
|
||||
76841822524674417161514036427982273348055556214818
|
||||
97142617910342598647204516893989422179826088076852
|
||||
87783646182799346313767754307809363333018982642090
|
||||
10848802521674670883215120185883543223812876952786
|
||||
71329612474782464538636993009049310363619763878039
|
||||
62184073572399794223406235393808339651327408011116
|
||||
66627891981488087797941876876144230030984490851411
|
||||
60661826293682836764744779239180335110989069790714
|
||||
85786944089552990653640447425576083659976645795096
|
||||
66024396409905389607120198219976047599490197230297
|
||||
64913982680032973156037120041377903785566085089252
|
||||
16730939319872750275468906903707539413042652315011
|
||||
94809377245048795150954100921645863754710598436791
|
||||
78639167021187492431995700641917969777599028300699
|
||||
15368713711936614952811305876380278410754449733078
|
||||
40789923115535562561142322423255033685442488917353
|
||||
44889911501440648020369068063960672322193204149535
|
||||
41503128880339536053299340368006977710650566631954
|
||||
81234880673210146739058568557934581403627822703280
|
||||
82616570773948327592232845941706525094512325230608
|
||||
22918802058777319719839450180888072429661980811197
|
||||
77158542502016545090413245809786882778948721859617
|
||||
72107838435069186155435662884062257473692284509516
|
||||
20849603980134001723930671666823555245252804609722
|
||||
53503534226472524250874054075591789781264330331690
|
||||
"""
|
||||
}
|
||||
@@ -34,8 +34,11 @@ notebooks = {
|
||||
('Advent of Code 2017', 2017, 'Advent-2017.ipynb', 'Puzzle site with a coding puzzle each day of Advent, December 2017'),
|
||||
('Advent of Code 2016', 2016, 'Advent-2016.ipynb', 'Puzzle site with a coding puzzle each day of Advent, December 2016'),
|
||||
('Advent of Code Utilities', 2022, 'AdventUtils.ipynb', 'Utility functions for Advent of Code puzzles'),
|
||||
('Project Euler 1–100', 2026, 'Euler.ipynb', 'Solutions to the first 100 Project Euler math/programming problems'),
|
||||
('Project Euler #3: Largest prime factor', 2026, 'Euler3.ipynb', 'For beginner programmers: How to find the largest prime factor of a number'),
|
||||
('Project Euler #1–100 by a Human', 2026, 'Euler.ipynb', 'Solutions to the first 100 Project Euler math/programming problems'),
|
||||
('Project Euler #1–100 by Fable LLM', 2026, 'Euler-Fable.ipynb', 'Solutions to Project Euler math/programming problems by Claude Fable LLM'),
|
||||
('Project Euler #1–100 by Opus LLM', 2026, 'Euler-Opus.ipynb', 'Solutions to Project Euler math/programming problems by Claude Opus LLM'),
|
||||
('Project Euler #1–100 by Kimi LLM', 2026, 'Euler-Kimi.ipynb', 'Solutions to Project Euler math/programming problems by Kimi LLM'),
|
||||
('Largest prime factor', 2026, 'Euler3.ipynb', 'For beginner programmers: How to find the largest prime factor of a number. Project Euler #3.'),
|
||||
],
|
||||
|
||||
'Probability and Uncertainty': [
|
||||
|
||||
Reference in New Issue
Block a user