{
 "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
}
