132 lines
3.3 KiB
Plaintext
132 lines
3.3 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "aac67a5d",
|
|
"metadata": {},
|
|
"source": [
|
|
"# [Sub-string Divisibility](https://projecteuler.net/problem=43)\n",
|
|
"\n",
|
|
"If you *really* wanted to, you could work this out with pen and paper using [divisibility rules](https://en.wikipedia.org/wiki/Divisibility_rule). Alternatively, it's easy to brute force. First we write a function to test for the given property."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 1,
|
|
"id": "71136ed1",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"def is_substring_divisible(digits):\n",
|
|
" for idx, divisor in enumerate((2, 3, 5, 7, 11, 13, 17), start=1):\n",
|
|
" x, y, z = digits[idx:idx+3]\n",
|
|
" n = 100*x + 10*y + z\n",
|
|
" if n % divisor != 0:\n",
|
|
" return False\n",
|
|
" \n",
|
|
" return True"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "3560bcb4",
|
|
"metadata": {},
|
|
"source": [
|
|
"Then we test every permutation of 0 through 9. There's $10! = 3628800$ such permutations, which may seem like a lot, and you could apply some logic to reduce the search space some (e.g. $d_4$ must be 0, 2, 4, 6, or 8), but the test runs relatively quickly for each permutation as-is."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 2,
|
|
"id": "dc866d6b",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"{1406357289, 1430952867, 1460357289, 4106357289, 4130952867, 4160357289}"
|
|
]
|
|
},
|
|
"execution_count": 2,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"from itertools import permutations\n",
|
|
"\n",
|
|
"numbers = set()\n",
|
|
"for digits in permutations((0,1,2,3,4,5,6,7,8,9)):\n",
|
|
" if is_substring_divisible(digits):\n",
|
|
" n = sum(10^k * digit for (k, digit) in enumerate(reversed(digits)))\n",
|
|
" numbers.add(n)\n",
|
|
" \n",
|
|
"numbers"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "fca588e4",
|
|
"metadata": {},
|
|
"source": [
|
|
"Turns out there's only six of these numbers."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 3,
|
|
"id": "b6275692",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"16695334890"
|
|
]
|
|
},
|
|
"execution_count": 3,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"sum(numbers)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "bfaa46b7",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Relevant sequences\n",
|
|
"* Pandigital numbers: [A050278](https://oeis.org/A050278)\n",
|
|
"\n",
|
|
"#### Copyright (C) 2025 filifa\n",
|
|
"\n",
|
|
"This work is licensed under the [Creative Commons Attribution-ShareAlike 4.0 International license](https://creativecommons.org/licenses/by-sa/4.0/) and the [BSD Zero Clause license](https://spdx.org/licenses/0BSD.html)."
|
|
]
|
|
}
|
|
],
|
|
"metadata": {
|
|
"kernelspec": {
|
|
"display_name": "SageMath 9.5",
|
|
"language": "sage",
|
|
"name": "sagemath"
|
|
},
|
|
"language_info": {
|
|
"codemirror_mode": {
|
|
"name": "ipython",
|
|
"version": 3
|
|
},
|
|
"file_extension": ".py",
|
|
"mimetype": "text/x-python",
|
|
"name": "python",
|
|
"nbconvert_exporter": "python",
|
|
"pygments_lexer": "ipython3",
|
|
"version": "3.11.2"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 5
|
|
}
|