Solved 51 and 52.

main
Felix Martin 2018-12-23 21:54:15 -05:00
parent 7898b3e7f9
commit fb9efe4db8
5 changed files with 12342 additions and 4 deletions

View File

@ -22,6 +22,133 @@
"Find the smallest prime which, by replacing part of the number (not necessarily adjacent digits) with the same digit, is part of an eight prime value family."
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"We start by writing a function that takes a number and returns all possible replacements.\n",
"\n",
"For example 13 will return [\"x3\", \"1x\"].\n",
"\n",
"I actually had a version that simply replace even digits at first, but that does not work for 56333 for example, because you want to get 56xx3 and not 56xxx. So basically, we have to search for all combinations for each digit. I should probably document what each list comprehension does or I will never understand it again. Haha."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['x3', '1x']\n"
]
}
],
"source": [
"from itertools import combinations\n",
"\n",
"def get_replacements(n):\n",
" n = str(n)\n",
" xss= [[i for i in range(0, len(n)) if n[i] == d]\n",
" for d in \"0123456789\"]\n",
" xss = [x \n",
" for xs in xss if xs\n",
" for i in range(1, len(xs) + 1)\n",
" for x in combinations(xs, i)]\n",
" xss = [\"\".join(['x' if i in xs else d for i, d in enumerate(n)])\n",
" for xs in xss]\n",
" return xss\n",
"\n",
"#assert(get_replacements(13) == [\"x3\", \"1x\"])\n",
"print(get_replacements(13))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We will use our good old prime generator."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def is_prime(n, smaller_primes):\n",
" for s in smaller_primes:\n",
" if n % s == 0:\n",
" return False\n",
" if s * s > n:\n",
" return True\n",
" return True\n",
"\n",
"def prime_generator_function():\n",
" primes = [2, 3, 5, 7]\n",
" for p in primes:\n",
" yield p\n",
" while True:\n",
" p += 2\n",
" if is_prime(p, primes):\n",
" primes.append(p)\n",
" yield p"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[121313, 222323, 323333, 424343, 525353, 626363, 828383, 929393]\n"
]
}
],
"source": [
"replacements = {}\n",
"ps = prime_generator_function()\n",
"for p in ps:\n",
" for r in get_replacements(p):\n",
" try:\n",
" replacements[r].append(p)\n",
" if len(replacements[r]) == 8:\n",
" print(replacements[r])\n",
" s = replacements[r][0]\n",
" p = 100000000000 # We have found a solution so we go home\n",
" except KeyError:\n",
" replacements[r] = [p]\n",
" if p > 1000000:\n",
" break"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"121313\n"
]
}
],
"source": [
"print(s)\n",
"assert(s == 121313)"
]
},
{
"cell_type": "code",
"execution_count": null,
@ -33,7 +160,7 @@
}
],
"metadata": {
"completion_date": "",
"completion_date": "Sun, 23 Dec 2018, 23:47",
"kernelspec": {
"display_name": "Python 3",
"language": "python3.6",
@ -51,7 +178,11 @@
"pygments_lexer": "ipython3",
"version": "3.6.5"
},
"tags": []
"tags": [
"prime",
"combinations",
"replacement"
]
},
"nbformat": 4,
"nbformat_minor": 2

View File

@ -0,0 +1,147 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Permuted multiples (Euler Problem 52)"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"[https://projecteuler.net/problem=52](https://projecteuler.net/problem=52)\n",
"\n",
"It can be seen that the number, 125874, and its double, 251748, contain exactly the same digits, but in a different order.\n",
"\n",
"Find the smallest positive integer, x, such that 2x, 3x, 4x, 5x, and 6x, contain the same digits."
]
},
{
"cell_type": "code",
"execution_count": 56,
"metadata": {},
"outputs": [],
"source": [
"from functools import reduce\n",
"from operator import eq\n",
"\n",
"def get_length(n):\n",
" \"\"\" Returns the number of digits for n.\n",
" Returns wrong result for n = 0. \"\"\"\n",
" length = 0\n",
" while n:\n",
" length += 1\n",
" n //= 10\n",
" return length\n",
"\n",
"assert(get_length(100) == 3)\n",
"\n",
"def get_digits(n):\n",
" d = []\n",
" while n:\n",
" d.append(n % 10)\n",
" n //= 10\n",
" return d\n",
"\n",
"assert(get_digits(213) == [3, 1, 2])\n",
"\n",
"def get_digits_count(n):\n",
" digits_count = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n",
" for d in get_digits(n):\n",
" digits_count[d] += 1\n",
" return digits_count\n",
"\n",
"assert(get_digits_count(1258744) == [0, 1, 1, 0, 2, 1, 0, 1, 1, 0])"
]
},
{
"cell_type": "code",
"execution_count": 64,
"metadata": {},
"outputs": [],
"source": [
"def check_if_multiples_contain_same_digits(n, max_multiple=2):\n",
" n_digits_count = get_digits_count(n)\n",
" n_length = get_length(n)\n",
" n_multiple = n * max_multiple\n",
" while n != n_multiple:\n",
" if n_length != get_length(n_multiple) or n_digits_count != get_digits_count(n_multiple):\n",
" return False\n",
" n_multiple -= n\n",
" return True\n",
"\n",
"assert(check_if_multiples_contain_same_digits(125874))\n",
"assert(check_if_multiples_contain_same_digits(125875) == False)"
]
},
{
"cell_type": "code",
"execution_count": 70,
"metadata": {},
"outputs": [],
"source": [
"for i in range(1, 10000000):\n",
" if check_if_multiples_contain_same_digits(i, 6):\n",
" s = i\n",
" break"
]
},
{
"cell_type": "code",
"execution_count": 72,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"142857\n"
]
}
],
"source": [
"print(s)\n",
"assert(s == 142857)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"completion_date": "Mon, 24 Dec 2018, 02:32",
"kernelspec": {
"display_name": "Python 3",
"language": "python3.6",
"name": "python3"
},
"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.6.5"
},
"tags": [
"digits",
"permutations"
]
},
"nbformat": 4,
"nbformat_minor": 2
}

View File

