Done puzzle 40
authorNeil Smith <neil.git@njae.me.uk>
Tue, 21 Feb 2017 16:48:01 +0000 (16:48 +0000)
committerNeil Smith <neil.git@njae.me.uk>
Tue, 21 Feb 2017 16:48:01 +0000 (16:48 +0000)
euler40.ipynb [new file with mode: 0644]

diff --git a/euler40.ipynb b/euler40.ipynb
new file mode 100644 (file)
index 0000000..33f3dab
--- /dev/null
@@ -0,0 +1,704 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 45,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "true"
+      ]
+     },
+     "execution_count": 45,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "load 'array-numbers.rb'"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 46,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "38890"
+      ]
+     },
+     "execution_count": 46,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "ch = (0..9999).flat_map {|i| i.to_digits}\n",
+    "ch.length"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 47,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[9, 7, 9, 9, 9, 8, 9, 9, 9, 9]"
+      ]
+     },
+     "execution_count": 47,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "ch[-10..-1]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 48,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "1"
+      ]
+     },
+     "execution_count": 48,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "ch[1]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 49,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "1"
+      ]
+     },
+     "execution_count": 49,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "ch[10]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 50,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "5"
+      ]
+     },
+     "execution_count": 50,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "ch[100]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 51,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "38890"
+      ]
+     },
+     "execution_count": 51,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "ch.length"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 52,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       ":champ"
+      ]
+     },
+     "execution_count": 52,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "def champ(i)\n",
+    "  if i < 10\n",
+    "    i\n",
+    "  elsif i < 190\n",
+    "    if (i - 10) % 2 == 0 # tens\n",
+    "      ((i - 10) / 2) / 10 + 1\n",
+    "    else # units\n",
+    "      # ((i - 11) / 2) % 10\n",
+    "     ((i - 10) / 2) % 10\n",
+    "    end\n",
+    "  elsif i < 2890\n",
+    "    if (i - 190) % 3 == 0 #hundreds\n",
+    "      ((i - 190) / 3) / 100 + 1\n",
+    "    elsif (i - 190) % 3 == 1 # tens\n",
+    "      (((i - 190) / 3) / 10) % 10\n",
+    "    else # units\n",
+    "      ((i - 190) / 3) % 10\n",
+    "    end\n",
+    "  elsif i < 38890\n",
+    "    if (i - 2890) % 4 == 0 # thousands\n",
+    "      ((i - 2890) / 4) / 1000 + 1\n",
+    "    elsif (i - 2890) % 4 == 1 # hundreds\n",
+    "      (((i - 2890) / 4) / 100) % 10\n",
+    "    elsif (i - 2890) % 4 == 2 # tens\n",
+    "      (((i - 2890) / 4) / 10) % 10\n",
+    "    else # units\n",
+    "      ((i - 2890) / 4) % 10\n",
+    "    end\n",
+    "  else\n",
+    "    99\n",
+    "  end\n",
+    "end"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 105,
+   "metadata": {
+    "collapsed": false,
+    "scrolled": true
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "1 :: 1 (2890)\n",
+      "0 :: 0 (2891)\n",
+      "0 :: 0 (2892)\n",
+      "0 :: 0 (2893)\n",
+      "1 :: 1 (2894)\n",
+      "0 :: 0 (2895)\n",
+      "0 :: 0 (2896)\n",
+      "1 :: 1 (2897)\n",
+      "1 :: 1 (2898)\n",
+      "0 :: 0 (2899)\n",
+      "0 :: 0 (2900)\n"
+     ]
+    },
+    {
+     "data": {
+      "text/plain": [
+       "2890..2900"
+      ]
+     },
+     "execution_count": 105,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "(2890..2900).each do |i|\n",
+    "  puts \"#{champ i} :: #{ch[i]} (#{i})\"\n",
+    "end"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 95,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "true"
+      ]
+     },
+     "execution_count": 95,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "(1..38889).all? {|i| champ(i) == ch[i]}"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 107,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[]"
+      ]
+     },
+     "execution_count": 107,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "(1..38889).select {|i| champ(i) != ch[i]}"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 108,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "true"
+      ]
+     },
+     "execution_count": 108,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "190 - 10 == 2 * 9 * 10 ** 1"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 109,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "true"
+      ]
+     },
+     "execution_count": 109,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "2890 - 190 == 3 * 9 * 10 ** 2"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 110,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "true"
+      ]
+     },
+     "execution_count": 110,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "38890 - 2890 == 4 * 9 * 10 ** 3"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 120,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[1, 10, 190, 2890, 38890, 488890, 5888890]"
+      ]
+     },
+     "execution_count": 120,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "# threshold, number of digits, offset\n",
+    "(1..6).map {|n| n * 9 * 10**(n-1)}.reduce([1, 0, 0]) {|ss, n| ss + [[ss[-1][0] + n]}"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[1, 0, 0, [9], [189], [2889], [38889], [488889], [5888889]]"
+      ]
+     },
+     "execution_count": 2,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "(1..6).map {|n| n * 9 * 10**(n-1)}.reduce([[1, 0, 0]]) {|ss, n| ss + [[ss[-1][0] + n, n, ]]}"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[[0, 9], [1, 180], [2, 2700], [3, 36000], [4, 450000], [5, 5400000], [6, 63000000]]"
+      ]
+     },
+     "execution_count": 7,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "(0..6).map {|n| [n, (n+1) * 9 * 10**n]}"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 20,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[[0, 1, 1], [9, 0, 10], [189, 1, 190], [2889, 2, 2890], [38889, 3, 38890], [488889, 4, 488890], [5888889, 5, 5888890], [68888889, 6, 68888890]]"
+      ]
+     },
+     "execution_count": 20,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "(0..6).map {|n| [n, (n+1) * 9 * 10**n]}.reduce([[0, 1, 1]]) {|ts, ns| ts + [[ts[-1][0] + ns[1], ns[0], ts[-1][2] + ns[1]]] }"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 94,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       ":champ2"
+      ]
+     },
+     "execution_count": 94,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "def champ2(n)\n",
+    "  i = 1\n",
+    "  limit = 10\n",
+    "  offset = 0\n",
+    "  while n >= limit\n",
+    "    offset = limit\n",
+    "    i += 1\n",
+    "    step = i * 9 * 10**(i-1)\n",
+    "    limit += step\n",
+    "  end\n",
+    "  unit = (n - offset) % i\n",
+    "  digit = ((n - offset) / i) / (10 ** (i-(unit +1))) % 10\n",
+    "  digit += 1 if unit == 0 && i != 1\n",
+    "  # return i, limit, offset, unit, digit\n",
+    "  digit\n",
+    "end"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 91,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "1 : 1 :: [1, 10, 0, 0, 1]\n",
+      "2 : 2 :: [1, 10, 0, 0, 2]\n",
+      "3 : 3 :: [1, 10, 0, 0, 3]\n",
+      "4 : 4 :: [1, 10, 0, 0, 4]\n",
+      "5 : 5 :: [1, 10, 0, 0, 5]\n",
+      "6 : 6 :: [1, 10, 0, 0, 6]\n",
+      "7 : 7 :: [1, 10, 0, 0, 7]\n",
+      "8 : 8 :: [1, 10, 0, 0, 8]\n",
+      "9 : 9 :: [1, 10, 0, 0, 9]\n",
+      "10 : 1 :: [2, 190, 10, 0, 1]\n",
+      "11 : 0 :: [2, 190, 10, 1, 0]\n",
+      "12 : 1 :: [2, 190, 10, 0, 1]\n",
+      "13 : 1 :: [2, 190, 10, 1, 1]\n",
+      "14 : 1 :: [2, 190, 10, 0, 1]\n",
+      "15 : 2 :: [2, 190, 10, 1, 2]\n",
+      "16 : 1 :: [2, 190, 10, 0, 1]\n",
+      "17 : 3 :: [2, 190, 10, 1, 3]\n",
+      "18 : 1 :: [2, 190, 10, 0, 1]\n",
+      "19 : 4 :: [2, 190, 10, 1, 4]\n",
+      "20 : 1 :: [2, 190, 10, 0, 1]\n"
+     ]
+    },
+    {
+     "data": {
+      "text/plain": [
+       "1..20"
+      ]
+     },
+     "execution_count": 91,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "(1..20).each do |i| puts \"#{i} : #{champ i} :: #{champ2 i}\" end"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 92,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "180 : 9 :: [2, 190, 10, 0, 9]\n",
+      "181 : 5 :: [2, 190, 10, 1, 5]\n",
+      "182 : 9 :: [2, 190, 10, 0, 9]\n",
+      "183 : 6 :: [2, 190, 10, 1, 6]\n",
+      "184 : 9 :: [2, 190, 10, 0, 9]\n",
+      "185 : 7 :: [2, 190, 10, 1, 7]\n",
+      "186 : 9 :: [2, 190, 10, 0, 9]\n",
+      "187 : 8 :: [2, 190, 10, 1, 8]\n",
+      "188 : 9 :: [2, 190, 10, 0, 9]\n",
+      "189 : 9 :: [2, 190, 10, 1, 9]\n",
+      "190 : 1 :: [3, 2890, 190, 0, 1]\n",
+      "191 : 0 :: [3, 2890, 190, 1, 0]\n",
+      "192 : 0 :: [3, 2890, 190, 2, 0]\n",
+      "193 : 1 :: [3, 2890, 190, 0, 1]\n",
+      "194 : 0 :: [3, 2890, 190, 1, 0]\n",
+      "195 : 1 :: [3, 2890, 190, 2, 1]\n",
+      "196 : 1 :: [3, 2890, 190, 0, 1]\n",
+      "197 : 0 :: [3, 2890, 190, 1, 0]\n",
+      "198 : 2 :: [3, 2890, 190, 2, 2]\n",
+      "199 : 1 :: [3, 2890, 190, 0, 1]\n",
+      "200 : 0 :: [3, 2890, 190, 1, 0]\n"
+     ]
+    },
+    {
+     "data": {
+      "text/plain": [
+       "180..200"
+      ]
+     },
+     "execution_count": 92,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "(180..200).each do |i| puts \"#{i} : #{champ i} :: #{champ2 i}\" end"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 93,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "2880 : 6 :: [3, 2890, 190, 2, 6]\n",
+      "2881 : 9 :: [3, 2890, 190, 0, 9]\n",
+      "2882 : 9 :: [3, 2890, 190, 1, 9]\n",
+      "2883 : 7 :: [3, 2890, 190, 2, 7]\n",
+      "2884 : 9 :: [3, 2890, 190, 0, 9]\n",
+      "2885 : 9 :: [3, 2890, 190, 1, 9]\n",
+      "2886 : 8 :: [3, 2890, 190, 2, 8]\n",
+      "2887 : 9 :: [3, 2890, 190, 0, 9]\n",
+      "2888 : 9 :: [3, 2890, 190, 1, 9]\n",
+      "2889 : 9 :: [3, 2890, 190, 2, 9]\n",
+      "2890 : 1 :: [4, 38890, 2890, 0, 1]\n",
+      "2891 : 0 :: [4, 38890, 2890, 1, 0]\n",
+      "2892 : 0 :: [4, 38890, 2890, 2, 0]\n",
+      "2893 : 0 :: [4, 38890, 2890, 3, 0]\n",
+      "2894 : 1 :: [4, 38890, 2890, 0, 1]\n",
+      "2895 : 0 :: [4, 38890, 2890, 1, 0]\n",
+      "2896 : 0 :: [4, 38890, 2890, 2, 0]\n",
+      "2897 : 1 :: [4, 38890, 2890, 3, 1]\n",
+      "2898 : 1 :: [4, 38890, 2890, 0, 1]\n",
+      "2899 : 0 :: [4, 38890, 2890, 1, 0]\n",
+      "2900 : 0 :: [4, 38890, 2890, 2, 0]\n"
+     ]
+    },
+    {
+     "data": {
+      "text/plain": [
+       "2880..2900"
+      ]
+     },
+     "execution_count": 93,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "(2880..2900).each do |i| puts \"#{i} : #{champ i} :: #{champ2 i}\" end"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 96,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "true"
+      ]
+     },
+     "execution_count": 96,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "(1..38889).all? {|i| champ2(i) == ch[i]}"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 99,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "210"
+      ]
+     },
+     "execution_count": 99,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "(0..6).map {|e| champ2(10**e)}.reduce(:*)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Ruby 2.4.0",
+   "language": "ruby",
+   "name": "ruby"
+  },
+  "language_info": {
+   "file_extension": ".rb",
+   "mimetype": "application/x-ruby",
+   "name": "ruby",
+   "version": "2.4.0"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 0
+}