{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Sub-string divisibility (Euler Problem 43)" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "[https://projecteuler.net/problem=43](https://projecteuler.net/problem=43)\n", "\n", "The number, 1406357289, is a 0 to 9 pandigital number because it is made up of each of the digits 0 to 9 in some order, but it also has a rather interesting sub-string divisibility property.\n", "\n", "Let $d_1$ be the 1st digit, $d_2$ be the 2nd digit, and so on. In this way, we note the following:\n", "\n", "$d_2d_3d_4$=406 is divisible by 2\n", "\n", "$d_3d_4d_5$=063 is divisible by 3\n", "\n", "$d_4d_5d_6$=635 is divisible by 5\n", "\n", "$d_5d_6d_7=357$ is divisible by 7\n", "\n", "$d_6d_7d_8=572$ is divisible by 11\n", "\n", "$d_7d_8d_9=728$ is divisible by 13\n", "\n", "$d_8d_9d_{10} =289$ is divisible by 17\n", "\n", "Find the sum of all 0 to 9 pandigital numbers with this property." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We write a function that tests for the sub-string divisibility property. Then we simply brute force." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "def is_sub_string_divisible(s):\n", " s = \"\".join(s)\n", " if int(s[1:4]) % 2 != 0:\n", " return False\n", " if int(s[2:5]) % 3 != 0:\n", " return False\n", " if int(s[3:6]) % 5 != 0:\n", " return False\n", " if int(s[4:7]) % 7 != 0:\n", " return False\n", " if int(s[5:8]) % 11 != 0:\n", " return False\n", " if int(s[6:9]) % 13 != 0:\n", " return False\n", " if int(s[7:10]) % 17 != 0:\n", " return False\n", " return True\n", "\n", "assert(is_sub_string_divisible(\"1406357289\"))\n", "assert(is_sub_string_divisible(\"1406357298\") == False)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "import itertools\n", "\n", "s = sum([int(\"\".join(p)) for p in itertools.permutations(\"0123456789\") if is_sub_string_divisible(p)])" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "16695334890\n" ] } ], "source": [ "print(s)\n", "assert(s == 16695334890)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "I just want to write my own permutations functions to see that I am able to do it quickly. We pick each element once and combine it with the permutations for the remaining items:" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [], "source": [ "def permutations(items):\n", " items = list(items)\n", " if not items:\n", " return [[]]\n", " perms = []\n", " for item in items:\n", " items_new = list(items)\n", " items_new.remove(item)\n", " permutations_new = permutations(items_new)\n", " for perm in permutations_new:\n", " perms.append([item] + perm)\n", " return perms\n", "\n", "\n", "assert(permutations([]) == [[]])\n", "assert(permutations([1]) == [[1]])\n", "assert(permutations([1,2]) == [[1,2], [2,1]])\n", "assert(permutations([1,2,3]) == [[1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]])\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "completion_date": "Fri, 21 Dec 2018, 16:28", "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": [ "pandigital", "divisibility", "permutations" ] }, "nbformat": 4, "nbformat_minor": 2 }