Skip to content

Instantly share code, notes, and snippets.

@lucaslugao
Created December 5, 2017 09:08
Show Gist options
  • Save lucaslugao/ad865ded155d8f9c1eeb7cf64c5517a7 to your computer and use it in GitHub Desktop.
Save lucaslugao/ad865ded155d8f9c1eeb7cf64c5517a7 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [],
"source": [
"import requests\n",
"from bs4 import BeautifulSoup\n",
"import re\n",
"import matplotlib.pyplot as plt\n",
"from IPython.core.display import display, HTML\n",
"import pickle\n",
"import os.path"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"def log_progress(sequence, every=None, size=None, name='Items'):\n",
" from ipywidgets import IntProgress, HTML, VBox\n",
" from IPython.display import display\n",
"\n",
" is_iterator = False\n",
" if size is None:\n",
" try:\n",
" size = len(sequence)\n",
" except TypeError:\n",
" is_iterator = True\n",
" if size is not None:\n",
" if every is None:\n",
" if size <= 200:\n",
" every = 1\n",
" else:\n",
" every = int(size / 200) # every 0.5%\n",
" else:\n",
" assert every is not None, 'sequence is iterator, set every'\n",
"\n",
" if is_iterator:\n",
" progress = IntProgress(min=0, max=1, value=1)\n",
" progress.bar_style = 'info'\n",
" else:\n",
" progress = IntProgress(min=0, max=size, value=0)\n",
" label = HTML()\n",
" box = VBox(children=[label, progress])\n",
" display(box)\n",
"\n",
" index = 0\n",
" try:\n",
" for index, record in enumerate(sequence, 1):\n",
" if index == 1 or index % every == 0:\n",
" if is_iterator:\n",
" label.value = '{name}: {index} / ?'.format(\n",
" name=name,\n",
" index=index\n",
" )\n",
" else:\n",
" progress.value = index\n",
" label.value = u'{name}: {index} / {size}'.format(\n",
" name=name,\n",
" index=index,\n",
" size=size\n",
" )\n",
" yield record\n",
" except:\n",
" progress.bar_style = 'danger'\n",
" raise\n",
" else:\n",
" progress.bar_style = 'success'\n",
" progress.value = index\n",
" label.value = \"{name}: {index}\".format(\n",
" name=name,\n",
" index=str(index or '?')\n",
" )"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"problem_set = list(range(1,605))"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"d_r_c = re.compile(\"(?:Difficulty rating: )([0-9]+)\\%\")\n",
"def get_problem_info(problem_id, verbose=False):\n",
" problem_info = {'id':problem_id,'name': None,'difficulty_rate': None, 'size' : None}\n",
" try:\n",
" r = requests.get('https://projecteuler.net/problem={}'.format(problem_id))\n",
" soup = BeautifulSoup(r.text, 'html.parser')\n",
" problem_info['difficulty_rate'] = float(d_r_c.search(soup.select('#problem_info > h3 > span > span')[0].contents[-1]).group(1))/100\n",
" problem_info['name'] = soup.select('#content > h2')[0].contents[0]\n",
" problem_info['size'] = len(str(soup.select('#content > div.problem_content')[0]))\n",
" \n",
" except:\n",
" if verbose:\n",
" print('Exception in problem {}!'.format(problem_id))\n",
" if verbose:\n",
" print(problem_info)\n",
" return problem_info"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [],
"source": [
"if os.path.isfile(\"problem_info.p\"):\n",
" problem_info = pickle.load(open(\"problem_info.p\", \"rb\" ))\n",
"else:\n",
" problem_info = []\n",
" for p in log_progress(problem_set, every=1, name='Problem'):\n",
" problem_info.append(get_problem_info(p))\n",
" pickle.dump(problem_info, open(\"problem_info.p\", \"wb\" ))"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAD8CAYAAACMwORRAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJzt3X2QHPV95/H3d2Z2V0joYdEDu0gI\nIQIqs8sVYBmkOGXjAPGKUDyUXWfAubOT+Ah38VXufJcUPt8RjpR9xLlK+VxHArLDEafMUziOw5SE\nY/uQceWQTivAWAvWg1dICD2wCCEtAqTdnd/9Md2jnp7umZ7d2Yfu+byqVLvT/evuX7dGX+3+5vf9\nfc05h4iIZEtuujsgIiLNp+AuIpJBCu4iIhmk4C4ikkEK7iIiGaTgLiKSQQruIiIZpOAuIpJBCu4i\nIhlUmK4LL1q0yK1YsWK6Li8ikkrbtm172zm3uF67aQvuK1asoL+/f7ouLyKSSma2N0k7DcuIiGSQ\ngruISAYpuIuIZJCCu4hIBim4i4hkUN3gbmYPmtlbZrY9Zr+Z2bfNbLeZvWJmlze/myIi0ogkUyEf\nAv478L2Y/euAC70/VwJ/7X2dUbbtPcqTL+7HAZ+5fBkfPa+zYt/mwSN0zm7n6PunWLNyYcX+YJuo\nfVH7g9frPWc+AweOVX0f7kfcOTtnt1ccA9TsS61zNXLMVJrp/RNJm7rB3Tn3vJmtqNHkRuB7rlSv\nb7OZLTCzbufcwSb1ccK27T3Krd/ZzKnRIgBP9L/BI7evLQfhz3+3tK/owICOthzf/9KacpAJtmkv\nVO6L2n/X9T3c/YOB8vXiBPsR1edgv3yP979BDhgtusi+xN1/rf5Pt5neP5E0asaY+1LgjcDr/d62\nKmZ2u5n1m1n/0NBQEy6dzObBI4wEAu3ImGPz4JHyvmAAdcDIaLG8P9wmvC9q/8btByuuFyfYj6g+\nhwM7wOiYY2TMxfal3rmSHjOVZnr/RNJoSj9Qdc6td86tds6tXry4bvZs06xZuZC2wulbbcsba1Yu\nLO9rL+TIWWlfDmgr5Mr7g23yVr0vav+63u6K68UJ9iOqz8F++Qp5oy1vsX2pda5GjplKM71/Imlk\npdGUOo1KwzLPOOd6I/Y9AGxyzj3ivd4BXFVvWGb16tVuKpcf0Jj7zB7Tnun9E5kpzGybc2513XZN\nCO6/DXwZuI7SB6nfds5dUe+cUx3cRUSyIGlwr/uBqpk9AlwFLDKz/cCfAm0Azrn7gQ2UAvtu4H3g\nd8ffbRERaYYks2VurbPfAX/YtB6JiMiEKUNVRCSDFNxFRDJIwV1EJIOmrRLTdKk1JTLcZmj4JIvm\ndtSdshg+NsmUvqme+tfo9TQ1USTdWiq411qGIK5NXLu48ydJo5/qdPtGr6flAETSr6WGZWotQxDX\nJq5d3PmTpNFPdbp9o9fTcgAi6ddSwb3WMgRxbeLaxZ0/SRr9VKfbN3o9LQcgkn6JMlQnw3RlqGrM\nXWPuImnW1OUHJoOWHxARaVzS4N5SwzIiIq1CwV1EJIMU3EVEMkjBXUQkg1oqiSmpWsU7as0iidtX\nb3v4Oklmqmg2i4jUouAeUqtgNhCbuRmX1Zlke/A6d13fwz3PDNTMDlUGqYjUo2GZkFoFs2tlbsbt\nS7I9eJ2N2w/WzQ5VBqmI1KPgHlKrYHatzM24ffW2h6+zrre7bnaoMkhFpB4lMUXQmLuIzFTKUBUR\nySBlqIqItDAFdxGRDFJwFxHJIAV3EZEMylQSUyMzSKLahrclbVNrffgk52j2vYmIZCa4N5K1GdUW\nKrNPozJFo9rc/YOB2JqsSa6TJLtUGaki0qjMDMs0krUZ1Ta8LSpTNKpNrZqsSa7TzNqsIiK+zPzk\n7mdtjowW62ZtxrUNblvX283W19+p22bLnnfKP7mHa60muU4jtVkbOUZEWlumkpg05i4iWacMVRGR\nDFKGqohIC1NwFxHJIAV3EZEMShTczazPzHaY2W4zuzNi/3Ize87MXjKzV8zsuuZ3VUREkqob3M0s\nD9wHrAMuBm41s4tDzf4j8Lhz7jLgFuCvmt1RERFJLsk89yuA3c65QQAzexS4EXg10MYB87zv5wMH\nmtnJpGpNO4wqvBE87oGf/orDxz9k7cqFDJ8cxQG958xn0463ytvnntGWaEpjeHokEDtdstE+T8WU\nSE27FEm/JMF9KfBG4PV+4MpQm7uBfzCzfw3MAa5pSu8aUC/VP1zsOhgsb1n/AiNjpSmhP99/LPL8\n/vZZdYplb9t7lFu/s7mc2PR4f+nRjXrnDy5R0Gif46452c9RAV4kfZr1geqtwEPOuWXAdcDfmVnV\nuc3sdjPrN7P+oaGhJl26pF6qP1QWuw4e5wf2JOotI7B58EjFkgSjY64c2KFyiYJG+zwVyxBoqQOR\nbEjyk/ubwLmB18u8bUG/D/QBOOdeMLNZwCLgrWAj59x6YD2UkpjG2edItVL9/WAVLHYdPK4tb4kC\nvIWOj7rempULafOuCVDIlypg+wE+uETBePo82csQaKkDkWyom6FqZgVgJ3A1paC+FbjNOTcQaLMR\neMw595CZfQT4CbDU1Tj5VC0/oDH35jxHEZkZmrr8gDe18VtAHnjQOfd1M7sH6HfOPe3NnvkOcCal\nkYQ/cc79Q61zavkBEZHGJQ3uiVaFdM5tADaEtt0V+P5V4OONdlJERCaHMlRFRDJIwV1EJIMU3EVE\nMigzlZgAHt6yj43bD7Kut5vbrlxeMWul95z5kbNlgjNlPvex5dx25fLy9qgZLg9v2ceD/7gHnOOa\nj5xdnkEDxM4w8fvV0z0vUfso4Rk04Zk0E5nhUutYzZwRSafMBPeHt+zjP/yvXwDws11vs+/ICR78\nv6+X55tDdYZqdXZq6fhVXXMrskz9rNIdh4bL1wDYPTQIlOae4xyjRVeV1RnuV732UYJZo37Wqgvc\nT1Qx70YqPMVlpCpbVSS9MjMss3H7wYrXzw4cqsgUheoM1ajs1I3bD1ZlmfpZpeFrlPePFhkZc5FZ\nnVHH1GofJSprNXg/UcW8k6qVkapsVZH0ykxwX9fbXfG6r6eLtkLl7YWzPf3s1PB5/CxTn59VGr4G\nnM5abcsbeavOgA0fU699FD9rNGenzxG8n3W93bQXconPF3XuqGNr7RORmS1TNVQ15q4xd5GsU4Fs\nEZEMUoFsEZEWpuAuIpJBCu4iIhmk4C4ikkEK7iIiGZS6DNW4qXnBKYrnLDiDl994F+ccn7/yPJYv\nnMPG7QcxYPuB45zRluMPP3Uh+46c4KmX36SjkGfUOU58OMKpMcfs9jyXLe/kU6uWMHDgWGSRDf+a\nG7cfZOGcdo6cOMW63m5Wdc2t6F9wemZ4n38/4ynkETdtMe5cWaBpmSLJpWoqZFw6fDDFf7K0561c\n2BqIvWYhB0VXWmLgi2tXcP/zg5H7/ILXwWUOgteoVzw7aqmAuHNlgZZCECnJ5FTIuHT4uGUBmilY\n2LrWNUeLlPv37MCh2H1+weuoZQ6gfvHsyELfMefKAi2FINKYVAX3uHT4qGUBmi1Y2LrWNQs5yv3r\n6+mK3bdm5cLYZQ4g+l7rLRUQd64s0FIIIo1J1bAMaMxdY+4ac5fWpuUHREQyKJNj7iIikoyCu4hI\nBim4i4hkkIK7iEgGpS5DtREPb9nHY1v30VHI8Wtnz2VeR4GBg8fLRTN2HR4uzZd2cGJkjI5CjsuW\nd3LHJy+omI1x74bXeHbgEH09XVzb01UxIwVOF90AIgt/+Bqd7dFI+/BMmWC/khbgmOhsFM1mEZk5\nMjtbZiJZq4UcPPYHv85Hz+vk3g2vVWSZ5oxyLdNC3sgBo0VHIZ9jrFhkLFC29Rs3X1JR2amRDMtG\n2oezU4P9Slr0eqIZoMogFZkaLT9bZiJZq6NFyhmQ4SzTYuD/wtExV1HoeqyyHndFHxrNsGykfTg7\nNdyvJEWvJ5oBqgxSkZkls8F9IlmrhRzlYZZwlmkuUE+7kLeKQtf50NMM9qHRDMtG2oezU8P9SlL0\neqIZoMogFZlZMjssAxpz15i7SPYoQ1VEJINafsxdRKSVKbiLiGSQgruISAYlCu5m1mdmO8xst5nd\nGdPmn5rZq2Y2YGYPN7ebIiLSiLoZqmaWB+4DrgX2A1vN7Gnn3KuBNhcCXwU+7pw7amZLJqvDPn9m\nRufsdgYOHGPX4WFOjhb53MeWs6prLg/89FcMDr3H+YvP5I5PXsCOQ8M8tnUfS+bN4oJFc3hh8Agd\nhRwLZrcDsGhuB73nzC+v3z6vo8AL3tzt9kKuPPslOCME4MkX97Pr8DDvnDhVvlattdr9bUPDJ1k0\nt6Nie62124P9D8/mqfV8Gpm5EnymR98/Vb5HzYARSZ+6s2XMbC1wt3Pu097rrwI45/5LoM03gZ3O\nue8mvfBEZssEsyGLEd0PZpFGvR6vOz6xkodeeJ1To0UK+RxF5xgdqzyxn90K1fVR776hl7t/MFDe\nFtx+zzMDsfVS8zljJHCdYAZtlPFki4afqVGar45zkZmuIjI9mjlbZinwRuD1fm9b0EXARWb2j2a2\n2cz6Yjp1u5n1m1n/0NBQgktHC2ZDRglvb0Zgh1K2ajALMxzY4XR2a1RN043bD1ZsC26vWS81dJ1g\nBm2U8WSLhp+po3RsXKariMxszfpAtQBcCFwF3Ap8x8wWhBs559Y751Y751YvXrx43BfzsyGD2aJB\n4e1x7RrV19NVkYVZyFef2M9ujappuq63u2JbcHvNeqmh6wQzaKOMJ1s0/ExzlI6Ny3QVkZktyaqQ\nbwLnBl4v87YF7Qe2OOdGgD1mtpNSsN/alF6GfPS8Tr7/pTXTMuZ+bU9X4jH3R/7Fmqox91VdcyPH\n3KPqq/r32OiYe/D5JB0rDz9TjbmLpFuSMfcCsBO4mlJQ3wrc5pwbCLTpA251zn3BzBYBLwGXOudi\nf49XhqqISOOaNubunBsFvgz8EHgNeNw5N2Bm95jZDV6zHwJHzOxV4Dngj2sFdhERmVxaW0ZEJEW0\ntoyISAtTcBcRySAFdxGRDEplgeyoJQCC0w2hVKhj4/aD5cIc/lS+4Pbhk6MMDZ8EqJiWGDx+XW93\nefrii3uPcvj4h1yw5ExuvmwZm3a8xeDQe5w1p708pfLd90+Vp2TeduXyivMEi3eElweIW6og3KbW\n6zRIY59F0ih1H6gG0+TDSwC0541Hbl/LjkPDVcWxZ7Xl+OLaFRXFrsPijs/nqKqPmsRNl57DUy8f\nKL/2C2aHlwe46/qeimUJopYkuOv6npqv07A0gIpoi0xcZj9QDafWB5cAGBlzbB48Elkce2S0WFXs\nuqpNzPHjCewAm3ZWLrHgnzd8D+FlCaKWJKj3Og1LA6iItsjUSV1wD6fWB5cAaMsba1YurCqO7S+C\nFS52HRZ3fLjwdVJXXVS5xIJ/3vA9hJcliFqSoN7rNCwNoCLaIlMndWPu4dR6qB5z93/VjxpzX75w\nTt0x9+DxEx1zv+L8hVVj7lHLA/jXCC9VEG5T6/VMN55lEURkfFI35i4i0soyO+YuIiL1KbiLiGSQ\ngruISAYpuIuIZFDqZsv44gpK+4Uw3njnffa/+wG5HLTlcyyY1caZHQV2HH6PXA66582id+l89rx9\nopxUs3blQgbfPsFL+45y4tQYs9vzrFw0hwWz21k0t6NcwGPJvFl8atWSqtky/oybWoU1gn2E07N0\ngKoiHkDFrKDJmGWijFGRbErlbJmoTEeoLEg9XcLZrMFi1tv2Ho3soz9XP5iQVcgbOWC06CjkJ6dQ\ntTJGRdIn07NlojIdwwWpp0s4mzVYzDquj6NjrqrY9uiYqyhOPRmFqpUxKpJdqRyW8TMdR0aLFZmO\nbYXcjPzJ3e+fXzS7kZ/cx4qOvPeT+1jRNTWzM+45ikj6pXJYBjTm3iwacxdJl6TDMqkN7iIirSjT\nY+4iIlKbgruISAYpuIuIZJCCu4hIBim4i4hkUCrnuQNVhae37T3Kf3rqF+x+6wTzzijwlWtXlYtj\nPLxlH3/13C6OfTDCss7ZnHvWbBbN7aD3nPkMHDgWWbBj296jPPDTX3H4+Id87mPLy4UxOme389RL\n+9n3zvvcdOlSru3pKhfZ6D1nPkffP1U1PbPWVMO4KZ3hbXGFtieTpkmKpFcqp0I+vGVfRQHrOz6x\nkvU/G6QYupVv3HwJQFWx7Fr84tR/+vR2RoJJRTkoOqqukbPKbQZ0tJ1eEqFWen/cMgrhbeGC3X6h\n7cmkpQlEZqakUyFT+ZN7uID1swOHqoJuVLsk/OLUI+HlAGISX8PXdVSm8ofT+4MBMi79P2pphfB9\nTXZwj+qbgrtIeqRyzD1cwLqvp4ucRbcLt63HL07dlq88YSFH5DXC23KcLv5cryB01P6obeF7aPSe\nxkPFrEXSLZXDMqAx96mgMXeRmUfLD4iIZJCWHxARaWEK7iIiGZQouJtZn5ntMLPdZnZnjXafMTNn\nZnV/ZRARkclTN7ibWR64D1gHXAzcamYXR7SbC/wRsKXZnRQRkcYkmed+BbDbOTcIYGaPAjcCr4ba\n/Rnw58AfN7WHDQgWwggWzti4/SAL57Sz5+0TLJk3iwsWzWHg4HF6uucx94w2hj8Y4YXBI3QUcvza\n2XPLM2bu3fAaT738JueeNZuPLu9k4OBx1vV2s6prbsVMGn+2jj+z5EcDh3h24BB9PV0Vs2nCBTjG\nOwPFv1bn7Paq2TnB/VEzcOKOEZFsqTtbxsw+C/Q5577kvf5nwJXOuS8H2lwOfM059xkz2wT8e+dc\nzakwzZ4tE1V8OlzyLqn2vHHdJd089fKByP3hrNQ7PrGSh154nVOjRcyMscDOYNtg0evxZn0GM0eL\nrjIj1p/CWSvrNeoYEUmPKZstY2Y54C+Bf5eg7e1m1m9m/UNDQxO9dIWo4tPjCexQylLdtDO+f+Gs\n1GcHDpUD51hoZ/BluOj1eApSBzNHoTojNq54eK1jRCR7kgT3N4FzA6+Xedt8c4FeYJOZvQ6sAZ6O\n+lDVObfeObfaObd68eLF4+91BL/4dFB+nP91teWNqy6K7184K7Wvp6uczZkP7Qy+LOSNtrxNKOvT\nzxz1zxvMiA3uj8p6jTtGRLInybBMAdgJXE0pqG8FbnPODcS038Q0DMuAxtzD+zXmLpI9Tc1QNbPr\ngG8BeeBB59zXzeweoN8593So7SamKbiLiGRdU1eFdM5tADaEtt0V0/aqJOcUEZHJowxVEZEMUnAX\nEckgBXcRkQxKZSWmRvjrsr+07ygnTo0xuz3PZcs7+dSqJVVrufvru+86PMyet08wVnQsP2s2+45+\nQM4oHxecbRJcZ91f892fYvjki/vZdXiYk6NFzl80hyMnTk1oPfapWl+9mWvHt+qa8K123612vxMx\nVc8q0+u5b9t7lFvWv1BVMm+i/AzPL65dwf3PD5a3+3VWC/kcRecYjbnueGqgTlVN03B92onUa23V\nOqytdt+tdr8T0YxnpfXc8bJWmxzY4XSG57MDhyq2jxYpZ4bGBXYYX23XuHqrzRbu23j66puqPs80\nrXbfrXa/EzGVzyrTwX3NyoVVtVCbwc/w7OvpqtheyFHODC3UuO54aqBOVU3TZtZrbdU6rK123612\nvxMxlc8q08MyoDH38dCY+8S12n232v1OxESflWqoiohkkMbcRURamIK7iEgGKbiLiGSQgruISAYp\nuIuIZFAmlh8ITy3yi3YEC2T40xL3vH2CYx+MAKU5p7Pa8gwOvcf5i88sT4/cdXiYd06cKm/zpz76\n5/HPG57GFOwHxBflmOhUqKj71TQ0qUXvkdaT+qmQ4XTeu67v4e4fDJQLZfvJRLUyRusxSgkHwSUF\n2vPGI7evrah05PejkM+Bc5GFsCeafhx1v/c8M6DUb4ml5QGypWWmQobTeTduP1hRKHt0LH6Nl6T8\n5QaC5xkZcxWpw+F+xBXCnmj6cdT9KvVbatHyAK0p9cE9nM67rre7olB2IW81lwJIwl9uIHietrxV\npA6H+xFXCHui6cdR96vUb6lFywO0ptQPy4DG3DWeKvXoPZIdWn5ARCSDWmbMXUREqim4i4hkkIK7\niEgGKbiLiGRQ6jNUH96yj8e27mPJvFlVM1se+OmvOHz8Qz73seVVhTQ2Dx6hc3Z7eXbMydFiuZ0/\nI6b3nPkcff8Uwx+M8MLgkfI1Bg4ci50xk5RfRMTvn18UI8uzGqby3rL8HEWSSPVsmXAxZzidTTpW\nLDJ2Opeponi1nz1ajLj1fI6K42oJZ6kmFVW4+xs3X8KqrrmZzSScyixJZWRKlrXEbJmo4s1+Nmk4\nQAeLV/vZo1GSBnaozlJNKqpw98btBzOdSTiV95bl5yiSVKqDe1TxZj+bNB+6s2Dx6ra8kYtJWg0f\nV0s4SzWpqMLd63q7M51JOJX3luXnKJJUqodlQGPuaaIxd5GJU4aqiEgGtcSYu4iIRFNwFxHJIAV3\nEZEMShTczazPzHaY2W4zuzNi/1fM7FUze8XMfmJm5zW/qyIiklTd4G5meeA+YB1wMXCrmV0cavYS\nsNo590+AJ4BvNrujIiKSXJLlB64AdjvnBgHM7FHgRuBVv4Fz7rlA+83A7zSzk/XEFcmAUnGNF/ce\n5ej7p7jp0qVc29PFky/uZ2j4JO++f4qTo0XWrlzI3DPaYotfjHdanX9c5+z28hTNesenfQpf2vvf\nCvR31BqSBPelwBuB1/uBK2u0/31g40Q61Yi4wtSFfGVBa4D7nx9k/c8Gq7JTf77/GACz2qoLTo+3\nAHWwX0VXWhaho6328WlPm097/1uB/o5aR1M/UDWz3wFWA38Rs/92M+s3s/6hoaGmXLNWYeqowthx\nyw5AdMHp8RagDvYLTi+LUOv4tKfNp73/rUB/R60jSXB/Ezg38HqZt62CmV0DfA24wTl3MupEzrn1\nzrnVzrnVixcvHk9/q9QqTB1VGDtu2QF/wbFwwenxFqD2++Vfz18WodbxaU+bT3v/W4H+jlpH3QxV\nMysAO4GrKQX1rcBtzrmBQJvLKH2Q2uec25XkwpNVIBs05j6d0t7/VqC/o3Rr6vIDZnYd8C0gDzzo\nnPu6md0D9DvnnjazHwOXAP4yjfucczfUOqeWHxARaVzS4J6oWIdzbgOwIbTtrsD31zTcQxERmTTK\nUBURySAFdxGRDFJwFxHJoNQXyA5/8n/vhtd4duAQfT1d3HndRyJnrABVBTn8/eGvE50xM977iNvW\n6vRMRJJJdXAPZ9v19XTx1MsHgFI26qHjH/LswKGKLNG2QnXmqlFKMor62hGRtdrsrL6orEFAmYQh\nyq4USS7VwzLhbLtNOyuzXjftHIrMEg1nrroaXyeSpTre+9g8eESZhBH0TESSS3VwD2fbXXVRZdbr\nVRctjswSDWeuWsxXv/14s1THex9rVi5UJmEEPROR5FJfQ1Vj7q1Fz0RanQpki4hkkApki4i0MAV3\nEZEMUnAXEckgBXcRkQxScBcRyaBUZ6j6wtMdhz8YYeDgcdb1dnPblcsbOraRqY9xRUI0RS+apjGK\nTJ3UB/dwIeqgn+16GyA2wMcVsU6y3EBcYW6lxUfT0gEiUyv1wzLhQtRhG7cfjN4RcWwjyw3UKsyt\ntPhqWjpAZGqlPriHC1GHrevtTnxsI8sN1CrMrbT4alo6QGRqZSJDVWPu6aAxd5GJ0/IDIiIZpOUH\nRERamIK7iEgGKbiLiGSQgruISAalMonp3g2v8fi2/eQMFp/ZwdvvneTYByOMFh2zCjlWrziLYx+M\nsGTeLE6OjLFlzzvgHJ2z2zk1VgTgvZNjtBWMM9rzdORzLF1wBsMfjnL4+IdcsORM7lz3kYpZM52z\n2xk4cAwHzOso8ONfvgXO8Xu/sTJyRo5/3PAHI7wweIQl82ZxxycvqJgl0uiMHM0wEZ/eF1JP6mbL\n3LvhNe5/fnASelQpb/BnN11SzlSNS5IC+MbNl1QEeD8b8+RIkeBhhRw89ge/Xv5Po17GprI6JYre\nF60ts7Nlnh04NCXXGXNUZKrWEs6C9bMxw4eNFilnZibJ2FRWp0TR+0KSSF1w7+vpmpLr5I1ypmpc\n9qsvnAXrZ2OGDyvkKCc8JcnYVFanRNH7QpJI3bAMaMxdRO+L1qUMVRGRDMrsmLuIiNSn4C4ikkEK\n7iIiGaTgLiKSQQruIiIZpOAuIpJB0zYV0syGgL0Jmi4C3p7k7qSJnkclPY9qeiaVsvY8znPOLa7X\naNqCe1Jm1p9kTmer0POopOdRTc+kUqs+Dw3LiIhkkIK7iEgGpSG4r5/uDswweh6V9Dyq6ZlUasnn\nMePH3EVEpHFp+MldREQaNGODu5n1mdkOM9ttZndOd38mi5mda2bPmdmrZjZgZn/kbT/LzH5kZru8\nr53edjOzb3vP5RUzuzxwri947XeZ2Rem656awczyZvaSmT3jvT7fzLZ49/2YmbV72zu817u9/SsC\n5/iqt32HmX16eu6kOcxsgZk9YWa/NLPXzGxtK79HzOzfev9etpvZI2Y2q9XfI1WcczPuD5AHfgWs\nBNqBnwMXT3e/Juleu4HLve/nAjuBi4FvAnd62+8E/tz7/jpgI2DAGmCLt/0sYND72ul93znd9zeB\n5/IV4GHgGe/148At3vf3A//S+/5fAfd7398CPOZ9f7H3vukAzvfeT/npvq8JPI+/Bb7kfd8OLGjV\n9wiwFNgDnBF4b3yx1d8j4T8z9Sf3K4DdzrlB59wp4FHgxmnu06Rwzh10zr3ofT8MvEbpzXsjpX/Q\neF9v8r6/EfieK9kMLDCzbuDTwI+cc+84544CPwL6pvBWmsbMlgG/DXzXe23AbwJPeE3Cz8N/Tk8A\nV3vtbwQedc6ddM7tAXZTel+ljpnNBz4B/A2Ac+6Uc+5dWvg9AhSAM8ysAMwGDtLC75EoMzW4LwXe\nCLze723LNO/XxcuALcDZzjm/OOsh4Gzv+7hnk6Vn9i3gT4Ci93oh8K5zbtR7Hby38n17+4957bP0\nPM4HhoD/4Q1VfdfM5tCi7xHn3JvAfwX2UQrqx4BttPZ7pMpMDe4tx8zOBP4n8G+cc8eD+1zpd8iW\nmNZkZtcDbznntk13X2aQAnA58NfOucuAE5SGYcpa7D3SSemn7vOBc4A5pPc3kEkzU4P7m8C5gdfL\nvG2ZZGZtlAL7951zT3qbD3vNZ778AAABqElEQVS/SuN9fcvbHvdssvLMPg7cYGavUxqO+03gv1Ea\nWih4bYL3Vr5vb/984AjZeR5Q+olyv3Nui/f6CUrBvlXfI9cAe5xzQ865EeBJSu+bVn6PVJmpwX0r\ncKH36Xc7pQ9Bnp7mPk0Kb+zvb4DXnHN/Gdj1NODPZvgC8L8D2/+5NyNiDXDM+9X8h8BvmVmn95PN\nb3nbUsU591Xn3DLn3ApKf+//xzn3eeA54LNes/Dz8J/TZ732ztt+izdT4nzgQuD/TdFtNJVz7hDw\nhpmt8jZdDbxKi75HKA3HrDGz2d6/H/95tOx7JNJ0f6Ib94fSJ/47KX2C/bXp7s8k3udvUPp1+hXg\nZe/PdZTGBH8C7AJ+DJzltTfgPu+5/AJYHTjX71H6UGg38LvTfW9NeDZXcXq2zEpK//B2A38PdHjb\nZ3mvd3v7VwaO/5r3nHYA66b7fib4LC4F+r33yVOUZru07HsE+M/AL4HtwN9RmvHS0u+R8B9lqIqI\nZNBMHZYREZEJUHAXEckgBXcRkQxScBcRySAFdxGRDFJwFxHJIAV3EZEMUnAXEcmg/w9T1OeV4fOq\nxAAAAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f1aa89739b0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"problem_info = sorted(problem_info, key=lambda x: x['difficulty_rate'] / x['size'])\n",
"plt.plot([x['size'] for i, x in enumerate(problem_info)], [x['difficulty_rate'] for x in problem_info], '.')\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<h1>Top 30 problems! </h1><ul>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<li><a href=\"https://projecteuler.net/problem=248\">Numbers for which Euler’s totient function equals 13!</a> [rate: 70% | length: 161 | id: 248]</li>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<li><a href=\"https://projecteuler.net/problem=172\">Investigating numbers with few repeated digits</a> [rate: 55% | length: 196 | id: 172]</li>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<li><a href=\"https://projecteuler.net/problem=279\">Triangles with integral sides and an integral angle </a> [rate: 60% | length: 214 | id: 279]</li>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<li><a href=\"https://projecteuler.net/problem=482\">The incenter of a triangle</a> [rate: 85% | length: 362 | id: 482]</li>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<li><a href=\"https://projecteuler.net/problem=142\">Perfect Square Collection</a> [rate: 45% | length: 199 | id: 142]</li>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<li><a href=\"https://projecteuler.net/problem=290\">Digital Signature</a> [rate: 50% | length: 222 | id: 290]</li>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<li><a href=\"https://projecteuler.net/problem=432\">Totient sum</a> [rate: 70% | length: 319 | id: 432]</li>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<li><a href=\"https://projecteuler.net/problem=448\">Average least common multiple</a> [rate: 80% | length: 367 | id: 448]</li>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<li><a href=\"https://projecteuler.net/problem=268\">Counting numbers with at least four distinct prime factors less than 100</a> [rate: 70% | length: 322 | id: 268]</li>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<li><a href=\"https://projecteuler.net/problem=222\">Sphere Packing</a> [rate: 60% | length: 279 | id: 222]</li>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<br>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<li><a href=\"https://projecteuler.net/problem=276\">Primitive Triangles</a> [rate: 75% | length: 349 | id: 276]</li>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<li><a href=\"https://projecteuler.net/problem=164\">Numbers for which no three consecutive digits have a sum greater than a given value</a> [rate: 45% | length: 211 | id: 164]</li>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<li><a href=\"https://projecteuler.net/problem=224\">Almost right-angled triangles II</a> [rate: 75% | length: 360 | id: 224]</li>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<li><a href=\"https://projecteuler.net/problem=249\">Prime Subset Sums</a> [rate: 60% | length: 289 | id: 249]</li>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<li><a href=\"https://projecteuler.net/problem=250\">250250</a> [rate: 55% | length: 267 | id: 250]</li>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<li><a href=\"https://projecteuler.net/problem=355\">Maximal coprime subset</a> [rate: 70% | length: 356 | id: 355]</li>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<li><a href=\"https://projecteuler.net/problem=223\">Almost right-angled triangles I</a> [rate: 70% | length: 358 | id: 223]</li>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<li><a href=\"https://projecteuler.net/problem=193\">Squarefree Numbers</a> [rate: 55% | length: 292 | id: 193]</li>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<li><a href=\"https://projecteuler.net/problem=160\">Factorial trailing digits</a> [rate: 60% | length: 326 | id: 160]</li>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<li><a href=\"https://projecteuler.net/problem=513\">Integral median</a> [rate: 60% | length: 340 | id: 513]</li>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<br>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<li><a href=\"https://projecteuler.net/problem=439\">Sum of sum of divisors</a> [rate: 100% | length: 573 | id: 439]</li>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<li><a href=\"https://projecteuler.net/problem=484\">Arithmetic Derivative</a> [rate: 100% | length: 586 | id: 484]</li>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<li><a href=\"https://projecteuler.net/problem=181\">Investigating in how many ways objects of two different colours can be grouped</a> [rate: 70% | length: 418 | id: 181]</li>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<li><a href=\"https://projecteuler.net/problem=210\">Obtuse Angled Triangles</a> [rate: 70% | length: 427 | id: 210]</li>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<li><a href=\"https://projecteuler.net/problem=233\">Lattice points on a circle</a> [rate: 70% | length: 428 | id: 233]</li>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<li><a href=\"https://projecteuler.net/problem=258\">A lagged Fibonacci sequence</a> [rate: 70% | length: 433 | id: 258]</li>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<li><a href=\"https://projecteuler.net/problem=272\">Modular Cubes, part 2</a> [rate: 80% | length: 501 | id: 272]</li>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<li><a href=\"https://projecteuler.net/problem=373\">Circumscribed Circles</a> [rate: 75% | length: 476 | id: 373]</li>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<li><a href=\"https://projecteuler.net/problem=176\">Right-angled triangles that share a cathetus</a> [rate: 70% | length: 451 | id: 176]</li>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"</ul>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"t = 30\n",
"display(HTML('<h1>Top {} problems! </h1><ul>'.format(t)))\n",
"for i in range(1, t):\n",
" display(HTML('<li><a href=\"https://projecteuler.net/problem={}\">{}</a> [rate: {}% | length: {} | id: {}]</li>'.format(problem_info[-i]['id'],\n",
" problem_info[-i]['name'],\n",
" int(problem_info[-i]['difficulty_rate']*100),\n",
" problem_info[-i]['size'],\n",
" problem_info[-i]['id'])))\n",
"\n",
" if i % 10 == 0:\n",
" display(HTML('<br>'))\n",
"display(HTML('</ul>'))"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"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.5.2"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment