{ "cells": [ { "cell_type": "markdown", "source": [ "# 10進数で回文\n", "\n", ">10進数、2進数、8進数のいずれで表現しても回文数となる数のうち、10進数の10以上で最小の値を求めてください。\n", "\n", "| 10進数 | 2進数 | 8進数 |\n", "|------|------|------|\n", "| 0| 0| 0|\n", "| 1| 1| 1|\n", "| 2| 10| 2|\n", "| 3| 11| 3|\n", "| | | |\n", "| 7| 111| 7|\n", "| 8| 1000| 10|\n", "| 9| 1001| 11|\n", "| 10| 1010| 12|" ], "metadata": { "collapsed": false } }, { "cell_type": "markdown", "source": [ "## テストファースト" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 14, "outputs": [ { "name": "stderr", "text": [ "\n----------------------------------------------------------------------\nRan 0 tests in 0.000s\n\nOK\n" ], "output_type": "stream" }, { "data": { "text/plain": "" }, "metadata": {}, "output_type": "execute_result", "execution_count": 14 } ], "source": [ "import unittest\n", "class 回文Test(unittest.TestCase):\n", " None\n", "\n", "unittest.main(argv=[''],exit=False)" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n", "is_executing": false } } }, { "cell_type": "markdown", "source": [ "## アサートファースト" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 15, "outputs": [ { "name": "stderr", "text": [ "F", "\n======================================================================\nFAIL: test_10進数の11ならば11になる (__main__.回文Test)\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"\", line 5, in test_10進数の11ならば11になる\n self.assertEqual(回文(11), True)\nAssertionError: False != True\n\n----------------------------------------------------------------------\nRan 1 test in 0.002s\n\nFAILED (failures=1)\n" ], "output_type": "stream" }, { "data": { "text/plain": "" }, "metadata": {}, "output_type": "execute_result", "execution_count": 15 } ], "source": [ "import unittest\n", "class 回文Test(unittest.TestCase):\n", " def test_10進数の11ならば11になる(self):\n", " self.assertEqual(回文(11), True)\n", "\n", "unittest.main(argv=[''],exit=False)" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n", "is_executing": false } } }, { "cell_type": "markdown", "source": [ "## 仮実装" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 16, "outputs": [ { "name": "stderr", "text": [ ".", "\n----------------------------------------------------------------------\nRan 1 test in 0.002s\n\nOK\n" ], "output_type": "stream" }, { "data": { "text/plain": "" }, "metadata": {}, "output_type": "execute_result", "execution_count": 16 } ], "source": [ "import unittest\n", "\n", "def 回文(n):\n", " return True\n", "\n", "class 回文Test(unittest.TestCase):\n", " def test_10進数の11ならば11になる(self):\n", " self.assertEqual(回文(11), True)\n", "\n", "unittest.main(argv=[''],exit=False)" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n", "is_executing": false } } }, { "cell_type": "markdown", "source": [ "## 三角測量" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 17, "outputs": [ { "name": "stderr", "text": [ "F", "\n======================================================================\nFAIL: test_10進数の11ならば11になる (__main__.回文Test)\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"\", line 10, in test_10進数の11ならば11になる\n self.assertEqual(回文(10), False)\nAssertionError: True != False\n\n----------------------------------------------------------------------\nRan 1 test in 0.002s\n\nFAILED (failures=1)\n" ], "output_type": "stream" }, { "data": { "text/plain": "" }, "metadata": {}, "output_type": "execute_result", "execution_count": 17 } ], "source": [ "import unittest\n", "\n", "def 回文(n):\n", " return True\n", "\n", "class 回文Test(unittest.TestCase):\n", " def test_10進数の11ならば11になる(self):\n", " self.assertEqual(回文(11), True)\n", " self.assertEqual(回文(10), False)\n", "\n", "unittest.main(argv=[''],exit=False)" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n", "is_executing": false } } }, { "cell_type": "markdown", "source": [ "## 明白な実装" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 18, "outputs": [ { "name": "stderr", "text": [ ".", "\n----------------------------------------------------------------------\nRan 1 test in 0.002s\n\nOK\n" ], "output_type": "stream" }, { "data": { "text/plain": "" }, "metadata": {}, "output_type": "execute_result", "execution_count": 18 } ], "source": [ "import unittest\n", "\n", "def 回文(n):\n", " result = str(n)\n", " if result == result[::-1]:\n", " return True\n", " return False\n", "\n", "class 回文Test(unittest.TestCase):\n", " def test_10進数の11ならば11になる(self):\n", " self.assertEqual(回文(11), True)\n", " self.assertEqual(回文(10), False)\n", "\n", "unittest.main(argv=[''],exit=False)" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n", "is_executing": false } } }, { "cell_type": "code", "execution_count": 19, "outputs": [ { "name": "stderr", "text": [ ".", ".", ".", "\n----------------------------------------------------------------------\nRan 3 tests in 0.004s\n\nOK\n" ], "output_type": "stream" }, { "data": { "text/plain": "" }, "metadata": {}, "output_type": "execute_result", "execution_count": 19 } ], "source": [ "import unittest\n", "import pdb\n", "\n", "def 回文(n):\n", " result = str(n)\n", " if result == result[::-1]:\n", " return True\n", " return False\n", "\n", "class 回文Test(unittest.TestCase):\n", " def test_10進数の11ならば11になる(self):\n", " self.assertEqual(回文(11), True)\n", " self.assertEqual(回文(10), False)\n", " \n", " def test_2進数を表示する(self):\n", " self.assertEqual(format(9, 'b'), '1001')\n", "\n", " def test_8進数を表示する(self):\n", " self.assertEqual(format(9, 'o'), '11')\n", "\n", "unittest.main(argv=[''],exit=False)" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n", "is_executing": false } } }, { "cell_type": "code", "execution_count": 20, "outputs": [ { "name": "stderr", "text": [ ".", ".", ".", ".", "\n----------------------------------------------------------------------\nRan 4 tests in 0.004s\n\nOK\n" ], "output_type": "stream" }, { "name": "stdout", "text": [ "最小の値は585\n" ], "output_type": "stream" }, { "data": { "text/plain": "" }, "metadata": {}, "output_type": "execute_result", "execution_count": 20 } ], "source": [ "import unittest\n", "import pdb\n", "\n", "def 回文(n):\n", " decimal = str(n)\n", " binary = format(n, 'b')\n", " octet = format(n, 'o')\n", "\n", " if decimal == decimal[::-1] and binary == binary[::-1] and octet == octet[::-1]:\n", " return True\n", " return False\n", "\n", "class 回文Test(unittest.TestCase):\n", " def test_10進数の9ならば(self):\n", " self.assertEqual(回文(9), True)\n", " \n", " def test_10進数の10以上で最小の値は(self):\n", " n = 10\n", " while True:\n", " result = 回文(n)\n", " if result == True:\n", " break;\n", " else:\n", " n += 1\n", "\n", " self.assertEqual(n, 585)\n", " print(f\"最小の値は{n}\")\n", " \n", "\n", " def test_2進数を表示する(self):\n", " self.assertEqual(format(9, 'b'), '1001')\n", "\n", " def test_8進数を表示する(self):\n", " self.assertEqual(format(9, 'o'), '11')\n", "\n", "unittest.main(argv=[''],exit=False)" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n", "is_executing": false } } }, { "cell_type": "code", "execution_count": 21, "outputs": [ { "name": "stderr", "text": [ ".", ".", "\n----------------------------------------------------------------------\nRan 2 tests in 0.003s\n\nOK\n" ], "output_type": "stream" }, { "name": "stdout", "text": [ "Trying:\n 回文(9)\nExpecting:\n True\nok\n6 items had no tests:\n __main__\n __main__.回文Test\n __main__.回文Test.test_10進数の10以上で最小の値は\n __main__.回文Test.test_10進数の9ならば\n __main__.回文Test.test_2進数を表示する\n __main__.回文Test.test_8進数を表示する\n1 items passed all tests:\n 1 tests in __main__.回文\n1 tests in 7 items.\n1 passed and 0 failed.\nTest passed.\n最小の値は585\n" ], "output_type": "stream" }, { "data": { "text/plain": "" }, "metadata": {}, "output_type": "execute_result", "execution_count": 21 } ], "source": [ "import unittest\n", "import doctest\n", "import pdb\n", " \n", "def 回文(n):\n", " \"\"\"10進数,2進数,8進数いずれで表現しても回文数となる場合はTureを返す\n", "\n", " >>> 回文(9)\n", " True\n", " \"\"\"\n", " decimal = str(n)\n", " binary = format(n, 'b')\n", " octet = format(n, 'o')\n", "\n", " if decimal == decimal[::-1] and binary == binary[::-1] and octet == octet[::-1]:\n", " return True\n", " return False\n", "\n", "doctest.testmod(verbose=True)\n", "\n", "class 回文Test(unittest.TestCase):\n", " def test_10進数の9ならば(self):\n", " self.assertEqual(回文(9), True)\n", " \n", " def test_10進数の10以上で最小の値は(self):\n", " n = 10\n", " while True:\n", " result = 回文(n)\n", " if result == True:\n", " break;\n", " else:\n", " n += 1\n", "\n", " self.assertEqual(n, 585)\n", " print(f\"最小の値は{n}\")\n", " \n", "unittest.main(argv=[''],exit=False)" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n", "is_executing": false } } }, { "cell_type": "markdown", "source": [ "## リファクタリング" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%% md\n" } } }, { "cell_type": "code", "execution_count": 22, "outputs": [ { "name": "stdout", "text": [ "Trying:\n 回文(9)\nExpecting:\n True\nok\n4 items had no tests:\n __main__\n __main__.回文Test\n __main__.回文Test.test_10進数の10以上で最小の値は\n __main__.回文Test.test_10進数の9ならば\n1 items passed all tests:\n 1 tests in __main__.回文\n1 tests in 5 items.\n1 passed and 0 failed.\nTest passed.\n" ], "output_type": "stream" }, { "data": { "text/plain": "TestResults(failed=0, attempted=1)" }, "metadata": {}, "output_type": "execute_result", "execution_count": 22 } ], "source": [ "import doctest\n", "import pdb\n", " \n", "def 回文(n):\n", " \"\"\"10進数,2進数,8進数いずれで表現しても回文数となる場合はTureを返す\n", "\n", " >>> 回文(9)\n", " True\n", " \"\"\"\n", " \n", " 回文10進数 = str(n) == str(n)[::-1]\n", " 回文2進数 = format(n, 'b') == format(n, 'b')[::-1]\n", " 回文8進数 = format(n, 'o') == format(n, 'o')[::-1]\n", " \n", " if 回文10進数 and 回文2進数 and 回文8進数:\n", " return True\n", " return False\n", "\n", "doctest.testmod(verbose=True)" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n", "is_executing": false } } }, { "cell_type": "markdown", "source": [ "\n", "\n", "\n" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%% md\n" } } } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.6" }, "pycharm": { "stem_cell": { "cell_type": "raw", "source": [], "metadata": { "collapsed": false } } } }, "nbformat": 4, "nbformat_minor": 0 }