{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Lychrel numbers (Euler Problem 55)" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "[https://projecteuler.net/problem=55](https://projecteuler.net/problem=55)\n", "\n", "If we take 47, reverse and add, 47 + 74 = 121, which is palindromic.\n", "\n", "Not all numbers produce palindromes so quickly. For example,\n", "\n", "$349 + 943 = 1292$\n", "\n", "$1292 + 2921 = 4213$\n", "\n", "$4213 + 3124 = 7337$\n", "\n", "That is, 349 took three iterations to arrive at a palindrome.\n", "\n", "Although no one has proved it yet, it is thought that some numbers, like 196, never produce a palindrome. A number that never forms a palindrome through the reverse and add process is called a Lychrel number. Due to the theoretical nature of these numbers, and for the purpose of this problem, we shall assume that a number is Lychrel until proven otherwise. In addition you are given that for every number below ten-thousand, it will either (i) become a palindrome in less than fifty iterations, or, (ii) no one, with all the computing power that exists, has managed so far to map it to a palindrome. In fact, 10677 is the first number to be shown to require over fifty iterations before producing a palindrome: 4668731596684224866951378664 (53 iterations, 28-digits).\n", "\n", "Surprisingly, there are palindromic numbers that are themselves Lychrel numbers; the first example is 4994.\n", "\n", "How many Lychrel numbers are there below ten-thousand?\n", "\n", "NOTE: Wording was modified slightly on 24 April 2007 to emphasise the theoretical nature of Lychrel numbers." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def get_digits(n):\n", " d = []\n", " while n:\n", " d.append(n % 10)\n", " n //= 10\n", " return d\n", "\n", "def is_pilandrome(n):\n", " ds = get_digits(n)\n", " len_ds = len(ds)\n", " if len_ds < 2:\n", " return True\n", " for i in range(0, len_ds // 2):\n", " if ds[i] != ds[len_ds - i - 1]:\n", " return False\n", " return True\n", "\n", "assert(is_pilandrome(1337) == False)\n", "assert(is_pilandrome(1331))\n", "assert(is_pilandrome(131))\n", "assert(is_pilandrome(132) == False)\n", "\n", "\n", "def get_digit_inverse(n):\n", " ds = get_digits(n)\n", " base = 1\n", " i = 0\n", " for d in ds[::-1]:\n", " i += (base * d)\n", " base *= 10\n", " return i\n", "\n", "assert(get_digit_inverse(47) == 74)\n", "assert(get_digit_inverse(47) == 74)" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def is_not_lychrel(n, iterations=50):\n", " for i in range(0, iterations):\n", " n = n + get_digit_inverse(n)\n", " if is_pilandrome(n):\n", " return (i + 1)\n", " return 0\n", "\n", "assert(is_not_lychrel(47) == 1)\n", "assert(is_not_lychrel(349) == 3)\n", "assert(is_not_lychrel(10677, 100) == 53)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "249\n" ] } ], "source": [ "lychrels = [n for n in range(1, 10000) if is_not_lychrel(n) == 0]\n", "s = len(lychrels)\n", "print(s)\n", "assert(s == 249)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "completion_date": "Mon, 24 Dec 2018, 23: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": [ "lychrel", "airplane" ] }, "nbformat": 4, "nbformat_minor": 2 }