@ -11785,6 +11785,146 @@ div#notebook {
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>We start by writing a function that takes a number and returns all possible replacements.</p>
<p>For example 13 will return ["x3", "1x"].</p>
<p>I actually had a version that simply replace even digits at first, but that does not work for 56333 for example, because you want to get 56xx3 and not 56xxx. So basically, we have to search for all combinations for each digit. I should probably document what each list comprehension does or I will never understand it again. Haha.</p>
</div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="prompt input_prompt">In [1]:</div>
<div class="inner_cell">
<div class="input_area">
<div class=" highlight hl-ipython3"><pre><span></span><span class="kn">from</span> <span class="nn">itertools</span> <span class="k">import</span> <span class="n">combinations</span>
<span class="k">def</span> <span class="nf">get_replacements</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
<span class="n">n</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">n</span><span class="p">)</span>
<span class="n">xss</span><span class="o">=</span> <span class="p">[[</span><span class="n">i</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">n</span><span class="p">))</span> <span class="k">if</span> <span class="n">n</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">==</span> <span class="n">d</span><span class="p">]</span>
<span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="s2">"0123456789"</span><span class="p">]</span>
<span class="n">xss</span> <span class="o">=</span> <span class="p">[</span><span class="n">x</span>
<span class="k">for</span> <span class="n">xs</span> <span class="ow">in</span> <span class="n">xss</span> <span class="k">if</span> <span class="n">xs</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">xs</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span>
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">combinations</span><span class="p">(</span><span class="n">xs</span><span class="p">,</span> <span class="n">i</span><span class="p">)]</span>
<span class="n">xss</span> <span class="o">=</span> <span class="p">[</span><span class="s2">""</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="s1">'x'</span> <span class="k">if</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">xs</span> <span class="k">else</span> <span class="n">d</span> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">d</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">n</span><span class="p">)])</span>
<span class="k">for</span> <span class="n">xs</span> <span class="ow">in</span> <span class="n">xss</span><span class="p">]</span>
<span class="k">return</span> <span class="n">xss</span>
<span class="c1">#assert(get_replacements(13) == ["x3", "1x"])</span>
<span class="nb">print</span><span class="p">(</span><span class="n">get_replacements</span><span class="p">(</span><span class="mi">13</span><span class="p">))</span>
</pre></div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt"></div>
<div class="output_subarea output_stream output_stdout output_text">
<pre>['x3', '1x']
</pre>
</div>
</div>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>We will use our good old prime generator.</p>
</div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="prompt input_prompt">In [2]:</div>
<div class="inner_cell">
<div class="input_area">
<div class=" highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">is_prime</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">smaller_primes</span><span class="p">):</span>
<span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="n">smaller_primes</span><span class="p">:</span>
<span class="k">if</span> <span class="n">n</span> <span class="o">%</span> <span class="n">s</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="k">if</span> <span class="n">s</span> <span class="o">*</span> <span class="n">s</span> <span class="o">&gt;</span> <span class="n">n</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">def</span> <span class="nf">prime_generator_function</span><span class="p">():</span>
<span class="n">primes</span> <span class="o">=</span> <span class="p">[</span><span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">7</span><span class="p">]</span>
<span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">primes</span><span class="p">:</span>
<span class="k">yield</span> <span class="n">p</span>
<span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
<span class="n">p</span> <span class="o">+=</span> <span class="mi">2</span>
<span class="k">if</span> <span class="n">is_prime</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">primes</span><span class="p">):</span>
<span class="n">primes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">p</span><span class="p">)</span>
<span class="k">yield</span> <span class="n">p</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="prompt input_prompt">In [3]:</div>
<div class="inner_cell">
<div class="input_area">
<div class=" highlight hl-ipython3"><pre><span></span><span class="n">replacements</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">ps</span> <span class="o">=</span> <span class="n">prime_generator_function</span><span class="p">()</span>
<span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">ps</span><span class="p">:</span>
<span class="k">for</span> <span class="n">r</span> <span class="ow">in</span> <span class="n">get_replacements</span><span class="p">(</span><span class="n">p</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">replacements</span><span class="p">[</span><span class="n">r</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">p</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">replacements</span><span class="p">[</span><span class="n">r</span><span class="p">])</span> <span class="o">==</span> <span class="mi">8</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="n">replacements</span><span class="p">[</span><span class="n">r</span><span class="p">])</span>
<span class="n">s</span> <span class="o">=</span> <span class="n">replacements</span><span class="p">[</span><span class="n">r</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
<span class="n">p</span> <span class="o">=</span> <span class="mi">100000000000</span> <span class="c1"># We have found a solution so we go home</span>
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
<span class="n">replacements</span><span class="p">[</span><span class="n">r</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="n">p</span><span class="p">]</span>
<span class="k">if</span> <span class="n">p</span> <span class="o">&gt;</span> <span class="mi">1000000</span><span class="p">:</span>
<span class="k">break</span>
</pre></div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt"></div>
<div class="output_subarea output_stream output_stdout output_text">
<pre>[121313, 222323, 323333, 424343, 525353, 626363, 828383, 929393]
</pre>
</div>
</div>
</div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="prompt input_prompt">In [4]:</div>
<div class="inner_cell">
<div class="input_area">
<div class=" highlight hl-ipython3"><pre><span></span><span class="nb">print</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
<span class="k">assert</span><span class="p">(</span><span class="n">s</span> <span class="o">==</span> <span class="mi">121313</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt"></div>
<div class="output_subarea output_stream output_stdout output_text">
<pre>121313
</pre>
</div>
</div>
</div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="prompt input_prompt">In [ ]:</div>

File diff suppressed because it is too large Load Diff

View File

@ -809,12 +809,32 @@
</tr>
<tr class="table-warning">
<tr>
<td><a href="EulerProblem051.html">Problem 051</a></td>
<td></td>
<td>Sun, 23 Dec 2018, 23:47</td>
<td>
<kbd>prime</kbd>
<kbd>combinations</kbd>
<kbd>replacement</kbd>
</td>
</tr>
<tr>
<td><a href="EulerProblem052.html">Problem 052</a></td>
<td>Mon, 24 Dec 2018, 02:32</td>
<td>
<kbd>digits</kbd>
<kbd>permutations</kbd>
</td>
</tr>