├── main0.c ├── sample.txt ├── text.txt ├── first_edition ├── sample.txt ├── text.txt ├── sample.c ├── README.md ├── FE2019a_distribution.csv ├── 6-1-3_FEH29aki_PM_11_python.ipynb ├── 3-3-1_FEH31haru_PM_8_python.ipynb ├── 5-3-1_APR01aki_PM_3_python.ipynb ├── 4-3-1_FEH31haru_PM_11_python.ipynb ├── 6-1-1_FER01aki_PM_8_python.ipynb ├── 6-1-2_FEH31haru_PM_9_python.ipynb ├── 6-2-1_IPA_sample_question.ipynb └── Chapter 4. Python Text.ipynb ├── sample.c ├── main.c ├── main100.c ├── FE2019a_distribution.csv ├── README.md ├── 7-1-5_FEH28haru_PM_9_python.ipynb ├── 7-1-3_FEH29aki_PM_11_python.ipynb ├── 5-3-1_FEH31haru_PM_8_python.ipynb ├── 3-3-1_FER01aki_PM_9_python.ipynb ├── 6-3-1_APR01aki_PM_3_python.ipynb ├── 4-3-1_FEH31haru_PM_11_python.ipynb ├── 7-1-4_APR02aki_PM_3_python.ipynb ├── 7-1-1_FER01aki_PM_8_python.ipynb ├── 7-1-2_FEH31haru_PM_9_python.ipynb ├── Chapter5_Python_Text.ipynb └── 7-2-1_IPA_sample_question.ipynb /main0.c: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /sample.txt: -------------------------------------------------------------------------------- 1 | Hello, World! 2 | -------------------------------------------------------------------------------- /text.txt: -------------------------------------------------------------------------------- 1 | Hello 2 | HelloHello 3 | -------------------------------------------------------------------------------- /first_edition/sample.txt: -------------------------------------------------------------------------------- 1 | Hello, World! 2 | -------------------------------------------------------------------------------- /first_edition/text.txt: -------------------------------------------------------------------------------- 1 | Hello 2 | HelloHello 3 | -------------------------------------------------------------------------------- /sample.c: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | int main() { 4 | printf("\n"); 5 | } 6 | -------------------------------------------------------------------------------- /first_edition/sample.c: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | int main() { 4 | printf("\n"); 5 | } 6 | -------------------------------------------------------------------------------- /main.c: -------------------------------------------------------------------------------- 1 | int main() { 2 | /* for testing dump() */ 3 | dump("main.c", 0L, -1L); 4 | dump("main.c", 17L, 40L); 5 | } 6 | -------------------------------------------------------------------------------- /main100.c: -------------------------------------------------------------------------------- 1 | int main(){ 2 | /* for testing dump() */ 3 | dump("main.c", 0, -1); 4 | dump("main.c", 17, 40); 5 | } 6 | -------------------------------------------------------------------------------- /first_edition/README.md: -------------------------------------------------------------------------------- 1 | # fe-python 2 | こちらは,書籍「徹底攻略 基本情報技術者Python教科書」に関連するプログラムをまとめたものです。 3 | 書籍中のプログラム,演習問題のソースコード等をまとめています。 4 | 5 | 最新の版に合わせて,順次修正を行っていきます。 6 | -------------------------------------------------------------------------------- /FE2019a_distribution.csv: -------------------------------------------------------------------------------- 1 | Score,AM,PM 2 | 0-,19,589 3 | 10-,76,2342 4 | 20-,1525,5411 5 | 30-,6279,8490 6 | 40-,10997,11813 7 | 50-,13634,13308 8 | 60-,12982,11551 9 | 70-,8301,7571 10 | 80-,2440,3591 11 | 90-,166,1212 12 | -------------------------------------------------------------------------------- /first_edition/FE2019a_distribution.csv: -------------------------------------------------------------------------------- 1 | Score,AM,PM 2 | 0-,19,589 3 | 10-,76,2342 4 | 20-,1525,5411 5 | 30-,6279,8490 6 | 40-,10997,11813 7 | 50-,13634,13308 8 | 60-,12982,11551 9 | 70-,8301,7571 10 | 80-,2440,3591 11 | 90-,166,1212 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # fe-python 2 | こちらは,書籍「徹底攻略 基本情報技術者の午後対策 Python編 第2版」に関連するプログラムをまとめたものです。 3 | 書籍中や演習問題のPythonプログラムをJupyter Notebook形式で公開しています。 4 | 5 | 最新の版に合わせて,順次修正を行っていきます。 6 | 7 | ### 初版に関するプログラム 8 | 初版にあたる,2020年に刊行された書籍「徹底攻略 基本情報技術者Python教科書」のプログラムについては,first_editionフォルダに移しています。 9 | -------------------------------------------------------------------------------- /7-1-5_FEH28haru_PM_9_python.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "フラクタル図形の問題 (平成28年春基本情報技術者試験午後問9(C)改)" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 1, 13 | "metadata": {}, 14 | "outputs": [], 15 | "source": [ 16 | "pat = [[1, 1], [1, 0]]" 17 | ] 18 | }, 19 | { 20 | "cell_type": "code", 21 | "execution_count": 2, 22 | "metadata": {}, 23 | "outputs": [], 24 | "source": [ 25 | "p_rn = len(pat)\n", 26 | "p_cn = len(pat[0])" 27 | ] 28 | }, 29 | { 30 | "cell_type": "code", 31 | "execution_count": 3, 32 | "metadata": {}, 33 | "outputs": [], 34 | "source": [ 35 | "def print_frac(d):\n", 36 | " rn = cn = 1\n", 37 | " for i in range(d):\n", 38 | " rn *= p_rn\n", 39 | " cn *= p_cn\n", 40 | " for i in range(rn):\n", 41 | " for j in range(cn):\n", 42 | " print(\"*\" if exists_at(i, j, d) else \" \", end=\"\")\n", 43 | " print()" 44 | ] 45 | }, 46 | { 47 | "cell_type": "code", 48 | "execution_count": 4, 49 | "metadata": {}, 50 | "outputs": [], 51 | "source": [ 52 | "def exists_at(i, j, d):\n", 53 | " if d == 0:\n", 54 | " return 1\n", 55 | " elif exists_at(i // p_rn, j // p_cn, d-1) == 0:\n", 56 | " return 0\n", 57 | " else:\n", 58 | " return pat[i % p_rn][j % p_cn]" 59 | ] 60 | }, 61 | { 62 | "cell_type": "code", 63 | "execution_count": 5, 64 | "metadata": {}, 65 | "outputs": [ 66 | { 67 | "name": "stdout", 68 | "output_type": "stream", 69 | "text": [ 70 | "********\n", 71 | "* * * * \n", 72 | "** ** \n", 73 | "* * \n", 74 | "**** \n", 75 | "* * \n", 76 | "** \n", 77 | "* \n" 78 | ] 79 | } 80 | ], 81 | "source": [ 82 | "print_frac(3)" 83 | ] 84 | }, 85 | { 86 | "cell_type": "code", 87 | "execution_count": 6, 88 | "metadata": {}, 89 | "outputs": [], 90 | "source": [ 91 | "pat = [[1, 1, 1], [1, 0, 1]]\n", 92 | "\n", 93 | "p_rn = len(pat)\n", 94 | "p_cn = len(pat[0])" 95 | ] 96 | }, 97 | { 98 | "cell_type": "code", 99 | "execution_count": 7, 100 | "metadata": {}, 101 | "outputs": [ 102 | { 103 | "name": "stdout", 104 | "output_type": "stream", 105 | "text": [ 106 | "***************************\n", 107 | "* ** ** ** ** ** ** ** ** *\n", 108 | "*** ****** ****** ***\n", 109 | "* * * ** * * ** * * *\n", 110 | "********* *********\n", 111 | "* ** ** * * ** ** *\n", 112 | "*** *** *** ***\n", 113 | "* * * * * * * *\n" 114 | ] 115 | } 116 | ], 117 | "source": [ 118 | "print_frac(3)" 119 | ] 120 | }, 121 | { 122 | "cell_type": "code", 123 | "execution_count": null, 124 | "metadata": {}, 125 | "outputs": [], 126 | "source": [] 127 | } 128 | ], 129 | "metadata": { 130 | "kernelspec": { 131 | "display_name": "Python 3", 132 | "language": "python", 133 | "name": "python3" 134 | }, 135 | "language_info": { 136 | "codemirror_mode": { 137 | "name": "ipython", 138 | "version": 3 139 | }, 140 | "file_extension": ".py", 141 | "mimetype": "text/x-python", 142 | "name": "python", 143 | "nbconvert_exporter": "python", 144 | "pygments_lexer": "ipython3", 145 | "version": "3.7.6" 146 | } 147 | }, 148 | "nbformat": 4, 149 | "nbformat_minor": 2 150 | } 151 | -------------------------------------------------------------------------------- /7-1-3_FEH29aki_PM_11_python.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "### 7-1-3 予想問題3 \n", 8 | "(平成29年秋 基本情報技術者試験 午後問11(Java)改)" 9 | ] 10 | }, 11 | { 12 | "cell_type": "markdown", 13 | "metadata": {}, 14 | "source": [ 15 | "#### 〔プログラム1〕" 16 | ] 17 | }, 18 | { 19 | "cell_type": "code", 20 | "execution_count": 1, 21 | "metadata": {}, 22 | "outputs": [], 23 | "source": [ 24 | "class TableSorter:\n", 25 | " def __init__(self):\n", 26 | " self.orderMap = {}\n", 27 | " \n", 28 | " def putSortOrder(self, key, order):\n", 29 | " self.orderMap[key] = order\n", 30 | " \n", 31 | " def sort(self, table, orderBys):\n", 32 | " for orderBy in reversed(orderBys):\n", 33 | " order = self.orderMap[orderBy.key]\n", 34 | " table.sort(key=lambda x: order(x[orderBy.col]), reverse = orderBy.isReversed)\n", 35 | " \n", 36 | " class OrderBy:\n", 37 | " def __init__(self, key, col, isReversed = False):\n", 38 | " self.key = key\n", 39 | " self.col = col\n", 40 | " self.isReversed = isReversed " 41 | ] 42 | }, 43 | { 44 | "cell_type": "markdown", 45 | "metadata": {}, 46 | "source": [ 47 | "#### 〔プログラム2〕" 48 | ] 49 | }, 50 | { 51 | "cell_type": "code", 52 | "execution_count": 23, 53 | "metadata": {}, 54 | "outputs": [], 55 | "source": [ 56 | "data = [[\"apple\", \"3\", \"1,000\"],\n", 57 | " [\"cherry\", \"1\", \"1,000\"],\n", 58 | " [\"banana\", \"1\", \"300\"],\n", 59 | " [\"banana\", \"2\", \"2,000\"],\n", 60 | " [\"apple\", \"2\", \"300\"]]\n", 61 | "sorter = TableSorter()\n", 62 | "\n", 63 | "def lex(obj): # 関数 \"lex\"を定義 \n", 64 | " return str(obj)\n", 65 | "sorter.putSortOrder(\"lex\", lex) # ソート順\"lex\"を登録\n", 66 | "\n", 67 | "def num(obj): # 関数 \"num\"を定義\n", 68 | " return int(obj)\n", 69 | "sorter.putSortOrder(\"num\", num) # ソート順\"num\"を登録" 70 | ] 71 | }, 72 | { 73 | "cell_type": "code", 74 | "execution_count": 24, 75 | "metadata": {}, 76 | "outputs": [], 77 | "source": [ 78 | "sorter.sort(data, [TableSorter.OrderBy(\"lex\", 0), \n", 79 | " TableSorter.OrderBy(\"num\", 1, True)]) # ← α" 80 | ] 81 | }, 82 | { 83 | "cell_type": "code", 84 | "execution_count": 25, 85 | "metadata": {}, 86 | "outputs": [ 87 | { 88 | "name": "stdout", 89 | "output_type": "stream", 90 | "text": [ 91 | "apple 3 1,000 \n", 92 | "apple 2 300 \n", 93 | "banana 2 2,000 \n", 94 | "banana 1 300 \n", 95 | "cherry 1 1,000 \n" 96 | ] 97 | } 98 | ], 99 | "source": [ 100 | "for row in data:\n", 101 | " for col in row:\n", 102 | " print(col, end=\" \")\n", 103 | " print()" 104 | ] 105 | }, 106 | { 107 | "cell_type": "markdown", 108 | "metadata": {}, 109 | "source": [ 110 | "#### 設問2\n", 111 | "上のαの部分を下の行と置き換えて,〔プログラム2〕を実行" 112 | ] 113 | }, 114 | { 115 | "cell_type": "code", 116 | "execution_count": 21, 117 | "metadata": {}, 118 | "outputs": [], 119 | "source": [ 120 | "sorter.sort(data, [TableSorter.OrderBy(\"lex\", 2), \n", 121 | " TableSorter.OrderBy(\"lex\", 0)])" 122 | ] 123 | }, 124 | { 125 | "cell_type": "markdown", 126 | "metadata": {}, 127 | "source": [ 128 | "#### 設問3\n", 129 | "上のαの部分を下の行と置き換えて,〔プログラム2〕を実行" 130 | ] 131 | }, 132 | { 133 | "cell_type": "code", 134 | "execution_count": 12, 135 | "metadata": {}, 136 | "outputs": [], 137 | "source": [ 138 | "def numC(obj): # 関数 \"numC\"を定義\n", 139 | " return int(obj.replace(\",\", \"\"))\n", 140 | "sorter.putSortOrder(\"numC\", numC) # ソート順\"numC\"を登録\n", 141 | "sorter.sort(data, [TableSorter.OrderBy(\"numC\", 2), \n", 142 | " TableSorter.OrderBy(\"lex\", 0)])" 143 | ] 144 | }, 145 | { 146 | "cell_type": "code", 147 | "execution_count": null, 148 | "metadata": {}, 149 | "outputs": [], 150 | "source": [] 151 | } 152 | ], 153 | "metadata": { 154 | "kernelspec": { 155 | "display_name": "Python 3", 156 | "language": "python", 157 | "name": "python3" 158 | }, 159 | "language_info": { 160 | "codemirror_mode": { 161 | "name": "ipython", 162 | "version": 3 163 | }, 164 | "file_extension": ".py", 165 | "mimetype": "text/x-python", 166 | "name": "python", 167 | "nbconvert_exporter": "python", 168 | "pygments_lexer": "ipython3", 169 | "version": "3.8.5" 170 | } 171 | }, 172 | "nbformat": 4, 173 | "nbformat_minor": 2 174 | } 175 | -------------------------------------------------------------------------------- /first_edition/6-1-3_FEH29aki_PM_11_python.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "### 6-1-3 予想問題3 \n", 8 | "(平成29年秋 基本情報技術者試験 午後問11(Java)改)" 9 | ] 10 | }, 11 | { 12 | "cell_type": "markdown", 13 | "metadata": {}, 14 | "source": [ 15 | "#### 〔プログラム1〕" 16 | ] 17 | }, 18 | { 19 | "cell_type": "code", 20 | "execution_count": 1, 21 | "metadata": {}, 22 | "outputs": [], 23 | "source": [ 24 | "class TableSorter:\n", 25 | " def __init__(self):\n", 26 | " self.orderMap = {}\n", 27 | " \n", 28 | " def putSortOrder(self, key, order):\n", 29 | " self.orderMap[key] = order\n", 30 | " \n", 31 | " def sort(self, table, orderBys):\n", 32 | " for orderBy in reversed(orderBys):\n", 33 | " order = self.orderMap[orderBy.key]\n", 34 | " table.sort(key=lambda x: order(x[orderBy.col]), reverse = orderBy.isReversed)\n", 35 | " \n", 36 | " class OrderBy:\n", 37 | " def __init__(self, key, col, isReversed = False):\n", 38 | " self.key = key\n", 39 | " self.col = col\n", 40 | " self.isReversed = isReversed " 41 | ] 42 | }, 43 | { 44 | "cell_type": "markdown", 45 | "metadata": {}, 46 | "source": [ 47 | "#### 〔プログラム2〕" 48 | ] 49 | }, 50 | { 51 | "cell_type": "code", 52 | "execution_count": 23, 53 | "metadata": {}, 54 | "outputs": [], 55 | "source": [ 56 | "data = [[\"apple\", \"3\", \"1,000\"],\n", 57 | " [\"cherry\", \"1\", \"1,000\"],\n", 58 | " [\"banana\", \"1\", \"300\"],\n", 59 | " [\"banana\", \"2\", \"2,000\"],\n", 60 | " [\"apple\", \"2\", \"300\"]]\n", 61 | "sorter = TableSorter()\n", 62 | "\n", 63 | "def lex(obj): # 関数 \"lex\"を定義 \n", 64 | " return str(obj)\n", 65 | "sorter.putSortOrder(\"lex\", lex) # ソート順\"lex\"を登録\n", 66 | "\n", 67 | "def num(obj): # 関数 \"num\"を定義\n", 68 | " return int(obj)\n", 69 | "sorter.putSortOrder(\"num\", num) # ソート順\"num\"を登録" 70 | ] 71 | }, 72 | { 73 | "cell_type": "code", 74 | "execution_count": 24, 75 | "metadata": {}, 76 | "outputs": [], 77 | "source": [ 78 | "sorter.sort(data, [TableSorter.OrderBy(\"lex\", 0), \n", 79 | " TableSorter.OrderBy(\"num\", 1, True)]) # ← α" 80 | ] 81 | }, 82 | { 83 | "cell_type": "code", 84 | "execution_count": 25, 85 | "metadata": {}, 86 | "outputs": [ 87 | { 88 | "name": "stdout", 89 | "output_type": "stream", 90 | "text": [ 91 | "apple 3 1,000 \n", 92 | "apple 2 300 \n", 93 | "banana 2 2,000 \n", 94 | "banana 1 300 \n", 95 | "cherry 1 1,000 \n" 96 | ] 97 | } 98 | ], 99 | "source": [ 100 | "for row in data:\n", 101 | " for col in row:\n", 102 | " print(col, end=\" \")\n", 103 | " print()" 104 | ] 105 | }, 106 | { 107 | "cell_type": "markdown", 108 | "metadata": {}, 109 | "source": [ 110 | "#### 設問2\n", 111 | "上のαの部分を下の行と置き換えて,〔プログラム2〕を実行" 112 | ] 113 | }, 114 | { 115 | "cell_type": "code", 116 | "execution_count": 21, 117 | "metadata": {}, 118 | "outputs": [], 119 | "source": [ 120 | "sorter.sort(data, [TableSorter.OrderBy(\"lex\", 2), \n", 121 | " TableSorter.OrderBy(\"lex\", 0)])" 122 | ] 123 | }, 124 | { 125 | "cell_type": "markdown", 126 | "metadata": {}, 127 | "source": [ 128 | "#### 設問3\n", 129 | "上のαの部分を下の行と置き換えて,〔プログラム2〕を実行" 130 | ] 131 | }, 132 | { 133 | "cell_type": "code", 134 | "execution_count": 12, 135 | "metadata": {}, 136 | "outputs": [], 137 | "source": [ 138 | "def numC(obj): # 関数 \"numC\"を定義\n", 139 | " return int(obj.replace(\",\", \"\"))\n", 140 | "sorter.putSortOrder(\"numC\", numC) # ソート順\"numC\"を登録\n", 141 | "sorter.sort(data, [TableSorter.OrderBy(\"numC\", 2), \n", 142 | " TableSorter.OrderBy(\"lex\", 0)])" 143 | ] 144 | }, 145 | { 146 | "cell_type": "code", 147 | "execution_count": null, 148 | "metadata": {}, 149 | "outputs": [], 150 | "source": [] 151 | } 152 | ], 153 | "metadata": { 154 | "kernelspec": { 155 | "display_name": "Python 3", 156 | "language": "python", 157 | "name": "python3" 158 | }, 159 | "language_info": { 160 | "codemirror_mode": { 161 | "name": "ipython", 162 | "version": 3 163 | }, 164 | "file_extension": ".py", 165 | "mimetype": "text/x-python", 166 | "name": "python", 167 | "nbconvert_exporter": "python", 168 | "pygments_lexer": "ipython3", 169 | "version": "3.7.3" 170 | } 171 | }, 172 | "nbformat": 4, 173 | "nbformat_minor": 2 174 | } 175 | -------------------------------------------------------------------------------- /first_edition/3-3-1_FEH31haru_PM_8_python.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "### 3-3-1 アルゴリズム問題の演習\n", 8 | "(平成31年春 基本情報技術者試験 午後 問8改)" 9 | ] 10 | }, 11 | { 12 | "cell_type": "markdown", 13 | "metadata": {}, 14 | "source": [ 15 | "#### プログラムの前段階で必要な準備\n", 16 | "関数Sort。オリジナル。挿入ソートで実現。変更可" 17 | ] 18 | }, 19 | { 20 | "cell_type": "code", 21 | "execution_count": 1, 22 | "metadata": {}, 23 | "outputs": [], 24 | "source": [ 25 | "import copy\n", 26 | "\n", 27 | "def Sort(freq, nsize, node):\n", 28 | " data = copy.copy(freq) # freqの値を変えないようにコピーを作成\n", 29 | " for i in range(0, nsize):\n", 30 | " for j in range(i-1, -1, -1):\n", 31 | " if data[j] > data[j+1]:\n", 32 | " data[j], data[j+1] = data[j+1], data[j]\n", 33 | " node[j], node[j+1] = node[j+1], node[j]\n", 34 | " else:\n", 35 | " break" 36 | ] 37 | }, 38 | { 39 | "cell_type": "markdown", 40 | "metadata": {}, 41 | "source": [ 42 | "初期値の作成" 43 | ] 44 | }, 45 | { 46 | "cell_type": "code", 47 | "execution_count": 2, 48 | "metadata": {}, 49 | "outputs": [], 50 | "source": [ 51 | "max_size = 10 # 配列の最大値\n", 52 | "\n", 53 | "parent = [-1] * max_size\n", 54 | "left = [-1] * max_size\n", 55 | "right = [-1] * max_size\n", 56 | "freq = [-1] * max_size" 57 | ] 58 | }, 59 | { 60 | "cell_type": "markdown", 61 | "metadata": {}, 62 | "source": [ 63 | "#### 〔プログラム1〕" 64 | ] 65 | }, 66 | { 67 | "cell_type": "code", 68 | "execution_count": 3, 69 | "metadata": {}, 70 | "outputs": [], 71 | "source": [ 72 | "def Huffman(size, parent, left, right, freq):\n", 73 | " node = [-1] * max_size\n", 74 | " nsize = SortNode(size, parent, freq, node)\n", 75 | " while nsize >= 2:\n", 76 | " i = node[0] # 最も小さい値をもつ要素組の要素番号\n", 77 | " j = node[1] # 2番目に小さい値をもつ要素組の要素番号\n", 78 | " left[size] = i\n", 79 | " right[size] = j\n", 80 | " freq[size] = freq[i] + freq[j]\n", 81 | " parent[i] = size # 子に親の節の要素番号を格納\n", 82 | " parent[j] = size # 子に親の節の要素番号を格納\n", 83 | " size = size + 1\n", 84 | " nsize = SortNode(size, parent, freq, node)\n", 85 | " return size" 86 | ] 87 | }, 88 | { 89 | "cell_type": "code", 90 | "execution_count": 4, 91 | "metadata": {}, 92 | "outputs": [], 93 | "source": [ 94 | "def SortNode(size, parent, freq, node):\n", 95 | " nsize = 0\n", 96 | " for i in range(size):\n", 97 | " if parent[i] < 0:\n", 98 | " node[nsize] = i\n", 99 | " nsize = nsize + 1\n", 100 | " Sort(freq, nsize, node)\n", 101 | " return nsize" 102 | ] 103 | }, 104 | { 105 | "cell_type": "markdown", 106 | "metadata": {}, 107 | "source": [ 108 | "#### 〔プログラム2〕" 109 | ] 110 | }, 111 | { 112 | "cell_type": "code", 113 | "execution_count": 5, 114 | "metadata": {}, 115 | "outputs": [], 116 | "source": [ 117 | "def Encode(k, parent, left):\n", 118 | " if parent[k] >= 0:\n", 119 | " Encode(parent[k], parent, left)\n", 120 | " if left[parent[k]] == k:\n", 121 | " print(\"0\", end='') # 0を表示する\n", 122 | " else:\n", 123 | " print(\"1\", end='') # 1を表示する" 124 | ] 125 | }, 126 | { 127 | "cell_type": "markdown", 128 | "metadata": {}, 129 | "source": [ 130 | "#### プログラムの実行\n", 131 | "図1の値を設定して実行" 132 | ] 133 | }, 134 | { 135 | "cell_type": "code", 136 | "execution_count": 6, 137 | "metadata": {}, 138 | "outputs": [], 139 | "source": [ 140 | "size = 4\n", 141 | "freq[0:size] = [10, 2, 4, 3]" 142 | ] 143 | }, 144 | { 145 | "cell_type": "code", 146 | "execution_count": 7, 147 | "metadata": {}, 148 | "outputs": [], 149 | "source": [ 150 | "size = Huffman(size, parent, left, right, freq)" 151 | ] 152 | }, 153 | { 154 | "cell_type": "code", 155 | "execution_count": 8, 156 | "metadata": {}, 157 | "outputs": [ 158 | { 159 | "name": "stdout", 160 | "output_type": "stream", 161 | "text": [ 162 | "7\n", 163 | "[6, 4, 5, 4, 5, 6, -1, -1, -1, -1]\n", 164 | "[-1, -1, -1, -1, 1, 2, 5, -1, -1, -1]\n", 165 | "[-1, -1, -1, -1, 3, 4, 0, -1, -1, -1]\n", 166 | "[10, 2, 4, 3, 5, 9, 19, -1, -1, -1]\n" 167 | ] 168 | } 169 | ], 170 | "source": [ 171 | "print(size)\n", 172 | "print(parent)\n", 173 | "print(left)\n", 174 | "print(right)\n", 175 | "print(freq)" 176 | ] 177 | }, 178 | { 179 | "cell_type": "code", 180 | "execution_count": 9, 181 | "metadata": {}, 182 | "outputs": [ 183 | { 184 | "name": "stdout", 185 | "output_type": "stream", 186 | "text": [ 187 | "010" 188 | ] 189 | } 190 | ], 191 | "source": [ 192 | "k = 1\n", 193 | "Encode(k, parent, left)" 194 | ] 195 | }, 196 | { 197 | "cell_type": "code", 198 | "execution_count": null, 199 | "metadata": {}, 200 | "outputs": [], 201 | "source": [] 202 | } 203 | ], 204 | "metadata": { 205 | "kernelspec": { 206 | "display_name": "Python 3", 207 | "language": "python", 208 | "name": "python3" 209 | }, 210 | "language_info": { 211 | "codemirror_mode": { 212 | "name": "ipython", 213 | "version": 3 214 | }, 215 | "file_extension": ".py", 216 | "mimetype": "text/x-python", 217 | "name": "python", 218 | "nbconvert_exporter": "python", 219 | "pygments_lexer": "ipython3", 220 | "version": "3.7.3" 221 | } 222 | }, 223 | "nbformat": 4, 224 | "nbformat_minor": 2 225 | } 226 | -------------------------------------------------------------------------------- /5-3-1_FEH31haru_PM_8_python.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "### 5-3-1 アルゴリズム問題の演習\n", 8 | "(平成31年春 基本情報技術者試験 午後 問8改)" 9 | ] 10 | }, 11 | { 12 | "cell_type": "markdown", 13 | "metadata": {}, 14 | "source": [ 15 | "#### プログラムの前段階で必要な準備\n", 16 | "関数Sort。オリジナル。挿入ソートで実現。変更可" 17 | ] 18 | }, 19 | { 20 | "cell_type": "code", 21 | "execution_count": 1, 22 | "metadata": {}, 23 | "outputs": [], 24 | "source": [ 25 | "import copy\n", 26 | "\n", 27 | "def Sort(freq, nsize, node):\n", 28 | " data = copy.copy(freq) # freqの値を変えないようにコピーを作成\n", 29 | " for i in range(0, nsize):\n", 30 | " for j in range(i-1, -1, -1):\n", 31 | " if data[j] > data[j+1]:\n", 32 | " data[j], data[j+1] = data[j+1], data[j]\n", 33 | " node[j], node[j+1] = node[j+1], node[j]\n", 34 | " else:\n", 35 | " break" 36 | ] 37 | }, 38 | { 39 | "cell_type": "markdown", 40 | "metadata": {}, 41 | "source": [ 42 | "初期値の作成" 43 | ] 44 | }, 45 | { 46 | "cell_type": "code", 47 | "execution_count": 2, 48 | "metadata": {}, 49 | "outputs": [], 50 | "source": [ 51 | "max_size = 10 # 配列の最大値\n", 52 | "\n", 53 | "parent = [-1] * max_size\n", 54 | "left = [-1] * max_size\n", 55 | "right = [-1] * max_size\n", 56 | "freq = [-1] * max_size" 57 | ] 58 | }, 59 | { 60 | "cell_type": "markdown", 61 | "metadata": {}, 62 | "source": [ 63 | "#### 〔プログラム1〕" 64 | ] 65 | }, 66 | { 67 | "cell_type": "code", 68 | "execution_count": 3, 69 | "metadata": {}, 70 | "outputs": [], 71 | "source": [ 72 | "def Huffman(size, parent, left, right, freq):\n", 73 | " node = [-1] * max_size # max_sizeはあらかじめ設定された配列の最大値\n", 74 | " nsize = SortNode(size, parent, freq, node)\n", 75 | " while nsize >= 2:\n", 76 | " i = node[0] # 最も小さい値をもつ要素組の要素番号\n", 77 | " j = node[1] # 2番目に小さい値をもつ要素組の要素番号\n", 78 | " left[size] = i\n", 79 | " right[size] = j\n", 80 | " freq[size] = freq[i] + freq[j]\n", 81 | " parent[i] = size # 子に親の節の要素番号を格納\n", 82 | " parent[j] = size # 子に親の節の要素番号を格納\n", 83 | " size = size + 1\n", 84 | " nsize = SortNode(size, parent, freq, node)\n", 85 | " return size" 86 | ] 87 | }, 88 | { 89 | "cell_type": "code", 90 | "execution_count": 4, 91 | "metadata": {}, 92 | "outputs": [], 93 | "source": [ 94 | "def SortNode(size, parent, freq, node):\n", 95 | " nsize = 0\n", 96 | " for i in range(size):\n", 97 | " if parent[i] < 0:\n", 98 | " node[nsize] = i\n", 99 | " nsize = nsize + 1\n", 100 | " Sort(freq, nsize, node)\n", 101 | " return nsize" 102 | ] 103 | }, 104 | { 105 | "cell_type": "markdown", 106 | "metadata": {}, 107 | "source": [ 108 | "#### 〔プログラム2〕" 109 | ] 110 | }, 111 | { 112 | "cell_type": "code", 113 | "execution_count": 5, 114 | "metadata": {}, 115 | "outputs": [], 116 | "source": [ 117 | "def Encode(k, parent, left):\n", 118 | " if parent[k] >= 0:\n", 119 | " Encode(parent[k], parent, left)\n", 120 | " if left[parent[k]] == k:\n", 121 | " print(\"0\", end='') # 0を表示する\n", 122 | " else:\n", 123 | " print(\"1\", end='') # 1を表示する" 124 | ] 125 | }, 126 | { 127 | "cell_type": "markdown", 128 | "metadata": {}, 129 | "source": [ 130 | "#### プログラムの実行\n", 131 | "図1の値を設定して実行" 132 | ] 133 | }, 134 | { 135 | "cell_type": "code", 136 | "execution_count": 6, 137 | "metadata": {}, 138 | "outputs": [], 139 | "source": [ 140 | "size = 4\n", 141 | "freq[0:size] = [10, 2, 4, 3]" 142 | ] 143 | }, 144 | { 145 | "cell_type": "code", 146 | "execution_count": 7, 147 | "metadata": {}, 148 | "outputs": [], 149 | "source": [ 150 | "size = Huffman(size, parent, left, right, freq)" 151 | ] 152 | }, 153 | { 154 | "cell_type": "code", 155 | "execution_count": 8, 156 | "metadata": {}, 157 | "outputs": [ 158 | { 159 | "name": "stdout", 160 | "output_type": "stream", 161 | "text": [ 162 | "7\n", 163 | "[6, 4, 5, 4, 5, 6, -1, -1, -1, -1]\n", 164 | "[-1, -1, -1, -1, 1, 2, 5, -1, -1, -1]\n", 165 | "[-1, -1, -1, -1, 3, 4, 0, -1, -1, -1]\n", 166 | "[10, 2, 4, 3, 5, 9, 19, -1, -1, -1]\n" 167 | ] 168 | } 169 | ], 170 | "source": [ 171 | "print(size)\n", 172 | "print(parent)\n", 173 | "print(left)\n", 174 | "print(right)\n", 175 | "print(freq)" 176 | ] 177 | }, 178 | { 179 | "cell_type": "code", 180 | "execution_count": 9, 181 | "metadata": {}, 182 | "outputs": [ 183 | { 184 | "name": "stdout", 185 | "output_type": "stream", 186 | "text": [ 187 | "010" 188 | ] 189 | } 190 | ], 191 | "source": [ 192 | "k = 1\n", 193 | "Encode(k, parent, left)" 194 | ] 195 | }, 196 | { 197 | "cell_type": "code", 198 | "execution_count": null, 199 | "metadata": {}, 200 | "outputs": [], 201 | "source": [] 202 | } 203 | ], 204 | "metadata": { 205 | "kernelspec": { 206 | "display_name": "Python 3.7.13 ('infoexam')", 207 | "language": "python", 208 | "name": "python3" 209 | }, 210 | "language_info": { 211 | "codemirror_mode": { 212 | "name": "ipython", 213 | "version": 3 214 | }, 215 | "file_extension": ".py", 216 | "mimetype": "text/x-python", 217 | "name": "python", 218 | "nbconvert_exporter": "python", 219 | "pygments_lexer": "ipython3", 220 | "version": "3.7.13" 221 | }, 222 | "vscode": { 223 | "interpreter": { 224 | "hash": "dbad5c38becfc33c00ff49ed33cde79a356015ca772c418323170cba16e4a5dc" 225 | } 226 | } 227 | }, 228 | "nbformat": 4, 229 | "nbformat_minor": 2 230 | } 231 | -------------------------------------------------------------------------------- /3-3-1_FER01aki_PM_9_python.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "### 3-3-1 関数問題 \n", 8 | "(令和元年秋 基本情報技術者試験 午後 問9(C)改)" 9 | ] 10 | }, 11 | { 12 | "cell_type": "markdown", 13 | "metadata": {}, 14 | "source": [ 15 | "#### 〔プログラム〕" 16 | ] 17 | }, 18 | { 19 | "cell_type": "code", 20 | "execution_count": 1, 21 | "metadata": {}, 22 | "outputs": [], 23 | "source": [ 24 | "WIDTH = 60 # 行当たり表示バイト数\n", 25 | "MASKCHR = '.' # 16進数表示で20~7E以外の場合の表示用文字" 26 | ] 27 | }, 28 | { 29 | "cell_type": "code", 30 | "execution_count": 2, 31 | "metadata": {}, 32 | "outputs": [], 33 | "source": [ 34 | "def dump(filename, from_byte, to_byte):\n", 35 | " pos, cnt = 0, 0\n", 36 | " hex_char = \"0123456789ABCDEF\"\n", 37 | " \n", 38 | " tblC = tblH = tblL = ''\n", 39 | " for c in range(0xFF):\n", 40 | " if 0x20 <= c and c <= 0x7E:\n", 41 | " tblC += chr(c)\n", 42 | " else:\n", 43 | " tblC += MASKCHR\n", 44 | " tblH += hex_char[c >> 4]\n", 45 | " tblL += hex_char[c & 0x0F]\n", 46 | "\n", 47 | " infile = open(filename, \"rb\")\n", 48 | " \n", 49 | " bufC = bufH = bufL = ''\n", 50 | " while True:\n", 51 | " ch = infile.read(1)\n", 52 | " if len(ch) > 0 and (to_byte < 0 or cnt <= to_byte):\n", 53 | " cnt += 1\n", 54 | " else:\n", 55 | " break\n", 56 | " if cnt > from_byte:\n", 57 | " ch_int = ord(ch.decode()) # chの文字コードを取得\n", 58 | " bufC += tblC[ch_int]\n", 59 | " bufH += tblH[ch_int]\n", 60 | " bufL += tblL[ch_int]\n", 61 | " pos += 1\n", 62 | " if pos == WIDTH:\n", 63 | " print(\"{0:10d} {1:s}\\n{2:12s}{3:s}\\n{4:12s}{5:s}\\n\".format(cnt - WIDTH, bufC, \" \", bufH, \" \", bufL))\n", 64 | " bufC = bufH = bufL = ''\n", 65 | " pos = 0\n", 66 | "\n", 67 | " if pos > 0:\n", 68 | " print(\"{0:10d} {1:s}\\n{2:12s}{3:s}\\n{4:12s}{5:s}\\n\".format(\n", 69 | " cnt - pos, bufC, \" \", bufH, \" \", bufL))\n", 70 | "\n", 71 | " if len(ch) == 0:\n", 72 | " print(\"END OF DATA ... {0:d} byte(s)\\n\".format(cnt - from_byte))\n", 73 | " else:\n", 74 | " print(\"END OF DUMP ... {0:d} byte(s)\\n\".format(cnt - from_byte))\n", 75 | " \n", 76 | " infile.close()" 77 | ] 78 | }, 79 | { 80 | "cell_type": "markdown", 81 | "metadata": {}, 82 | "source": [ 83 | "#### テスト:図2 図1の入力ファイルの先頭から末尾までの表示例" 84 | ] 85 | }, 86 | { 87 | "cell_type": "code", 88 | "execution_count": 3, 89 | "metadata": {}, 90 | "outputs": [ 91 | { 92 | "name": "stdout", 93 | "output_type": "stream", 94 | "text": [ 95 | " 0 int main() {.. /* for testing dump() */.. dump(\"main.c\",\n", 96 | " 667266662227002222226672767766626767222220022267672266662622\n", 97 | " 9E40D19E890BDA000FA06F2045349E7045D0890AFDA00045D082D19EE32C\n", 98 | "\n", 99 | " 60 0L, -1L);.. dump(\"main.c\", 17L, 40L);..}..\n", 100 | " 234222342300222676722666626222334223342300700\n", 101 | " 00CC0D1C9BDA00045D082D19EE32C017CC040C9BDADDA\n", 102 | "\n", 103 | "END OF DATA ... 105 byte(s)\n", 104 | "\n" 105 | ] 106 | } 107 | ], 108 | "source": [ 109 | "dump(\"main.c\", 0, -1)" 110 | ] 111 | }, 112 | { 113 | "cell_type": "markdown", 114 | "metadata": {}, 115 | "source": [ 116 | "#### テスト:図3 図1の入力ファイルのバイト位置17から40までの表示例" 117 | ] 118 | }, 119 | { 120 | "cell_type": "code", 121 | "execution_count": 4, 122 | "metadata": {}, 123 | "outputs": [ 124 | { 125 | "name": "stdout", 126 | "output_type": "stream", 127 | "text": [ 128 | " 17 /* for testing dump() */\n", 129 | " 222667276776662676722222\n", 130 | " FA06F2045349E7045D0890AF\n", 131 | "\n", 132 | "END OF DUMP ... 24 byte(s)\n", 133 | "\n" 134 | ] 135 | } 136 | ], 137 | "source": [ 138 | "# for testing dump()\n", 139 | "\n", 140 | "dump(\"main.c\", 17, 40)" 141 | ] 142 | }, 143 | { 144 | "cell_type": "markdown", 145 | "metadata": {}, 146 | "source": [ 147 | "#### テスト:設問2 〔ケース1〕ファイルサイズ=100, from_byte=99, to_byte=99" 148 | ] 149 | }, 150 | { 151 | "cell_type": "code", 152 | "execution_count": 5, 153 | "metadata": { 154 | "scrolled": true 155 | }, 156 | "outputs": [ 157 | { 158 | "name": "stdout", 159 | "output_type": "stream", 160 | "text": [ 161 | " 99 .\n", 162 | " 0\n", 163 | " A\n", 164 | "\n", 165 | "END OF DATA ... 1 byte(s)\n", 166 | "\n" 167 | ] 168 | } 169 | ], 170 | "source": [ 171 | "dump(\"main100.c\", 99, 99)" 172 | ] 173 | }, 174 | { 175 | "cell_type": "markdown", 176 | "metadata": {}, 177 | "source": [ 178 | "#### テスト:設問2 〔ケース2〕ファイルサイズ=0, from_byte=0, to_byte<0" 179 | ] 180 | }, 181 | { 182 | "cell_type": "code", 183 | "execution_count": 6, 184 | "metadata": {}, 185 | "outputs": [ 186 | { 187 | "name": "stdout", 188 | "output_type": "stream", 189 | "text": [ 190 | "END OF DATA ... 0 byte(s)\n", 191 | "\n" 192 | ] 193 | } 194 | ], 195 | "source": [ 196 | "dump(\"main0.c\", 0, -1)" 197 | ] 198 | }, 199 | { 200 | "cell_type": "code", 201 | "execution_count": null, 202 | "metadata": {}, 203 | "outputs": [], 204 | "source": [] 205 | } 206 | ], 207 | "metadata": { 208 | "kernelspec": { 209 | "display_name": "Python 3", 210 | "language": "python", 211 | "name": "python3" 212 | }, 213 | "language_info": { 214 | "codemirror_mode": { 215 | "name": "ipython", 216 | "version": 3 217 | }, 218 | "file_extension": ".py", 219 | "mimetype": "text/x-python", 220 | "name": "python", 221 | "nbconvert_exporter": "python", 222 | "pygments_lexer": "ipython3", 223 | "version": "3.8.5" 224 | } 225 | }, 226 | "nbformat": 4, 227 | "nbformat_minor": 2 228 | } 229 | -------------------------------------------------------------------------------- /6-3-1_APR01aki_PM_3_python.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "### 6-3-1 データサイエンス問題の演習 \n", 8 | "(令和元年秋 応用情報技術者試験 午後 問3(アルゴリズム)改)" 9 | ] 10 | }, 11 | { 12 | "cell_type": "markdown", 13 | "metadata": {}, 14 | "source": [ 15 | "#### 図4 単純パーセプトロンのプログラム" 16 | ] 17 | }, 18 | { 19 | "cell_type": "code", 20 | "execution_count": 1, 21 | "metadata": {}, 22 | "outputs": [], 23 | "source": [ 24 | "def simple_perceptron(X, Y):\n", 25 | " for out in range(NC):\n", 26 | " ytemp = BY\n", 27 | " for inp in range(NI):\n", 28 | " ytemp = ytemp + X[out][inp] * WY[inp]\n", 29 | " if ytemp > 0:\n", 30 | " Y[out] = 1\n", 31 | " else:\n", 32 | " Y[out] = 0" 33 | ] 34 | }, 35 | { 36 | "cell_type": "markdown", 37 | "metadata": {}, 38 | "source": [ 39 | "図4を動かすために,初期値を設定" 40 | ] 41 | }, 42 | { 43 | "cell_type": "code", 44 | "execution_count": 2, 45 | "metadata": {}, 46 | "outputs": [], 47 | "source": [ 48 | "NI = 2\n", 49 | "NC = 4\n", 50 | "X = [[0, 0], [0, 1], [1, 0], [1, 1]]\n", 51 | "Y = [0, 0, 0, 0] # 初期化" 52 | ] 53 | }, 54 | { 55 | "cell_type": "markdown", 56 | "metadata": {}, 57 | "source": [ 58 | "単純パーセプトロンでのノードの演算式\n", 59 | "$$\n", 60 | "y = \n", 61 | "\\begin{cases}\n", 62 | " 0 \\quad (x1 \\times w1 + x2 \\times w2 + b \\leqq 0 の場合) \\\\\n", 63 | " 1 \\quad (x1 \\times w1 + x2 \\times w2 + b > 0 の場合) \\\\\n", 64 | "\\end{cases}\n", 65 | "$$" 66 | ] 67 | }, 68 | { 69 | "cell_type": "markdown", 70 | "metadata": {}, 71 | "source": [ 72 | "表1の論理積の値を設定(空欄a)" 73 | ] 74 | }, 75 | { 76 | "cell_type": "code", 77 | "execution_count": 3, 78 | "metadata": {}, 79 | "outputs": [ 80 | { 81 | "data": { 82 | "text/plain": [ 83 | "[0, 0, 0, 1]" 84 | ] 85 | }, 86 | "execution_count": 3, 87 | "metadata": {}, 88 | "output_type": "execute_result" 89 | } 90 | ], 91 | "source": [ 92 | "WY = [0.5, 0.5]\n", 93 | "BY = -0.7\n", 94 | "simple_perceptron(X, Y)\n", 95 | "Y" 96 | ] 97 | }, 98 | { 99 | "cell_type": "markdown", 100 | "metadata": {}, 101 | "source": [ 102 | "表1の論理和の値を設定" 103 | ] 104 | }, 105 | { 106 | "cell_type": "code", 107 | "execution_count": 4, 108 | "metadata": {}, 109 | "outputs": [ 110 | { 111 | "data": { 112 | "text/plain": [ 113 | "[0, 1, 1, 1]" 114 | ] 115 | }, 116 | "execution_count": 4, 117 | "metadata": {}, 118 | "output_type": "execute_result" 119 | } 120 | ], 121 | "source": [ 122 | "WY = [0.5, 0.5]\n", 123 | "BY = -0.2\n", 124 | "simple_perceptron(X, Y)\n", 125 | "Y" 126 | ] 127 | }, 128 | { 129 | "cell_type": "markdown", 130 | "metadata": {}, 131 | "source": [ 132 | "表1の否定論理和の値を設定" 133 | ] 134 | }, 135 | { 136 | "cell_type": "code", 137 | "execution_count": 5, 138 | "metadata": {}, 139 | "outputs": [ 140 | { 141 | "data": { 142 | "text/plain": [ 143 | "[1, 1, 1, 0]" 144 | ] 145 | }, 146 | "execution_count": 5, 147 | "metadata": {}, 148 | "output_type": "execute_result" 149 | } 150 | ], 151 | "source": [ 152 | "WY = [-0.5, -0.5]\n", 153 | "BY = 0.7\n", 154 | "simple_perceptron(X, Y)\n", 155 | "Y" 156 | ] 157 | }, 158 | { 159 | "cell_type": "markdown", 160 | "metadata": {}, 161 | "source": [ 162 | "#### 図6 3層パーセプトロンのプログラム" 163 | ] 164 | }, 165 | { 166 | "cell_type": "code", 167 | "execution_count": 6, 168 | "metadata": {}, 169 | "outputs": [], 170 | "source": [ 171 | "def three_layer_perceptron(X, Y):\n", 172 | " for out in range(NC):\n", 173 | " ytemp = BY\n", 174 | " for mid in range(NM):\n", 175 | " mtemp = BM[mid]\n", 176 | " for inp in range(NI):\n", 177 | " mtemp = mtemp + X[out][inp] * WM[mid][inp]\n", 178 | " if mtemp > 0:\n", 179 | " M[out][mid] = 1\n", 180 | " else:\n", 181 | " M[out][mid] = 0\n", 182 | " ytemp = ytemp + M[out][mid] * WY[mid]\n", 183 | " if ytemp > 0:\n", 184 | " Y[out] = 1\n", 185 | " else:\n", 186 | " Y[out] = 0" 187 | ] 188 | }, 189 | { 190 | "cell_type": "markdown", 191 | "metadata": {}, 192 | "source": [ 193 | "図6を動かすために,初期値設定" 194 | ] 195 | }, 196 | { 197 | "cell_type": "code", 198 | "execution_count": 7, 199 | "metadata": {}, 200 | "outputs": [], 201 | "source": [ 202 | "NM = 2\n", 203 | "M = [[0, 0], [0, 0], [0, 0], [0, 0]] # 初期化" 204 | ] 205 | }, 206 | { 207 | "cell_type": "markdown", 208 | "metadata": {}, 209 | "source": [ 210 | "表3 排他的論理和" 211 | ] 212 | }, 213 | { 214 | "cell_type": "code", 215 | "execution_count": 8, 216 | "metadata": {}, 217 | "outputs": [ 218 | { 219 | "data": { 220 | "text/plain": [ 221 | "[0, 1, 1, 0]" 222 | ] 223 | }, 224 | "execution_count": 8, 225 | "metadata": {}, 226 | "output_type": "execute_result" 227 | } 228 | ], 229 | "source": [ 230 | "WM = [[0.5, 0.5], [-0.5, -0.5]]\n", 231 | "BM = [-0.2, 0.7]\n", 232 | "WY = [0.5, 0.5]\n", 233 | "BY = -0.6\n", 234 | "three_layer_perceptron(X, Y)\n", 235 | "Y" 236 | ] 237 | }, 238 | { 239 | "cell_type": "markdown", 240 | "metadata": {}, 241 | "source": [ 242 | "#### 設問3" 243 | ] 244 | }, 245 | { 246 | "cell_type": "markdown", 247 | "metadata": {}, 248 | "source": [ 249 | "同値の例(3層パーセプトロン)" 250 | ] 251 | }, 252 | { 253 | "cell_type": "code", 254 | "execution_count": 15, 255 | "metadata": {}, 256 | "outputs": [ 257 | { 258 | "data": { 259 | "text/plain": [ 260 | "[1, 0, 0, 1]" 261 | ] 262 | }, 263 | "execution_count": 15, 264 | "metadata": {}, 265 | "output_type": "execute_result" 266 | } 267 | ], 268 | "source": [ 269 | "WM = [[0.5, 0.5], [-0.5, -0.5]]\n", 270 | "BM = [-0.2, 0.7]\n", 271 | "WY = [-0.5, -0.5]\n", 272 | "BY = 0.7\n", 273 | "three_layer_perceptron(X, Y)\n", 274 | "Y" 275 | ] 276 | }, 277 | { 278 | "cell_type": "markdown", 279 | "metadata": {}, 280 | "source": [ 281 | "否定論理和の例(単純パーセプトロン)" 282 | ] 283 | }, 284 | { 285 | "cell_type": "code", 286 | "execution_count": 16, 287 | "metadata": {}, 288 | "outputs": [ 289 | { 290 | "data": { 291 | "text/plain": [ 292 | "[1, 0, 0, 0]" 293 | ] 294 | }, 295 | "execution_count": 16, 296 | "metadata": {}, 297 | "output_type": "execute_result" 298 | } 299 | ], 300 | "source": [ 301 | "WY = [-0.5, -0.5]\n", 302 | "BY = 0.2\n", 303 | "simple_perceptron(X, Y)\n", 304 | "Y" 305 | ] 306 | }, 307 | { 308 | "cell_type": "code", 309 | "execution_count": null, 310 | "metadata": {}, 311 | "outputs": [], 312 | "source": [] 313 | } 314 | ], 315 | "metadata": { 316 | "kernelspec": { 317 | "display_name": "Python 3", 318 | "language": "python", 319 | "name": "python3" 320 | }, 321 | "language_info": { 322 | "codemirror_mode": { 323 | "name": "ipython", 324 | "version": 3 325 | }, 326 | "file_extension": ".py", 327 | "mimetype": "text/x-python", 328 | "name": "python", 329 | "nbconvert_exporter": "python", 330 | "pygments_lexer": "ipython3", 331 | "version": "3.8.5" 332 | } 333 | }, 334 | "nbformat": 4, 335 | "nbformat_minor": 2 336 | } 337 | -------------------------------------------------------------------------------- /first_edition/5-3-1_APR01aki_PM_3_python.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "### 5-3-1 データサイエンス問題の演習 \n", 8 | "(令和元年秋 応用情報技術者試験 午後 問3(アルゴリズム)改)" 9 | ] 10 | }, 11 | { 12 | "cell_type": "markdown", 13 | "metadata": {}, 14 | "source": [ 15 | "#### 図4 単純パーセプトロンのプログラム" 16 | ] 17 | }, 18 | { 19 | "cell_type": "code", 20 | "execution_count": 1, 21 | "metadata": {}, 22 | "outputs": [], 23 | "source": [ 24 | "def simple_perceptron(X, Y):\n", 25 | " for out in range(NC):\n", 26 | " ytemp = BY\n", 27 | " for inp in range(NI):\n", 28 | " ytemp = ytemp + X[out][inp] * WY[inp]\n", 29 | " if ytemp > 0:\n", 30 | " Y[out] = 1\n", 31 | " else:\n", 32 | " Y[out] = 0" 33 | ] 34 | }, 35 | { 36 | "cell_type": "markdown", 37 | "metadata": {}, 38 | "source": [ 39 | "図4を動かすために,初期値を設定" 40 | ] 41 | }, 42 | { 43 | "cell_type": "code", 44 | "execution_count": 2, 45 | "metadata": {}, 46 | "outputs": [], 47 | "source": [ 48 | "NI = 2\n", 49 | "NC = 4\n", 50 | "X = [[0, 0], [0, 1], [1, 0], [1, 1]]\n", 51 | "Y = [0, 0, 0, 0] # 初期化" 52 | ] 53 | }, 54 | { 55 | "cell_type": "markdown", 56 | "metadata": {}, 57 | "source": [ 58 | "単純パーセプトロンでのノードの演算式\n", 59 | "$$\n", 60 | "y = \n", 61 | "\\begin{cases}\n", 62 | " 0 \\quad (x1 \\times w1 + x2 \\times w2 + b \\leqq 0 の場合) \\\\\n", 63 | " 1 \\quad (x1 \\times w1 + x2 \\times w2 + b > 0 の場合) \\\\\n", 64 | "\\end{cases}\n", 65 | "$$" 66 | ] 67 | }, 68 | { 69 | "cell_type": "markdown", 70 | "metadata": {}, 71 | "source": [ 72 | "表1の論理積の値を設定(空欄a)" 73 | ] 74 | }, 75 | { 76 | "cell_type": "code", 77 | "execution_count": 3, 78 | "metadata": {}, 79 | "outputs": [ 80 | { 81 | "data": { 82 | "text/plain": [ 83 | "[0, 0, 0, 1]" 84 | ] 85 | }, 86 | "execution_count": 3, 87 | "metadata": {}, 88 | "output_type": "execute_result" 89 | } 90 | ], 91 | "source": [ 92 | "WY = [0.5, 0.5]\n", 93 | "BY = -0.7\n", 94 | "simple_perceptron(X, Y)\n", 95 | "Y" 96 | ] 97 | }, 98 | { 99 | "cell_type": "markdown", 100 | "metadata": {}, 101 | "source": [ 102 | "表1の論理和の値を設定" 103 | ] 104 | }, 105 | { 106 | "cell_type": "code", 107 | "execution_count": 4, 108 | "metadata": {}, 109 | "outputs": [ 110 | { 111 | "data": { 112 | "text/plain": [ 113 | "[0, 1, 1, 1]" 114 | ] 115 | }, 116 | "execution_count": 4, 117 | "metadata": {}, 118 | "output_type": "execute_result" 119 | } 120 | ], 121 | "source": [ 122 | "WY = [0.5, 0.5]\n", 123 | "BY = -0.2\n", 124 | "simple_perceptron(X, Y)\n", 125 | "Y" 126 | ] 127 | }, 128 | { 129 | "cell_type": "markdown", 130 | "metadata": {}, 131 | "source": [ 132 | "表1の否定論理和の値を設定" 133 | ] 134 | }, 135 | { 136 | "cell_type": "code", 137 | "execution_count": 5, 138 | "metadata": {}, 139 | "outputs": [ 140 | { 141 | "data": { 142 | "text/plain": [ 143 | "[1, 1, 1, 0]" 144 | ] 145 | }, 146 | "execution_count": 5, 147 | "metadata": {}, 148 | "output_type": "execute_result" 149 | } 150 | ], 151 | "source": [ 152 | "WY = [-0.5, -0.5]\n", 153 | "BY = 0.7\n", 154 | "simple_perceptron(X, Y)\n", 155 | "Y" 156 | ] 157 | }, 158 | { 159 | "cell_type": "markdown", 160 | "metadata": {}, 161 | "source": [ 162 | "#### 図6 3層パーセプトロンのプログラム" 163 | ] 164 | }, 165 | { 166 | "cell_type": "code", 167 | "execution_count": 6, 168 | "metadata": {}, 169 | "outputs": [], 170 | "source": [ 171 | "def three_layer_perceptron(X, Y):\n", 172 | " for out in range(NC):\n", 173 | " ytemp = BY\n", 174 | " for mid in range(NM):\n", 175 | " mtemp = BM[mid]\n", 176 | " for inp in range(NI):\n", 177 | " mtemp = mtemp + X[out][inp] * WM[mid][inp]\n", 178 | " if mtemp > 0:\n", 179 | " M[out][mid] = 1\n", 180 | " else:\n", 181 | " M[out][mid] = 0\n", 182 | " ytemp = ytemp + M[out][mid] * WY[mid]\n", 183 | " if ytemp > 0:\n", 184 | " Y[out] = 1\n", 185 | " else:\n", 186 | " Y[out] = 0" 187 | ] 188 | }, 189 | { 190 | "cell_type": "markdown", 191 | "metadata": {}, 192 | "source": [ 193 | "図6を動かすために,初期値設定" 194 | ] 195 | }, 196 | { 197 | "cell_type": "code", 198 | "execution_count": 7, 199 | "metadata": {}, 200 | "outputs": [], 201 | "source": [ 202 | "NM = 2\n", 203 | "M = [[0, 0], [0, 0], [0, 0], [0, 0]] # 初期化" 204 | ] 205 | }, 206 | { 207 | "cell_type": "markdown", 208 | "metadata": {}, 209 | "source": [ 210 | "表3 排他的論理和" 211 | ] 212 | }, 213 | { 214 | "cell_type": "code", 215 | "execution_count": 8, 216 | "metadata": {}, 217 | "outputs": [ 218 | { 219 | "data": { 220 | "text/plain": [ 221 | "[0, 1, 1, 0]" 222 | ] 223 | }, 224 | "execution_count": 8, 225 | "metadata": {}, 226 | "output_type": "execute_result" 227 | } 228 | ], 229 | "source": [ 230 | "WM = [[0.5, 0.5], [-0.5, -0.5]]\n", 231 | "BM = [-0.2, 0.7]\n", 232 | "WY = [0.5, 0.5]\n", 233 | "BY = -0.6\n", 234 | "three_layer_perceptron(X, Y)\n", 235 | "Y" 236 | ] 237 | }, 238 | { 239 | "cell_type": "markdown", 240 | "metadata": {}, 241 | "source": [ 242 | "#### 設問3" 243 | ] 244 | }, 245 | { 246 | "cell_type": "markdown", 247 | "metadata": {}, 248 | "source": [ 249 | "同値の例(3層パーセプトロン)" 250 | ] 251 | }, 252 | { 253 | "cell_type": "code", 254 | "execution_count": 15, 255 | "metadata": {}, 256 | "outputs": [ 257 | { 258 | "data": { 259 | "text/plain": [ 260 | "[1, 0, 0, 1]" 261 | ] 262 | }, 263 | "execution_count": 15, 264 | "metadata": {}, 265 | "output_type": "execute_result" 266 | } 267 | ], 268 | "source": [ 269 | "WM = [[0.5, 0.5], [-0.5, -0.5]]\n", 270 | "BM = [-0.2, 0.7]\n", 271 | "WY = [-0.5, -0.5]\n", 272 | "BY = 0.7\n", 273 | "three_layer_perceptron(X, Y)\n", 274 | "Y" 275 | ] 276 | }, 277 | { 278 | "cell_type": "markdown", 279 | "metadata": {}, 280 | "source": [ 281 | "否定論理和の例(単純パーセプトロン)" 282 | ] 283 | }, 284 | { 285 | "cell_type": "code", 286 | "execution_count": 16, 287 | "metadata": {}, 288 | "outputs": [ 289 | { 290 | "data": { 291 | "text/plain": [ 292 | "[1, 0, 0, 0]" 293 | ] 294 | }, 295 | "execution_count": 16, 296 | "metadata": {}, 297 | "output_type": "execute_result" 298 | } 299 | ], 300 | "source": [ 301 | "WY = [-0.5, -0.5]\n", 302 | "BY = 0.2\n", 303 | "simple_perceptron(X, Y)\n", 304 | "Y" 305 | ] 306 | }, 307 | { 308 | "cell_type": "code", 309 | "execution_count": null, 310 | "metadata": {}, 311 | "outputs": [], 312 | "source": [] 313 | } 314 | ], 315 | "metadata": { 316 | "kernelspec": { 317 | "display_name": "Python 3", 318 | "language": "python", 319 | "name": "python3" 320 | }, 321 | "language_info": { 322 | "codemirror_mode": { 323 | "name": "ipython", 324 | "version": 3 325 | }, 326 | "file_extension": ".py", 327 | "mimetype": "text/x-python", 328 | "name": "python", 329 | "nbconvert_exporter": "python", 330 | "pygments_lexer": "ipython3", 331 | "version": "3.7.3" 332 | } 333 | }, 334 | "nbformat": 4, 335 | "nbformat_minor": 2 336 | } 337 | -------------------------------------------------------------------------------- /4-3-1_FEH31haru_PM_11_python.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "### 4-3-1 オブジェクト指向問題の演習 \n", 8 | "(平成31年春 基本情報技術者試験 午後 問11(Java)改)" 9 | ] 10 | }, 11 | { 12 | "cell_type": "markdown", 13 | "metadata": {}, 14 | "source": [ 15 | "#### 〔プログラム1〕" 16 | ] 17 | }, 18 | { 19 | "cell_type": "code", 20 | "execution_count": 1, 21 | "metadata": {}, 22 | "outputs": [], 23 | "source": [ 24 | "class Maze():\n", 25 | " def __init__(self, mazeData, width):\n", 26 | " self.mazeData = mazeData\n", 27 | " self.width = int(width)\n", 28 | " self.startLocation = self.locationOf('S')\n", 29 | " \n", 30 | " def getStartLocation(self):\n", 31 | " return self.startLocation\n", 32 | " \n", 33 | " def isGoal(self, loc):\n", 34 | " return self.mazeData[loc.y * self.width + loc.x] == 'G'\n", 35 | "\n", 36 | " def isBlank(self, loc):\n", 37 | " return self.mazeData[loc.y * self.width + loc.x] != '*'\n", 38 | "\n", 39 | " def locationOf(self, c):\n", 40 | " index = self.mazeData.index(c)\n", 41 | " return Location(index % self.width, index // self.width)" 42 | ] 43 | }, 44 | { 45 | "cell_type": "markdown", 46 | "metadata": {}, 47 | "source": [ 48 | "#### 〔プログラム2〕(元のJava問題ではプログラム3)" 49 | ] 50 | }, 51 | { 52 | "cell_type": "code", 53 | "execution_count": 2, 54 | "metadata": {}, 55 | "outputs": [], 56 | "source": [ 57 | "from enum import Enum # 標準ライブラリの列挙型Enumを継承\n", 58 | "\n", 59 | "class Direction(Enum):\n", 60 | " NORTH = (0, -1)\n", 61 | " EAST = (1, 0)\n", 62 | " SOUTH = (0, 1)\n", 63 | " WEST = (-1, 0)\n", 64 | " \n", 65 | " def __init__(self, dx, dy):\n", 66 | " self.dx = int(dx)\n", 67 | " self.dy = int(dy)\n", 68 | " self.values = ['NORTH', 'EAST', 'SOUTH', 'WEST']\n", 69 | " \n", 70 | " def left(self):\n", 71 | " order = self.values.index(Direction((self.dx, self.dy)).name) # 現在の方向の添字を取得\n", 72 | " return (Direction[self.values[(order + 3) % 4]])\n", 73 | " \n", 74 | " def right(self):\n", 75 | " order = self.values.index(Direction((self.dx, self.dy)).name) # 現在の方向の添字を取得\n", 76 | " return (Direction[self.values[(order + 1) % 4]])\n", 77 | " \n", 78 | " def __repr__(self): # 表示するときには,名前のみ\n", 79 | " return Direction((self.dx, self.dy)).name" 80 | ] 81 | }, 82 | { 83 | "cell_type": "markdown", 84 | "metadata": {}, 85 | "source": [ 86 | "#### 〔プログラム3〕(元のJava問題ではプログラム4)" 87 | ] 88 | }, 89 | { 90 | "cell_type": "code", 91 | "execution_count": 3, 92 | "metadata": {}, 93 | "outputs": [], 94 | "source": [ 95 | "class Location():\n", 96 | " def __init__(self, x, y):\n", 97 | " self.x = int(x)\n", 98 | " self.y = int(y)" 99 | ] 100 | }, 101 | { 102 | "cell_type": "markdown", 103 | "metadata": {}, 104 | "source": [ 105 | "#### 〔プログラム4〕(元のJava問題ではプログラム2)" 106 | ] 107 | }, 108 | { 109 | "cell_type": "code", 110 | "execution_count": 4, 111 | "metadata": {}, 112 | "outputs": [], 113 | "source": [ 114 | "class Piece():\n", 115 | " def __init__(self, maze):\n", 116 | " self.history = []\n", 117 | " self.direction = Direction.NORTH\n", 118 | " self.maze = maze\n", 119 | " self.location = self.maze.getStartLocation()\n", 120 | " \n", 121 | " def turnLeft(self):\n", 122 | " self.direction = self.direction.left()\n", 123 | " \n", 124 | " def turnRight(self):\n", 125 | " self.direction = self.direction.right()\n", 126 | " \n", 127 | " def tryStepForward(self):\n", 128 | " nextLocation = Location(self.location.x + self.direction.dx, self.location.y + self.direction.dy)\n", 129 | " if self.maze.isBlank(nextLocation):\n", 130 | " self.location = nextLocation\n", 131 | " self.history.append(self.direction)\n", 132 | " return True\n", 133 | " return False\n", 134 | " \n", 135 | " def isAtGoal(self):\n", 136 | " return self.maze.isGoal(self.location)\n", 137 | " \n", 138 | " def getHistory(self):\n", 139 | " return self.history " 140 | ] 141 | }, 142 | { 143 | "cell_type": "markdown", 144 | "metadata": {}, 145 | "source": [ 146 | "#### 〔プログラム5〕" 147 | ] 148 | }, 149 | { 150 | "cell_type": "code", 151 | "execution_count": 5, 152 | "metadata": {}, 153 | "outputs": [ 154 | { 155 | "name": "stdout", 156 | "output_type": "stream", 157 | "text": [ 158 | "[NORTH, EAST, WEST, SOUTH, SOUTH, EAST, EAST, EAST, NORTH, NORTH, EAST, WEST, SOUTH, SOUTH, EAST, SOUTH, SOUTH, WEST, WEST, WEST, WEST]\n" 159 | ] 160 | } 161 | ], 162 | "source": [ 163 | "maze = Maze(\"*******\" +\n", 164 | " \"*..*..*\" +\n", 165 | " \"*S**.**\" +\n", 166 | " \"*.....*\" +\n", 167 | " \"*****.*\" +\n", 168 | " \"*G....*\" +\n", 169 | " \"*******\", 7)\n", 170 | "piece = Piece(maze)\n", 171 | "while not piece.isAtGoal():\n", 172 | " piece.turnLeft()\n", 173 | " while not piece.tryStepForward():\n", 174 | " piece.turnRight()\n", 175 | " \n", 176 | "history = piece.getHistory()\n", 177 | " # ← α\n", 178 | "\n", 179 | "print(history)" 180 | ] 181 | }, 182 | { 183 | "cell_type": "markdown", 184 | "metadata": {}, 185 | "source": [ 186 | "#### 設問2\n", 187 | "プログラム5に設問2設問文のα部分の処理を追加" 188 | ] 189 | }, 190 | { 191 | "cell_type": "code", 192 | "execution_count": 6, 193 | "metadata": {}, 194 | "outputs": [ 195 | { 196 | "name": "stdout", 197 | "output_type": "stream", 198 | "text": [ 199 | "[SOUTH, EAST, EAST, EAST, EAST, SOUTH, SOUTH, WEST, WEST, WEST, WEST]\n" 200 | ] 201 | } 202 | ], 203 | "source": [ 204 | "maze = Maze(\"*******\" +\n", 205 | " \"*..*..*\" +\n", 206 | " \"*S**.**\" +\n", 207 | " \"*.....*\" +\n", 208 | " \"*****.*\" +\n", 209 | " \"*G....*\" +\n", 210 | " \"*******\", 7)\n", 211 | "piece = Piece(maze)\n", 212 | "while not piece.isAtGoal():\n", 213 | " piece.turnLeft()\n", 214 | " while not piece.tryStepForward():\n", 215 | " piece.turnRight()\n", 216 | " \n", 217 | "history = piece.getHistory()\n", 218 | "\n", 219 | "i = 1\n", 220 | "while i < len(history):\n", 221 | " if history[i - 1] == history[i].left().left():\n", 222 | " history.pop(i - 1)\n", 223 | " history.pop(i - 1)\n", 224 | " i = 0 if i < 2 else i - 2\n", 225 | " i += 1 \n", 226 | "print(history)" 227 | ] 228 | }, 229 | { 230 | "cell_type": "code", 231 | "execution_count": null, 232 | "metadata": {}, 233 | "outputs": [], 234 | "source": [] 235 | } 236 | ], 237 | "metadata": { 238 | "kernelspec": { 239 | "display_name": "Python 3", 240 | "language": "python", 241 | "name": "python3" 242 | }, 243 | "language_info": { 244 | "codemirror_mode": { 245 | "name": "ipython", 246 | "version": 3 247 | }, 248 | "file_extension": ".py", 249 | "mimetype": "text/x-python", 250 | "name": "python", 251 | "nbconvert_exporter": "python", 252 | "pygments_lexer": "ipython3", 253 | "version": "3.7.3" 254 | } 255 | }, 256 | "nbformat": 4, 257 | "nbformat_minor": 2 258 | } 259 | -------------------------------------------------------------------------------- /first_edition/4-3-1_FEH31haru_PM_11_python.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "### 4-3-1 オブジェクト指向問題の演習 \n", 8 | "(平成31年春 基本情報技術者試験 午後 問11(Java)改)" 9 | ] 10 | }, 11 | { 12 | "cell_type": "markdown", 13 | "metadata": {}, 14 | "source": [ 15 | "#### 〔プログラム1〕" 16 | ] 17 | }, 18 | { 19 | "cell_type": "code", 20 | "execution_count": 1, 21 | "metadata": {}, 22 | "outputs": [], 23 | "source": [ 24 | "class Maze():\n", 25 | " def __init__(self, mazeData, width):\n", 26 | " self.mazeData = mazeData\n", 27 | " self.width = int(width)\n", 28 | " self.startLocation = self.locationOf('S')\n", 29 | " \n", 30 | " def getStartLocation(self):\n", 31 | " return self.startLocation\n", 32 | " \n", 33 | " def isGoal(self, loc):\n", 34 | " return self.mazeData[loc.y * self.width + loc.x] == 'G'\n", 35 | "\n", 36 | " def isBlank(self, loc):\n", 37 | " return self.mazeData[loc.y * self.width + loc.x] != '*'\n", 38 | "\n", 39 | " def locationOf(self, c):\n", 40 | " index = self.mazeData.index(c)\n", 41 | " return Location(index % self.width, index // self.width)" 42 | ] 43 | }, 44 | { 45 | "cell_type": "markdown", 46 | "metadata": {}, 47 | "source": [ 48 | "#### 〔プログラム2〕(元のJava問題ではプログラム3)" 49 | ] 50 | }, 51 | { 52 | "cell_type": "code", 53 | "execution_count": 2, 54 | "metadata": {}, 55 | "outputs": [], 56 | "source": [ 57 | "from enum import Enum # 標準ライブラリの列挙型Enumを継承\n", 58 | "\n", 59 | "class Direction(Enum):\n", 60 | " NORTH = (0, -1)\n", 61 | " EAST = (1, 0)\n", 62 | " SOUTH = (0, 1)\n", 63 | " WEST = (-1, 0)\n", 64 | " \n", 65 | " def __init__(self, dx, dy):\n", 66 | " self.dx = int(dx)\n", 67 | " self.dy = int(dy)\n", 68 | " self.values = ['NORTH', 'EAST', 'SOUTH', 'WEST']\n", 69 | " \n", 70 | " def left(self):\n", 71 | " order = self.values.index(Direction((self.dx, self.dy)).name) # 現在の方向の添字を取得\n", 72 | " return (Direction[self.values[(order + 3) % 4]])\n", 73 | " \n", 74 | " def right(self):\n", 75 | " order = self.values.index(Direction((self.dx, self.dy)).name) # 現在の方向の添字を取得\n", 76 | " return (Direction[self.values[(order + 1) % 4]])\n", 77 | " \n", 78 | " def __repr__(self): # 表示するときには,名前のみ\n", 79 | " return Direction((self.dx, self.dy)).name" 80 | ] 81 | }, 82 | { 83 | "cell_type": "markdown", 84 | "metadata": {}, 85 | "source": [ 86 | "#### 〔プログラム3〕(元のJava問題ではプログラム4)" 87 | ] 88 | }, 89 | { 90 | "cell_type": "code", 91 | "execution_count": 3, 92 | "metadata": {}, 93 | "outputs": [], 94 | "source": [ 95 | "class Location():\n", 96 | " def __init__(self, x, y):\n", 97 | " self.x = int(x)\n", 98 | " self.y = int(y)" 99 | ] 100 | }, 101 | { 102 | "cell_type": "markdown", 103 | "metadata": {}, 104 | "source": [ 105 | "#### 〔プログラム4〕(元のJava問題ではプログラム2)" 106 | ] 107 | }, 108 | { 109 | "cell_type": "code", 110 | "execution_count": 4, 111 | "metadata": {}, 112 | "outputs": [], 113 | "source": [ 114 | "class Piece():\n", 115 | " def __init__(self, maze):\n", 116 | " self.history = []\n", 117 | " self.direction = Direction.NORTH\n", 118 | " self.maze = maze\n", 119 | " self.location = self.maze.getStartLocation()\n", 120 | " \n", 121 | " def turnLeft(self):\n", 122 | " self.direction = self.direction.left()\n", 123 | " \n", 124 | " def turnRight(self):\n", 125 | " self.direction = self.direction.right()\n", 126 | " \n", 127 | " def tryStepForward(self):\n", 128 | " nextLocation = Location(self.location.x + self.direction.dx, self.location.y + self.direction.dy)\n", 129 | " if self.maze.isBlank(nextLocation):\n", 130 | " self.location = nextLocation\n", 131 | " self.history.append(self.direction)\n", 132 | " return True\n", 133 | " return False\n", 134 | " \n", 135 | " def isAtGoal(self):\n", 136 | " return self.maze.isGoal(self.location)\n", 137 | " \n", 138 | " def getHistory(self):\n", 139 | " return self.history " 140 | ] 141 | }, 142 | { 143 | "cell_type": "markdown", 144 | "metadata": {}, 145 | "source": [ 146 | "#### 〔プログラム5〕" 147 | ] 148 | }, 149 | { 150 | "cell_type": "code", 151 | "execution_count": 5, 152 | "metadata": {}, 153 | "outputs": [ 154 | { 155 | "name": "stdout", 156 | "output_type": "stream", 157 | "text": [ 158 | "[NORTH, EAST, WEST, SOUTH, SOUTH, EAST, EAST, EAST, NORTH, NORTH, EAST, WEST, SOUTH, SOUTH, EAST, SOUTH, SOUTH, WEST, WEST, WEST, WEST]\n" 159 | ] 160 | } 161 | ], 162 | "source": [ 163 | "maze = Maze(\"*******\" +\n", 164 | " \"*..*..*\" +\n", 165 | " \"*S**.**\" +\n", 166 | " \"*.....*\" +\n", 167 | " \"*****.*\" +\n", 168 | " \"*G....*\" +\n", 169 | " \"*******\", 7)\n", 170 | "piece = Piece(maze)\n", 171 | "while not piece.isAtGoal():\n", 172 | " piece.turnLeft()\n", 173 | " while not piece.tryStepForward():\n", 174 | " piece.turnRight()\n", 175 | " \n", 176 | "history = piece.getHistory()\n", 177 | " # ← α\n", 178 | "\n", 179 | "print(history)" 180 | ] 181 | }, 182 | { 183 | "cell_type": "markdown", 184 | "metadata": {}, 185 | "source": [ 186 | "#### 設問2\n", 187 | "プログラム5に設問2設問文のα部分の処理を追加" 188 | ] 189 | }, 190 | { 191 | "cell_type": "code", 192 | "execution_count": 6, 193 | "metadata": {}, 194 | "outputs": [ 195 | { 196 | "name": "stdout", 197 | "output_type": "stream", 198 | "text": [ 199 | "[SOUTH, EAST, EAST, EAST, EAST, SOUTH, SOUTH, WEST, WEST, WEST, WEST]\n" 200 | ] 201 | } 202 | ], 203 | "source": [ 204 | "maze = Maze(\"*******\" +\n", 205 | " \"*..*..*\" +\n", 206 | " \"*S**.**\" +\n", 207 | " \"*.....*\" +\n", 208 | " \"*****.*\" +\n", 209 | " \"*G....*\" +\n", 210 | " \"*******\", 7)\n", 211 | "piece = Piece(maze)\n", 212 | "while not piece.isAtGoal():\n", 213 | " piece.turnLeft()\n", 214 | " while not piece.tryStepForward():\n", 215 | " piece.turnRight()\n", 216 | " \n", 217 | "history = piece.getHistory()\n", 218 | "\n", 219 | "i = 1\n", 220 | "while i < len(history):\n", 221 | " if history[i - 1] == history[i].left().left():\n", 222 | " history.pop(i - 1)\n", 223 | " history.pop(i - 1)\n", 224 | " i = 0 if i < 2 else i - 2\n", 225 | " i += 1 \n", 226 | "print(history)" 227 | ] 228 | }, 229 | { 230 | "cell_type": "code", 231 | "execution_count": null, 232 | "metadata": {}, 233 | "outputs": [], 234 | "source": [] 235 | } 236 | ], 237 | "metadata": { 238 | "kernelspec": { 239 | "display_name": "Python 3", 240 | "language": "python", 241 | "name": "python3" 242 | }, 243 | "language_info": { 244 | "codemirror_mode": { 245 | "name": "ipython", 246 | "version": 3 247 | }, 248 | "file_extension": ".py", 249 | "mimetype": "text/x-python", 250 | "name": "python", 251 | "nbconvert_exporter": "python", 252 | "pygments_lexer": "ipython3", 253 | "version": "3.7.3" 254 | } 255 | }, 256 | "nbformat": 4, 257 | "nbformat_minor": 2 258 | } 259 | -------------------------------------------------------------------------------- /7-1-4_APR02aki_PM_3_python.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "変数の初期設定" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 1, 13 | "metadata": {}, 14 | "outputs": [], 15 | "source": [ 16 | "import math" 17 | ] 18 | }, 19 | { 20 | "cell_type": "code", 21 | "execution_count": 2, 22 | "metadata": {}, 23 | "outputs": [], 24 | "source": [ 25 | "width = 5\n", 26 | "height = 4\n", 27 | "bmpFrom = [[ 0, 223, 128, 35, 220],\n", 28 | " [ 30, 22, 18, 55, 197],\n", 29 | " [ 35, 122, 250, 105, 15],\n", 30 | " [ 38, 153, 251, 120, 18]]\n", 31 | "bmpTo = [[ 0, 0, 0, 0, 0],\n", 32 | " [ 0, 0, 0, 0, 0],\n", 33 | " [ 0, 0, 0, 0, 0],\n", 34 | " [ 0, 0, 0, 0, 0],]\n", 35 | "ratioCount = 4\n", 36 | "tdx = [ 1, -1, 0, 1]\n", 37 | "tdy = [ 0, 1, 1, 1]\n", 38 | "ratio = [ 7, 3, 5, 1]\n", 39 | "denominator = 16" 40 | ] 41 | }, 42 | { 43 | "cell_type": "code", 44 | "execution_count": 3, 45 | "metadata": {}, 46 | "outputs": [ 47 | { 48 | "name": "stdout", 49 | "output_type": "stream", 50 | "text": [ 51 | "0 0 [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]\n", 52 | "1 0 [[0, 255, -14, 0, 0], [-6, -10, -2, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]\n", 53 | "2 0 [[0, 255, 0, 49, 0], [-6, 11, 33, 7, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]\n", 54 | "3 0 [[0, 255, 0, 0, 36], [-6, 11, 48, 33, 5], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]\n", 55 | "4 0 [[0, 255, 0, 0, 255], [-6, 11, 48, 33, 5], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]\n", 56 | "0 1 [[0, 255, 0, 0, 255], [0, 21, 48, 33, 5], [7, 1, 0, 0, 0], [0, 0, 0, 0, 0]]\n", 57 | "1 1 [[0, 255, 0, 0, 255], [0, 0, 66, 33, 5], [15, 14, 2, 0, 0], [0, 0, 0, 0, 0]]\n", 58 | "2 1 [[0, 255, 0, 0, 255], [0, 0, 0, 69, 5], [15, 29, 28, 5, 0], [0, 0, 0, 0, 0]]\n", 59 | "3 1 [[0, 255, 0, 0, 255], [0, 0, 0, 0, 59], [15, 29, 51, 43, 7], [0, 0, 0, 0, 0]]\n", 60 | "4 1 [[0, 255, 0, 0, 255], [0, 0, 0, 0, 255], [15, 29, 51, 43, 7], [0, 0, 0, 0, 0]]\n", 61 | "0 2 [[0, 255, 0, 0, 255], [0, 0, 0, 0, 255], [0, 50, 51, 43, 7], [15, 3, 0, 0, 0]]\n", 62 | "1 2 [[0, 255, 0, 0, 255], [0, 0, 0, 0, 255], [0, 255, 14, 43, 7], [-1, -23, -6, 0, 0]]\n", 63 | "2 2 [[0, 255, 0, 0, 255], [0, 0, 0, 0, 255], [0, 255, 255, 46, 7], [-1, -22, -4, 0, 0]]\n", 64 | "3 2 [[0, 255, 0, 0, 255], [0, 0, 0, 0, 255], [0, 255, 255, 255, -39], [-1, -22, -24, -33, -7]]\n", 65 | "4 2 [[0, 255, 0, 0, 255], [0, 0, 0, 0, 255], [0, 255, 255, 255, 0], [-1, -22, -24, -38, -15]]\n", 66 | "0 3 [[0, 255, 0, 0, 255], [0, 0, 0, 0, 255], [0, 255, 255, 255, 0], [0, -6, -24, -38, -15]]\n", 67 | "1 3 [[0, 255, 0, 0, 255], [0, 0, 0, 0, 255], [0, 255, 255, 255, 0], [0, 255, -72, -38, -15]]\n", 68 | "2 3 [[0, 255, 0, 0, 255], [0, 0, 0, 0, 255], [0, 255, 255, 255, 0], [0, 255, 255, -72, -15]]\n", 69 | "3 3 [[0, 255, 0, 0, 255], [0, 0, 0, 0, 255], [0, 255, 255, 255, 0], [0, 255, 255, 0, 6]]\n", 70 | "4 3 [[0, 255, 0, 0, 255], [0, 0, 0, 0, 255], [0, 255, 255, 255, 0], [0, 255, 255, 0, 0]]\n" 71 | ] 72 | } 73 | ], 74 | "source": [ 75 | "for y in range(height):\n", 76 | " for x in range(width):\n", 77 | " f = bmpFrom[y][x] + bmpTo[y][x]\n", 78 | " if f >= 128:\n", 79 | " d = f - 255\n", 80 | " bmpTo[y][x] = 255\n", 81 | " else:\n", 82 | " d = f\n", 83 | " bmpTo[y][x] = 0\n", 84 | " for c in range(ratioCount):\n", 85 | " px = x + tdx[c]\n", 86 | " py = y + tdy[c]\n", 87 | " if px >= 0 and px < width and py >= 0 and py < height:\n", 88 | " bmpTo[py][px] = bmpTo[py][px] + math.floor(d * (ratio[c]/denominator))\n", 89 | " print(x, y, bmpTo)" 90 | ] 91 | }, 92 | { 93 | "cell_type": "markdown", 94 | "metadata": {}, 95 | "source": [ 96 | "〔画質向上のための改修〕" 97 | ] 98 | }, 99 | { 100 | "cell_type": "code", 101 | "execution_count": 4, 102 | "metadata": {}, 103 | "outputs": [ 104 | { 105 | "name": "stdout", 106 | "output_type": "stream", 107 | "text": [ 108 | "0 0 [[0, 255, 0, 0, 255], [0, 0, 0, 0, 255], [0, 255, 255, 255, 0], [0, 255, 255, 0, 0]]\n", 109 | "1 0 [[0, 255, 97, 0, 255], [41, 69, 13, 0, 255], [0, 255, 255, 255, 0], [0, 255, 255, 0, 0]]\n", 110 | "2 0 [[0, 255, 255, -14, 255], [41, 63, 3, -2, 255], [0, 255, 255, 255, 0], [0, 255, 255, 0, 0]]\n", 111 | "3 0 [[0, 255, 255, 0, 264], [41, 63, 6, 4, 256], [0, 255, 255, 255, 0], [0, 255, 255, 0, 0]]\n", 112 | "4 0 [[0, 255, 255, 0, 255], [41, 63, 6, 46, 327], [0, 255, 255, 255, 0], [0, 255, 255, 0, 0]]\n", 113 | "4 1 [[0, 255, 255, 0, 255], [41, 63, 6, 163, 255], [0, 255, 255, 271, 84], [0, 255, 255, 0, 0]]\n", 114 | "3 1 [[0, 255, 255, 0, 255], [41, 63, -11, 255, 255], [0, 255, 252, 259, 77], [0, 255, 255, 0, 0]]\n", 115 | "2 1 [[0, 255, 255, 0, 255], [41, 66, 0, 255, 255], [0, 255, 254, 260, 77], [0, 255, 255, 0, 0]]\n", 116 | "1 1 [[0, 255, 255, 0, 255], [79, 0, 0, 255, 255], [5, 282, 270, 260, 77], [0, 255, 255, 0, 0]]\n", 117 | "0 1 [[0, 255, 255, 0, 255], [0, 0, 0, 255, 255], [39, 302, 270, 260, 77], [0, 255, 255, 0, 0]]\n", 118 | "0 2 [[0, 255, 255, 0, 255], [0, 0, 0, 255, 255], [0, 334, 270, 260, 77], [23, 259, 255, 0, 0]]\n", 119 | "1 2 [[0, 255, 255, 0, 255], [0, 0, 0, 255, 255], [0, 255, 357, 260, 77], [60, 321, 267, 0, 0]]\n", 120 | "2 2 [[0, 255, 255, 0, 255], [0, 0, 0, 255, 255], [0, 255, 255, 414, 77], [60, 387, 377, 22, 0]]\n", 121 | "3 2 [[0, 255, 255, 0, 255], [0, 0, 0, 255, 255], [0, 255, 255, 255, 192], [60, 387, 426, 104, 16]]\n", 122 | "4 2 [[0, 255, 255, 0, 255], [0, 0, 0, 255, 255], [0, 255, 255, 255, 255], [60, 387, 426, 95, 1]]\n", 123 | "4 3 [[0, 255, 255, 0, 255], [0, 0, 0, 255, 255], [0, 255, 255, 255, 255], [60, 387, 426, 103, 0]]\n", 124 | "3 3 [[0, 255, 255, 0, 255], [0, 0, 0, 255, 255], [0, 255, 255, 255, 255], [60, 387, 412, 255, 0]]\n", 125 | "2 3 [[0, 255, 255, 0, 255], [0, 0, 0, 255, 255], [0, 255, 255, 255, 255], [60, 565, 255, 255, 0]]\n", 126 | "1 3 [[0, 255, 255, 0, 255], [0, 0, 0, 255, 255], [0, 255, 255, 255, 255], [262, 255, 255, 255, 0]]\n", 127 | "0 3 [[0, 255, 255, 0, 255], [0, 0, 0, 255, 255], [0, 255, 255, 255, 255], [255, 255, 255, 255, 0]]\n" 128 | ] 129 | } 130 | ], 131 | "source": [ 132 | "for y in range(height):\n", 133 | " for tx in range(width):\n", 134 | " x = tx\n", 135 | " if (y % 2) == 1:\n", 136 | " x = width - tx - 1\n", 137 | " f = bmpFrom[y][x] + bmpTo[y][x]\n", 138 | " if f >= 128:\n", 139 | " d = f - 255\n", 140 | " bmpTo[y][x] = 255\n", 141 | " else:\n", 142 | " d = f\n", 143 | " bmpTo[y][x] = 0\n", 144 | " for c in range(ratioCount):\n", 145 | " px = x + tdx[c] - ( 2 * tdx[c] * (y % 2))\n", 146 | " py = y + tdy[c]\n", 147 | " if px >= 0 and px < width and py >= 0 and py < height:\n", 148 | " bmpTo[py][px] = bmpTo[py][px] + math.floor(d * (ratio[c]/denominator))\n", 149 | " print(x, y, bmpTo)" 150 | ] 151 | }, 152 | { 153 | "cell_type": "code", 154 | "execution_count": null, 155 | "metadata": {}, 156 | "outputs": [], 157 | "source": [] 158 | } 159 | ], 160 | "metadata": { 161 | "kernelspec": { 162 | "display_name": "Python 3", 163 | "language": "python", 164 | "name": "python3" 165 | }, 166 | "language_info": { 167 | "codemirror_mode": { 168 | "name": "ipython", 169 | "version": 3 170 | }, 171 | "file_extension": ".py", 172 | "mimetype": "text/x-python", 173 | "name": "python", 174 | "nbconvert_exporter": "python", 175 | "pygments_lexer": "ipython3", 176 | "version": "3.7.6" 177 | } 178 | }, 179 | "nbformat": 4, 180 | "nbformat_minor": 2 181 | } 182 | -------------------------------------------------------------------------------- /7-1-1_FER01aki_PM_8_python.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "### 7-1-1 予想問題1 \n", 8 | "(令和元年秋 基本情報技術者試験 午後 問8(アルゴリズム)改)" 9 | ] 10 | }, 11 | { 12 | "cell_type": "markdown", 13 | "metadata": {}, 14 | "source": [ 15 | "関数Indexを用意(問題文には記載なし)" 16 | ] 17 | }, 18 | { 19 | "cell_type": "code", 20 | "execution_count": 1, 21 | "metadata": {}, 22 | "outputs": [], 23 | "source": [ 24 | "def Index(char):\n", 25 | " alphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n", 26 | " return alphabet.index(char[0]) + 1" 27 | ] 28 | }, 29 | { 30 | "cell_type": "markdown", 31 | "metadata": {}, 32 | "source": [ 33 | "#### 〔プログラム1〕" 34 | ] 35 | }, 36 | { 37 | "cell_type": "code", 38 | "execution_count": 2, 39 | "metadata": {}, 40 | "outputs": [], 41 | "source": [ 42 | "def GenerateBitMask(Pat, Mask):\n", 43 | " PatLen = len(Pat)\n", 44 | " for i in range(1, 27):\n", 45 | " Mask[i] = 0b0 # 初期化\n", 46 | " for i in range(1, PatLen):\n", 47 | " Mask[Index(Pat[i])] = 0b1 << (i - 1) | Mask[Index(Pat[i])]\n", 48 | " return PatLen" 49 | ] 50 | }, 51 | { 52 | "cell_type": "markdown", 53 | "metadata": {}, 54 | "source": [ 55 | "図1の「対象文字列と検索文字列の格納例」の値を設定" 56 | ] 57 | }, 58 | { 59 | "cell_type": "code", 60 | "execution_count": 3, 61 | "metadata": {}, 62 | "outputs": [], 63 | "source": [ 64 | "Mask = [0b0] * 27\n", 65 | "Text = \" AACBBAACABABAB\"\n", 66 | "Pat = \" ACABAB\"" 67 | ] 68 | }, 69 | { 70 | "cell_type": "markdown", 71 | "metadata": {}, 72 | "source": [ 73 | "図1の値でGenerateBitMaskを実行" 74 | ] 75 | }, 76 | { 77 | "cell_type": "code", 78 | "execution_count": 4, 79 | "metadata": {}, 80 | "outputs": [ 81 | { 82 | "data": { 83 | "text/plain": [ 84 | "7" 85 | ] 86 | }, 87 | "execution_count": 4, 88 | "metadata": {}, 89 | "output_type": "execute_result" 90 | } 91 | ], 92 | "source": [ 93 | "GenerateBitMask(Pat, Mask)" 94 | ] 95 | }, 96 | { 97 | "cell_type": "code", 98 | "execution_count": 5, 99 | "metadata": {}, 100 | "outputs": [ 101 | { 102 | "data": { 103 | "text/plain": [ 104 | "40" 105 | ] 106 | }, 107 | "execution_count": 5, 108 | "metadata": {}, 109 | "output_type": "execute_result" 110 | } 111 | ], 112 | "source": [ 113 | "Mask[Index(Pat[6])]" 114 | ] 115 | }, 116 | { 117 | "cell_type": "markdown", 118 | "metadata": {}, 119 | "source": [ 120 | "図2 Maskの値を順に表示(2進数16桁に変換)" 121 | ] 122 | }, 123 | { 124 | "cell_type": "code", 125 | "execution_count": 6, 126 | "metadata": {}, 127 | "outputs": [ 128 | { 129 | "name": "stdout", 130 | "output_type": "stream", 131 | "text": [ 132 | "Mask[ 1] 0000000000010101\n", 133 | "Mask[ 2] 0000000000101000\n", 134 | "Mask[ 3] 0000000000000010\n", 135 | "Mask[ 4] 0000000000000000\n", 136 | "Mask[ 5] 0000000000000000\n", 137 | "Mask[ 6] 0000000000000000\n", 138 | "Mask[ 7] 0000000000000000\n", 139 | "Mask[ 8] 0000000000000000\n", 140 | "Mask[ 9] 0000000000000000\n", 141 | "Mask[10] 0000000000000000\n", 142 | "Mask[11] 0000000000000000\n", 143 | "Mask[12] 0000000000000000\n", 144 | "Mask[13] 0000000000000000\n", 145 | "Mask[14] 0000000000000000\n", 146 | "Mask[15] 0000000000000000\n", 147 | "Mask[16] 0000000000000000\n", 148 | "Mask[17] 0000000000000000\n", 149 | "Mask[18] 0000000000000000\n", 150 | "Mask[19] 0000000000000000\n", 151 | "Mask[20] 0000000000000000\n", 152 | "Mask[21] 0000000000000000\n", 153 | "Mask[22] 0000000000000000\n", 154 | "Mask[23] 0000000000000000\n", 155 | "Mask[24] 0000000000000000\n", 156 | "Mask[25] 0000000000000000\n", 157 | "Mask[26] 0000000000000000\n" 158 | ] 159 | } 160 | ], 161 | "source": [ 162 | "for i in range(1, 27):\n", 163 | " print('Mask[{:2d}] {:016b}'.format(i, Mask[i]))" 164 | ] 165 | }, 166 | { 167 | "cell_type": "markdown", 168 | "metadata": {}, 169 | "source": [ 170 | "#### 〔プログラム2〕" 171 | ] 172 | }, 173 | { 174 | "cell_type": "code", 175 | "execution_count": 7, 176 | "metadata": {}, 177 | "outputs": [], 178 | "source": [ 179 | "def BitapMatch(Text, Pat):\n", 180 | " TextLen = len(Text)\n", 181 | " PatLen = GenerateBitMask(Pat, Mask)\n", 182 | " Status = 0b0\n", 183 | " Goal = 0b1 << (PatLen - 2)\n", 184 | " for i in range(1, TextLen):\n", 185 | " Status = Status << 1 | 0b1 # ← α\n", 186 | " Status = Status & Mask[Index(Text[i])] # ← β\n", 187 | " print(i, bin(Mask[Index(Text[i])]), bin(Status)) # βの後のデータを表示\n", 188 | " if Status & Goal != 0b0:\n", 189 | " return (i - PatLen + 2)\n", 190 | " return -1" 191 | ] 192 | }, 193 | { 194 | "cell_type": "code", 195 | "execution_count": 8, 196 | "metadata": {}, 197 | "outputs": [ 198 | { 199 | "name": "stdout", 200 | "output_type": "stream", 201 | "text": [ 202 | "1 0b10101 0b1\n", 203 | "2 0b10101 0b1\n", 204 | "3 0b10 0b10\n", 205 | "4 0b101000 0b0\n", 206 | "5 0b101000 0b0\n", 207 | "6 0b10101 0b1\n", 208 | "7 0b10101 0b1\n", 209 | "8 0b10 0b10\n", 210 | "9 0b10101 0b101\n", 211 | "10 0b101000 0b1000\n", 212 | "11 0b10101 0b10001\n", 213 | "12 0b101000 0b100000\n" 214 | ] 215 | }, 216 | { 217 | "data": { 218 | "text/plain": [ 219 | "7" 220 | ] 221 | }, 222 | "execution_count": 8, 223 | "metadata": {}, 224 | "output_type": "execute_result" 225 | } 226 | ], 227 | "source": [ 228 | "BitapMatch(Text, Pat)" 229 | ] 230 | }, 231 | { 232 | "cell_type": "markdown", 233 | "metadata": {}, 234 | "source": [ 235 | "#### 〔プログラム3〕" 236 | ] 237 | }, 238 | { 239 | "cell_type": "code", 240 | "execution_count": 9, 241 | "metadata": {}, 242 | "outputs": [], 243 | "source": [ 244 | "def GenerateBitMaskRegex(Pat, Mask):\n", 245 | " OriginalPatLen = len(Pat)\n", 246 | " PatLen = 0\n", 247 | " Mode = 0\n", 248 | " for i in range(1, 27):\n", 249 | " Mask[i] = 0b0 # 初期化\n", 250 | " for i in range(1, OriginalPatLen):\n", 251 | " if Pat[i] == \"[\":\n", 252 | " Mode = 1\n", 253 | " PatLen = PatLen + 1\n", 254 | " elif Pat[i] == \"]\":\n", 255 | " Mode = 0\n", 256 | " else:\n", 257 | " if Mode == 0:\n", 258 | " PatLen += 1\n", 259 | " Mask[Index(Pat[i])] = 0b1 << (PatLen - 1) | Mask[Index(Pat[i])]\n", 260 | " return PatLen " 261 | ] 262 | }, 263 | { 264 | "cell_type": "markdown", 265 | "metadata": {}, 266 | "source": [ 267 | "設問3の値を設定" 268 | ] 269 | }, 270 | { 271 | "cell_type": "code", 272 | "execution_count": 10, 273 | "metadata": {}, 274 | "outputs": [], 275 | "source": [ 276 | "Pat = \" AC[BA]A[ABC]A\"" 277 | ] 278 | }, 279 | { 280 | "cell_type": "code", 281 | "execution_count": 11, 282 | "metadata": {}, 283 | "outputs": [ 284 | { 285 | "data": { 286 | "text/plain": [ 287 | "6" 288 | ] 289 | }, 290 | "execution_count": 11, 291 | "metadata": {}, 292 | "output_type": "execute_result" 293 | } 294 | ], 295 | "source": [ 296 | "GenerateBitMaskRegex(Pat, Mask)" 297 | ] 298 | }, 299 | { 300 | "cell_type": "code", 301 | "execution_count": 12, 302 | "metadata": {}, 303 | "outputs": [ 304 | { 305 | "data": { 306 | "text/plain": [ 307 | "'0b111101'" 308 | ] 309 | }, 310 | "execution_count": 12, 311 | "metadata": {}, 312 | "output_type": "execute_result" 313 | } 314 | ], 315 | "source": [ 316 | "bin(Mask[1])" 317 | ] 318 | }, 319 | { 320 | "cell_type": "code", 321 | "execution_count": null, 322 | "metadata": {}, 323 | "outputs": [], 324 | "source": [] 325 | } 326 | ], 327 | "metadata": { 328 | "kernelspec": { 329 | "display_name": "Python 3", 330 | "language": "python", 331 | "name": "python3" 332 | }, 333 | "language_info": { 334 | "codemirror_mode": { 335 | "name": "ipython", 336 | "version": 3 337 | }, 338 | "file_extension": ".py", 339 | "mimetype": "text/x-python", 340 | "name": "python", 341 | "nbconvert_exporter": "python", 342 | "pygments_lexer": "ipython3", 343 | "version": "3.8.5" 344 | } 345 | }, 346 | "nbformat": 4, 347 | "nbformat_minor": 2 348 | } 349 | -------------------------------------------------------------------------------- /first_edition/6-1-1_FER01aki_PM_8_python.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "### 6-1-1 予想問題1 \n", 8 | "(令和元年秋 基本情報技術者試験 午後 問8(アルゴリズム)改)" 9 | ] 10 | }, 11 | { 12 | "cell_type": "markdown", 13 | "metadata": {}, 14 | "source": [ 15 | "関数Indexを用意(問題文には記載なし)" 16 | ] 17 | }, 18 | { 19 | "cell_type": "code", 20 | "execution_count": 1, 21 | "metadata": {}, 22 | "outputs": [], 23 | "source": [ 24 | "def Index(char):\n", 25 | " alphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n", 26 | " return alphabet.index(char[0]) + 1" 27 | ] 28 | }, 29 | { 30 | "cell_type": "markdown", 31 | "metadata": {}, 32 | "source": [ 33 | "#### 〔プログラム1〕" 34 | ] 35 | }, 36 | { 37 | "cell_type": "code", 38 | "execution_count": 2, 39 | "metadata": {}, 40 | "outputs": [], 41 | "source": [ 42 | "def GenerateBitMask(Pat, Mask):\n", 43 | " PatLen = len(Pat)\n", 44 | " for i in range(1, 27):\n", 45 | " Mask[i] = 0b0 # 初期化\n", 46 | " for i in range(1, PatLen):\n", 47 | " Mask[Index(Pat[i])] = 0b1 << (i - 1) | Mask[Index(Pat[i])]\n", 48 | " return PatLen" 49 | ] 50 | }, 51 | { 52 | "cell_type": "markdown", 53 | "metadata": {}, 54 | "source": [ 55 | "図1の「対象文字列と検索文字列の格納例」の値を設定" 56 | ] 57 | }, 58 | { 59 | "cell_type": "code", 60 | "execution_count": 3, 61 | "metadata": {}, 62 | "outputs": [], 63 | "source": [ 64 | "Mask = [0b0] * 27\n", 65 | "Text = \" AACBBAACABABAB\"\n", 66 | "Pat = \" ACABAB\"" 67 | ] 68 | }, 69 | { 70 | "cell_type": "markdown", 71 | "metadata": {}, 72 | "source": [ 73 | "図1の値でGenerateBitMaskを実行" 74 | ] 75 | }, 76 | { 77 | "cell_type": "code", 78 | "execution_count": 4, 79 | "metadata": {}, 80 | "outputs": [ 81 | { 82 | "data": { 83 | "text/plain": [ 84 | "7" 85 | ] 86 | }, 87 | "execution_count": 4, 88 | "metadata": {}, 89 | "output_type": "execute_result" 90 | } 91 | ], 92 | "source": [ 93 | "GenerateBitMask(Pat, Mask)" 94 | ] 95 | }, 96 | { 97 | "cell_type": "code", 98 | "execution_count": 5, 99 | "metadata": {}, 100 | "outputs": [ 101 | { 102 | "data": { 103 | "text/plain": [ 104 | "40" 105 | ] 106 | }, 107 | "execution_count": 5, 108 | "metadata": {}, 109 | "output_type": "execute_result" 110 | } 111 | ], 112 | "source": [ 113 | "Mask[Index(Pat[6])]" 114 | ] 115 | }, 116 | { 117 | "cell_type": "markdown", 118 | "metadata": {}, 119 | "source": [ 120 | "図2 Maskの値を順に表示(2進数16桁に変換)" 121 | ] 122 | }, 123 | { 124 | "cell_type": "code", 125 | "execution_count": 6, 126 | "metadata": {}, 127 | "outputs": [ 128 | { 129 | "name": "stdout", 130 | "output_type": "stream", 131 | "text": [ 132 | "Mask[ 1] 0000000000010101\n", 133 | "Mask[ 2] 0000000000101000\n", 134 | "Mask[ 3] 0000000000000010\n", 135 | "Mask[ 4] 0000000000000000\n", 136 | "Mask[ 5] 0000000000000000\n", 137 | "Mask[ 6] 0000000000000000\n", 138 | "Mask[ 7] 0000000000000000\n", 139 | "Mask[ 8] 0000000000000000\n", 140 | "Mask[ 9] 0000000000000000\n", 141 | "Mask[10] 0000000000000000\n", 142 | "Mask[11] 0000000000000000\n", 143 | "Mask[12] 0000000000000000\n", 144 | "Mask[13] 0000000000000000\n", 145 | "Mask[14] 0000000000000000\n", 146 | "Mask[15] 0000000000000000\n", 147 | "Mask[16] 0000000000000000\n", 148 | "Mask[17] 0000000000000000\n", 149 | "Mask[18] 0000000000000000\n", 150 | "Mask[19] 0000000000000000\n", 151 | "Mask[20] 0000000000000000\n", 152 | "Mask[21] 0000000000000000\n", 153 | "Mask[22] 0000000000000000\n", 154 | "Mask[23] 0000000000000000\n", 155 | "Mask[24] 0000000000000000\n", 156 | "Mask[25] 0000000000000000\n", 157 | "Mask[26] 0000000000000000\n" 158 | ] 159 | } 160 | ], 161 | "source": [ 162 | "for i in range(1, 27):\n", 163 | " print('Mask[{:2d}] {:016b}'.format(i, Mask[i]))" 164 | ] 165 | }, 166 | { 167 | "cell_type": "markdown", 168 | "metadata": {}, 169 | "source": [ 170 | "#### 〔プログラム2〕" 171 | ] 172 | }, 173 | { 174 | "cell_type": "code", 175 | "execution_count": 7, 176 | "metadata": {}, 177 | "outputs": [], 178 | "source": [ 179 | "def BitapMatch(Text, Pat):\n", 180 | " TextLen = len(Text)\n", 181 | " PatLen = GenerateBitMask(Pat, Mask)\n", 182 | " Status = 0b0\n", 183 | " Goal = 0b1 << (PatLen - 2)\n", 184 | " for i in range(1, TextLen):\n", 185 | " Status = Status << 1 | 0b1 # ← α\n", 186 | " Status = Status & Mask[Index(Text[i])] # ← β\n", 187 | " print(i, bin(Mask[Index(Text[i])]), bin(Status)) # βの後のデータを表示\n", 188 | " if Status & Goal != 0b0:\n", 189 | " return (i - PatLen + 2)\n", 190 | " return -1" 191 | ] 192 | }, 193 | { 194 | "cell_type": "code", 195 | "execution_count": 8, 196 | "metadata": {}, 197 | "outputs": [ 198 | { 199 | "name": "stdout", 200 | "output_type": "stream", 201 | "text": [ 202 | "1 0b10101 0b1\n", 203 | "2 0b10101 0b1\n", 204 | "3 0b10 0b10\n", 205 | "4 0b101000 0b0\n", 206 | "5 0b101000 0b0\n", 207 | "6 0b10101 0b1\n", 208 | "7 0b10101 0b1\n", 209 | "8 0b10 0b10\n", 210 | "9 0b10101 0b101\n", 211 | "10 0b101000 0b1000\n", 212 | "11 0b10101 0b10001\n", 213 | "12 0b101000 0b100000\n" 214 | ] 215 | }, 216 | { 217 | "data": { 218 | "text/plain": [ 219 | "7" 220 | ] 221 | }, 222 | "execution_count": 8, 223 | "metadata": {}, 224 | "output_type": "execute_result" 225 | } 226 | ], 227 | "source": [ 228 | "BitapMatch(Text, Pat)" 229 | ] 230 | }, 231 | { 232 | "cell_type": "markdown", 233 | "metadata": {}, 234 | "source": [ 235 | "#### 〔プログラム3〕" 236 | ] 237 | }, 238 | { 239 | "cell_type": "code", 240 | "execution_count": 9, 241 | "metadata": {}, 242 | "outputs": [], 243 | "source": [ 244 | "def GenerateBitMaskRegex(Pat, Mask):\n", 245 | " OriginalPatLen = len(Pat)\n", 246 | " PatLen = 0\n", 247 | " Mode = 0\n", 248 | " for i in range(1, 27):\n", 249 | " Mask[i] = 0b0 # 初期化\n", 250 | " for i in range(1, OriginalPatLen):\n", 251 | " if Pat[i] == \"[\":\n", 252 | " Mode = 1\n", 253 | " PatLen = PatLen + 1\n", 254 | " elif Pat[i] == \"]\":\n", 255 | " Mode = 0\n", 256 | " else:\n", 257 | " if Mode == 0:\n", 258 | " PatLen += 1\n", 259 | " Mask[Index(Pat[i])] = 0b1 << (PatLen - 1) | Mask[Index(Pat[i])]\n", 260 | " return PatLen " 261 | ] 262 | }, 263 | { 264 | "cell_type": "markdown", 265 | "metadata": {}, 266 | "source": [ 267 | "設問3の値を設定" 268 | ] 269 | }, 270 | { 271 | "cell_type": "code", 272 | "execution_count": 10, 273 | "metadata": {}, 274 | "outputs": [], 275 | "source": [ 276 | "Pat = \" AC[BA]A[ABC]A\"" 277 | ] 278 | }, 279 | { 280 | "cell_type": "code", 281 | "execution_count": 11, 282 | "metadata": {}, 283 | "outputs": [ 284 | { 285 | "data": { 286 | "text/plain": [ 287 | "6" 288 | ] 289 | }, 290 | "execution_count": 11, 291 | "metadata": {}, 292 | "output_type": "execute_result" 293 | } 294 | ], 295 | "source": [ 296 | "GenerateBitMaskRegex(Pat, Mask)" 297 | ] 298 | }, 299 | { 300 | "cell_type": "code", 301 | "execution_count": 12, 302 | "metadata": {}, 303 | "outputs": [ 304 | { 305 | "data": { 306 | "text/plain": [ 307 | "'0b111101'" 308 | ] 309 | }, 310 | "execution_count": 12, 311 | "metadata": {}, 312 | "output_type": "execute_result" 313 | } 314 | ], 315 | "source": [ 316 | "bin(Mask[1])" 317 | ] 318 | }, 319 | { 320 | "cell_type": "code", 321 | "execution_count": null, 322 | "metadata": {}, 323 | "outputs": [], 324 | "source": [] 325 | } 326 | ], 327 | "metadata": { 328 | "kernelspec": { 329 | "display_name": "Python 3", 330 | "language": "python", 331 | "name": "python3" 332 | }, 333 | "language_info": { 334 | "codemirror_mode": { 335 | "name": "ipython", 336 | "version": 3 337 | }, 338 | "file_extension": ".py", 339 | "mimetype": "text/x-python", 340 | "name": "python", 341 | "nbconvert_exporter": "python", 342 | "pygments_lexer": "ipython3", 343 | "version": "3.7.6" 344 | } 345 | }, 346 | "nbformat": 4, 347 | "nbformat_minor": 2 348 | } 349 | -------------------------------------------------------------------------------- /7-1-2_FEH31haru_PM_9_python.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "### 7-1-2 予想問題2 \n", 8 | "(平成31年春 基本情報技術者試験 午後 問9(C)改)" 9 | ] 10 | }, 11 | { 12 | "cell_type": "markdown", 13 | "metadata": {}, 14 | "source": [ 15 | "#### 〔プログラム〕" 16 | ] 17 | }, 18 | { 19 | "cell_type": "code", 20 | "execution_count": 1, 21 | "metadata": {}, 22 | "outputs": [ 23 | { 24 | "name": "stdout", 25 | "output_type": "stream", 26 | "text": [ 27 | " 55 bytes processed\n", 28 | "\n", 29 | " 0 00 0 40 '@' 0 80 0 C0 \n", 30 | " 0 01 0 41 'A' 0 81 0 C1 \n", 31 | " 0 02 0 42 'B' 0 82 0 C2 \n", 32 | " 0 03 0 43 'C' 0 83 0 C3 \n", 33 | " 0 04 0 44 'D' 0 84 0 C4 \n", 34 | " 0 05 0 45 'E' 0 85 0 C5 \n", 35 | " 0 06 0 46 'F' 0 86 0 C6 \n", 36 | " 0 07 0 47 'G' 0 87 0 C7 \n", 37 | " 0 08 0 48 'H' 0 88 0 C8 \n", 38 | " 1 09 0 49 'I' 0 89 0 C9 \n", 39 | " 5 0A 0 4A 'J' 0 8A 0 CA \n", 40 | " 0 0B 0 4B 'K' 0 8B 0 CB \n", 41 | " 0 0C 0 4C 'L' 0 8C 0 CC \n", 42 | " 5 0D 0 4D 'M' 0 8D 0 CD \n", 43 | " 0 0E 0 4E 'N' 0 8E 0 CE \n", 44 | " 0 0F 0 4F 'O' 0 8F 0 CF \n", 45 | " 0 10 0 50 'P' 0 90 0 D0 \n", 46 | " 0 11 0 51 'Q' 0 91 0 D1 \n", 47 | " 0 12 0 52 'R' 0 92 0 D2 \n", 48 | " 0 13 0 53 'S' 0 93 0 D3 \n", 49 | " 0 14 0 54 'T' 0 94 0 D4 \n", 50 | " 0 15 0 55 'U' 0 95 0 D5 \n", 51 | " 0 16 0 56 'V' 0 96 0 D6 \n", 52 | " 0 17 0 57 'W' 0 97 0 D7 \n", 53 | " 0 18 0 58 'X' 0 98 0 D8 \n", 54 | " 0 19 0 59 'Y' 0 99 0 D9 \n", 55 | " 0 1A 0 5A 'Z' 0 9A 0 DA \n", 56 | " 0 1B 0 5B '[' 0 9B 0 DB \n", 57 | " 0 1C 1 5C '\\' 0 9C 0 DC \n", 58 | " 0 1D 0 5D ']' 0 9D 0 DD \n", 59 | " 0 1E 0 5E '^' 0 9E 0 DE \n", 60 | " 0 1F 0 5F '_' 0 9F 0 DF \n", 61 | " 3 20 ' ' 0 60 '`' 0 A0 0 E0 \n", 62 | " 0 21 '!' 1 61 'a' 0 A1 0 E1 \n", 63 | " 2 22 '\"' 0 62 'b' 0 A2 0 E2 \n", 64 | " 1 23 '#' 1 63 'c' 0 A3 0 E3 \n", 65 | " 0 24 '$' 2 64 'd' 0 A4 0 E4 \n", 66 | " 0 25 '%' 1 65 'e' 0 A5 0 E5 \n", 67 | " 0 26 '&' 1 66 'f' 0 A6 0 E6 \n", 68 | " 0 27 ''' 0 67 'g' 0 A7 0 E7 \n", 69 | " 2 28 '(' 1 68 'h' 0 A8 0 E8 \n", 70 | " 2 29 ')' 5 69 'i' 0 A9 0 E9 \n", 71 | " 0 2A '*' 0 6A 'j' 0 AA 0 EA \n", 72 | " 0 2B '+' 0 6B 'k' 0 AB 0 EB \n", 73 | " 0 2C ',' 1 6C 'l' 0 AC 0 EC \n", 74 | " 0 2D '-' 1 6D 'm' 0 AD 0 ED \n", 75 | " 1 2E '.' 5 6E 'n' 0 AE 0 EE \n", 76 | " 0 2F '/' 1 6F 'o' 0 AF 0 EF \n", 77 | " 0 30 '0' 1 70 'p' 0 B0 0 F0 \n", 78 | " 0 31 '1' 0 71 'q' 0 B1 0 F1 \n", 79 | " 0 32 '2' 1 72 'r' 0 B2 0 F2 \n", 80 | " 0 33 '3' 1 73 's' 0 B3 0 F3 \n", 81 | " 0 34 '4' 3 74 't' 0 B4 0 F4 \n", 82 | " 0 35 '5' 1 75 'u' 0 B5 0 F5 \n", 83 | " 0 36 '6' 0 76 'v' 0 B6 0 F6 \n", 84 | " 0 37 '7' 0 77 'w' 0 B7 0 F7 \n", 85 | " 0 38 '8' 0 78 'x' 0 B8 0 F8 \n", 86 | " 0 39 '9' 0 79 'y' 0 B9 0 F9 \n", 87 | " 0 3A ':' 0 7A 'z' 0 BA 0 FA \n", 88 | " 1 3B ';' 1 7B '{' 0 BB 0 FB \n", 89 | " 1 3C '<' 0 7C '|' 0 BC 0 FC \n", 90 | " 0 3D '=' 1 7D '}' 0 BD 0 FD \n", 91 | " 1 3E '>' 0 7E '~' 0 BE 0 FE \n", 92 | " 0 3F '?' 0 7F 0 BF 0 FF \n" 93 | ] 94 | } 95 | ], 96 | "source": [ 97 | "InName = \"sample.c\"\n", 98 | "\n", 99 | "freq = [0] * 256\n", 100 | "infile = open(InName, \"rb\")\n", 101 | "bdata = infile.read()\n", 102 | "\n", 103 | "cnt = 0\n", 104 | "for ch in bdata:\n", 105 | " cnt += 1\n", 106 | " freq[ch] += 1\n", 107 | "infile.close()\n", 108 | "\n", 109 | "print(\"{:10d} bytes processed\\n\".format(cnt))\n", 110 | "for i in range(64):\n", 111 | " for ch in range(i, i + 193, 64):\n", 112 | " if 0x20 <= ch and ch <= 0x7E:\n", 113 | " print(\" {:10d} {:02X} '{:c}'\".format(freq[ch], ch, ch), end = \"\")\n", 114 | " else:\n", 115 | " print(\" {:10d} {:02X} \".format(freq[ch], ch), end = \"\")\n", 116 | " print()" 117 | ] 118 | }, 119 | { 120 | "cell_type": "markdown", 121 | "metadata": {}, 122 | "source": [ 123 | "#### 〔整列処理部〕" 124 | ] 125 | }, 126 | { 127 | "cell_type": "code", 128 | "execution_count": 2, 129 | "metadata": {}, 130 | "outputs": [ 131 | { 132 | "name": "stdout", 133 | "output_type": "stream", 134 | "text": [ 135 | "\n", 136 | " 5 0A 0 27 ''' 0 80 0 C0 \n", 137 | " 5 0D 0 2A '*' 0 81 0 C1 \n", 138 | " 5 69 'i' 0 2B '+' 0 82 0 C2 \n", 139 | " 5 6E 'n' 0 2C ',' 0 83 0 C3 \n", 140 | " 3 20 ' ' 0 2D '-' 0 84 0 C4 \n", 141 | " 3 74 't' 0 2F '/' 0 85 0 C5 \n", 142 | " 2 22 '\"' 0 30 '0' 0 86 0 C6 \n", 143 | " 2 28 '(' 0 31 '1' 0 87 0 C7 \n", 144 | " 2 29 ')' 0 32 '2' 0 88 0 C8 \n", 145 | " 2 64 'd' 0 33 '3' 0 89 0 C9 \n", 146 | " 1 09 0 34 '4' 0 8A 0 CA \n", 147 | " 1 23 '#' 0 35 '5' 0 8B 0 CB \n", 148 | " 1 2E '.' 0 36 '6' 0 8C 0 CC \n", 149 | " 1 3B ';' 0 37 '7' 0 8D 0 CD \n", 150 | " 1 3C '<' 0 38 '8' 0 8E 0 CE \n", 151 | " 1 3E '>' 0 39 '9' 0 8F 0 CF \n", 152 | " 1 5C '\\' 0 3A ':' 0 90 0 D0 \n", 153 | " 1 61 'a' 0 3D '=' 0 91 0 D1 \n", 154 | " 1 63 'c' 0 3F '?' 0 92 0 D2 \n", 155 | " 1 65 'e' 0 40 '@' 0 93 0 D3 \n", 156 | " 1 66 'f' 0 41 'A' 0 94 0 D4 \n", 157 | " 1 68 'h' 0 42 'B' 0 95 0 D5 \n", 158 | " 1 6C 'l' 0 43 'C' 0 96 0 D6 \n", 159 | " 1 6D 'm' 0 44 'D' 0 97 0 D7 \n", 160 | " 1 6F 'o' 0 45 'E' 0 98 0 D8 \n", 161 | " 1 70 'p' 0 46 'F' 0 99 0 D9 \n", 162 | " 1 72 'r' 0 47 'G' 0 9A 0 DA \n", 163 | " 1 73 's' 0 48 'H' 0 9B 0 DB \n", 164 | " 1 75 'u' 0 49 'I' 0 9C 0 DC \n", 165 | " 1 7B '{' 0 4A 'J' 0 9D 0 DD \n", 166 | " 1 7D '}' 0 4B 'K' 0 9E 0 DE \n", 167 | " 0 00 0 4C 'L' 0 9F 0 DF \n", 168 | " 0 01 0 4D 'M' 0 A0 0 E0 \n", 169 | " 0 02 0 4E 'N' 0 A1 0 E1 \n", 170 | " 0 03 0 4F 'O' 0 A2 0 E2 \n", 171 | " 0 04 0 50 'P' 0 A3 0 E3 \n", 172 | " 0 05 0 51 'Q' 0 A4 0 E4 \n", 173 | " 0 06 0 52 'R' 0 A5 0 E5 \n", 174 | " 0 07 0 53 'S' 0 A6 0 E6 \n", 175 | " 0 08 0 54 'T' 0 A7 0 E7 \n", 176 | " 0 0B 0 55 'U' 0 A8 0 E8 \n", 177 | " 0 0C 0 56 'V' 0 A9 0 E9 \n", 178 | " 0 0E 0 57 'W' 0 AA 0 EA \n", 179 | " 0 0F 0 58 'X' 0 AB 0 EB \n", 180 | " 0 10 0 59 'Y' 0 AC 0 EC \n", 181 | " 0 11 0 5A 'Z' 0 AD 0 ED \n", 182 | " 0 12 0 5B '[' 0 AE 0 EE \n", 183 | " 0 13 0 5D ']' 0 AF 0 EF \n", 184 | " 0 14 0 5E '^' 0 B0 0 F0 \n", 185 | " 0 15 0 5F '_' 0 B1 0 F1 \n", 186 | " 0 16 0 60 '`' 0 B2 0 F2 \n", 187 | " 0 17 0 62 'b' 0 B3 0 F3 \n", 188 | " 0 18 0 67 'g' 0 B4 0 F4 \n", 189 | " 0 19 0 6A 'j' 0 B5 0 F5 \n", 190 | " 0 1A 0 6B 'k' 0 B6 0 F6 \n", 191 | " 0 1B 0 71 'q' 0 B7 0 F7 \n", 192 | " 0 1C 0 76 'v' 0 B8 0 F8 \n", 193 | " 0 1D 0 77 'w' 0 B9 0 F9 \n", 194 | " 0 1E 0 78 'x' 0 BA 0 FA \n", 195 | " 0 1F 0 79 'y' 0 BB 0 FB \n", 196 | " 0 21 '!' 0 7A 'z' 0 BC 0 FC \n", 197 | " 0 24 '$' 0 7C '|' 0 BD 0 FD \n", 198 | " 0 25 '%' 0 7E '~' 0 BE 0 FE \n", 199 | " 0 26 '&' 0 7F 0 BF 0 FF \n" 200 | ] 201 | } 202 | ], 203 | "source": [ 204 | "code = []\n", 205 | "for i in range(256):\n", 206 | " code.append(i)\n", 207 | "ih = 255\n", 208 | "while ih > 0:\n", 209 | " for i in range(ih):\n", 210 | " if freq[i] < freq[i+1]:\n", 211 | " code[i], code[i+1] = code[i+1], code[i]\n", 212 | " freq[i], freq[i+1] = freq[i+1], freq[i]\n", 213 | " ih -= 1\n", 214 | "print()\n", 215 | "for i in range(64):\n", 216 | " for ch in range(i, i + 193, 64):\n", 217 | " if 0x20 <= code[ch] and code[ch] <= 0x7E:\n", 218 | " print(\" {:10d} {:02X} '{:c}'\".format(freq[ch], code[ch], code[ch]), end = \"\")\n", 219 | " else:\n", 220 | " print(\" {:10d} {:02X} \".format(freq[ch], code[ch]), end = \"\")\n", 221 | " print()" 222 | ] 223 | }, 224 | { 225 | "cell_type": "code", 226 | "execution_count": null, 227 | "metadata": {}, 228 | "outputs": [], 229 | "source": [] 230 | } 231 | ], 232 | "metadata": { 233 | "kernelspec": { 234 | "display_name": "Python 3", 235 | "language": "python", 236 | "name": "python3" 237 | }, 238 | "language_info": { 239 | "codemirror_mode": { 240 | "name": "ipython", 241 | "version": 3 242 | }, 243 | "file_extension": ".py", 244 | "mimetype": "text/x-python", 245 | "name": "python", 246 | "nbconvert_exporter": "python", 247 | "pygments_lexer": "ipython3", 248 | "version": "3.8.5" 249 | } 250 | }, 251 | "nbformat": 4, 252 | "nbformat_minor": 2 253 | } 254 | -------------------------------------------------------------------------------- /first_edition/6-1-2_FEH31haru_PM_9_python.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "### 6-1-2 予想問題2 \n", 8 | "(平成31年春 基本情報技術者試験 午後 問9(C)改)" 9 | ] 10 | }, 11 | { 12 | "cell_type": "markdown", 13 | "metadata": {}, 14 | "source": [ 15 | "#### 〔プログラム〕" 16 | ] 17 | }, 18 | { 19 | "cell_type": "code", 20 | "execution_count": 1, 21 | "metadata": {}, 22 | "outputs": [ 23 | { 24 | "name": "stdout", 25 | "output_type": "stream", 26 | "text": [ 27 | " 55 bytes processed\n", 28 | "\n", 29 | " 0 00 0 40 '@' 0 80 0 C0 \n", 30 | " 0 01 0 41 'A' 0 81 0 C1 \n", 31 | " 0 02 0 42 'B' 0 82 0 C2 \n", 32 | " 0 03 0 43 'C' 0 83 0 C3 \n", 33 | " 0 04 0 44 'D' 0 84 0 C4 \n", 34 | " 0 05 0 45 'E' 0 85 0 C5 \n", 35 | " 0 06 0 46 'F' 0 86 0 C6 \n", 36 | " 0 07 0 47 'G' 0 87 0 C7 \n", 37 | " 0 08 0 48 'H' 0 88 0 C8 \n", 38 | " 1 09 0 49 'I' 0 89 0 C9 \n", 39 | " 5 0A 0 4A 'J' 0 8A 0 CA \n", 40 | " 0 0B 0 4B 'K' 0 8B 0 CB \n", 41 | " 0 0C 0 4C 'L' 0 8C 0 CC \n", 42 | " 5 0D 0 4D 'M' 0 8D 0 CD \n", 43 | " 0 0E 0 4E 'N' 0 8E 0 CE \n", 44 | " 0 0F 0 4F 'O' 0 8F 0 CF \n", 45 | " 0 10 0 50 'P' 0 90 0 D0 \n", 46 | " 0 11 0 51 'Q' 0 91 0 D1 \n", 47 | " 0 12 0 52 'R' 0 92 0 D2 \n", 48 | " 0 13 0 53 'S' 0 93 0 D3 \n", 49 | " 0 14 0 54 'T' 0 94 0 D4 \n", 50 | " 0 15 0 55 'U' 0 95 0 D5 \n", 51 | " 0 16 0 56 'V' 0 96 0 D6 \n", 52 | " 0 17 0 57 'W' 0 97 0 D7 \n", 53 | " 0 18 0 58 'X' 0 98 0 D8 \n", 54 | " 0 19 0 59 'Y' 0 99 0 D9 \n", 55 | " 0 1A 0 5A 'Z' 0 9A 0 DA \n", 56 | " 0 1B 0 5B '[' 0 9B 0 DB \n", 57 | " 0 1C 1 5C '\\' 0 9C 0 DC \n", 58 | " 0 1D 0 5D ']' 0 9D 0 DD \n", 59 | " 0 1E 0 5E '^' 0 9E 0 DE \n", 60 | " 0 1F 0 5F '_' 0 9F 0 DF \n", 61 | " 3 20 ' ' 0 60 '`' 0 A0 0 E0 \n", 62 | " 0 21 '!' 1 61 'a' 0 A1 0 E1 \n", 63 | " 2 22 '\"' 0 62 'b' 0 A2 0 E2 \n", 64 | " 1 23 '#' 1 63 'c' 0 A3 0 E3 \n", 65 | " 0 24 '$' 2 64 'd' 0 A4 0 E4 \n", 66 | " 0 25 '%' 1 65 'e' 0 A5 0 E5 \n", 67 | " 0 26 '&' 1 66 'f' 0 A6 0 E6 \n", 68 | " 0 27 ''' 0 67 'g' 0 A7 0 E7 \n", 69 | " 2 28 '(' 1 68 'h' 0 A8 0 E8 \n", 70 | " 2 29 ')' 5 69 'i' 0 A9 0 E9 \n", 71 | " 0 2A '*' 0 6A 'j' 0 AA 0 EA \n", 72 | " 0 2B '+' 0 6B 'k' 0 AB 0 EB \n", 73 | " 0 2C ',' 1 6C 'l' 0 AC 0 EC \n", 74 | " 0 2D '-' 1 6D 'm' 0 AD 0 ED \n", 75 | " 1 2E '.' 5 6E 'n' 0 AE 0 EE \n", 76 | " 0 2F '/' 1 6F 'o' 0 AF 0 EF \n", 77 | " 0 30 '0' 1 70 'p' 0 B0 0 F0 \n", 78 | " 0 31 '1' 0 71 'q' 0 B1 0 F1 \n", 79 | " 0 32 '2' 1 72 'r' 0 B2 0 F2 \n", 80 | " 0 33 '3' 1 73 's' 0 B3 0 F3 \n", 81 | " 0 34 '4' 3 74 't' 0 B4 0 F4 \n", 82 | " 0 35 '5' 1 75 'u' 0 B5 0 F5 \n", 83 | " 0 36 '6' 0 76 'v' 0 B6 0 F6 \n", 84 | " 0 37 '7' 0 77 'w' 0 B7 0 F7 \n", 85 | " 0 38 '8' 0 78 'x' 0 B8 0 F8 \n", 86 | " 0 39 '9' 0 79 'y' 0 B9 0 F9 \n", 87 | " 0 3A ':' 0 7A 'z' 0 BA 0 FA \n", 88 | " 1 3B ';' 1 7B '{' 0 BB 0 FB \n", 89 | " 1 3C '<' 0 7C '|' 0 BC 0 FC \n", 90 | " 0 3D '=' 1 7D '}' 0 BD 0 FD \n", 91 | " 1 3E '>' 0 7E '~' 0 BE 0 FE \n", 92 | " 0 3F '?' 0 7F 0 BF 0 FF \n" 93 | ] 94 | } 95 | ], 96 | "source": [ 97 | "InName = \"sample.c\"\n", 98 | "\n", 99 | "freq = [0] * 256\n", 100 | "infile = open(InName, \"rb\")\n", 101 | "bdata = infile.read()\n", 102 | "\n", 103 | "cnt = 0\n", 104 | "for ch in bdata:\n", 105 | " cnt += 1\n", 106 | " freq[ch] += 1\n", 107 | "infile.close()\n", 108 | "\n", 109 | "print(\"{:10d} bytes processed\\n\".format(cnt))\n", 110 | "for i in range(64):\n", 111 | " for ch in range(i, i + 193, 64):\n", 112 | " if 0x20 <= ch and ch <= 0x7E:\n", 113 | " print(\" {:10d} {:02X} '{:c}'\".format(freq[ch], ch, ch), end = \"\")\n", 114 | " else:\n", 115 | " print(\" {:10d} {:02X} \".format(freq[ch], ch), end = \"\")\n", 116 | " print()" 117 | ] 118 | }, 119 | { 120 | "cell_type": "markdown", 121 | "metadata": {}, 122 | "source": [ 123 | "#### 〔整列処理部〕" 124 | ] 125 | }, 126 | { 127 | "cell_type": "code", 128 | "execution_count": 2, 129 | "metadata": {}, 130 | "outputs": [ 131 | { 132 | "name": "stdout", 133 | "output_type": "stream", 134 | "text": [ 135 | "\n", 136 | " 5 0A 0 27 ''' 0 80 0 C0 \n", 137 | " 5 0D 0 2A '*' 0 81 0 C1 \n", 138 | " 5 69 'i' 0 2B '+' 0 82 0 C2 \n", 139 | " 5 6E 'n' 0 2C ',' 0 83 0 C3 \n", 140 | " 3 20 ' ' 0 2D '-' 0 84 0 C4 \n", 141 | " 3 74 't' 0 2F '/' 0 85 0 C5 \n", 142 | " 2 22 '\"' 0 30 '0' 0 86 0 C6 \n", 143 | " 2 28 '(' 0 31 '1' 0 87 0 C7 \n", 144 | " 2 29 ')' 0 32 '2' 0 88 0 C8 \n", 145 | " 2 64 'd' 0 33 '3' 0 89 0 C9 \n", 146 | " 1 09 0 34 '4' 0 8A 0 CA \n", 147 | " 1 23 '#' 0 35 '5' 0 8B 0 CB \n", 148 | " 1 2E '.' 0 36 '6' 0 8C 0 CC \n", 149 | " 1 3B ';' 0 37 '7' 0 8D 0 CD \n", 150 | " 1 3C '<' 0 38 '8' 0 8E 0 CE \n", 151 | " 1 3E '>' 0 39 '9' 0 8F 0 CF \n", 152 | " 1 5C '\\' 0 3A ':' 0 90 0 D0 \n", 153 | " 1 61 'a' 0 3D '=' 0 91 0 D1 \n", 154 | " 1 63 'c' 0 3F '?' 0 92 0 D2 \n", 155 | " 1 65 'e' 0 40 '@' 0 93 0 D3 \n", 156 | " 1 66 'f' 0 41 'A' 0 94 0 D4 \n", 157 | " 1 68 'h' 0 42 'B' 0 95 0 D5 \n", 158 | " 1 6C 'l' 0 43 'C' 0 96 0 D6 \n", 159 | " 1 6D 'm' 0 44 'D' 0 97 0 D7 \n", 160 | " 1 6F 'o' 0 45 'E' 0 98 0 D8 \n", 161 | " 1 70 'p' 0 46 'F' 0 99 0 D9 \n", 162 | " 1 72 'r' 0 47 'G' 0 9A 0 DA \n", 163 | " 1 73 's' 0 48 'H' 0 9B 0 DB \n", 164 | " 1 75 'u' 0 49 'I' 0 9C 0 DC \n", 165 | " 1 7B '{' 0 4A 'J' 0 9D 0 DD \n", 166 | " 1 7D '}' 0 4B 'K' 0 9E 0 DE \n", 167 | " 0 00 0 4C 'L' 0 9F 0 DF \n", 168 | " 0 01 0 4D 'M' 0 A0 0 E0 \n", 169 | " 0 02 0 4E 'N' 0 A1 0 E1 \n", 170 | " 0 03 0 4F 'O' 0 A2 0 E2 \n", 171 | " 0 04 0 50 'P' 0 A3 0 E3 \n", 172 | " 0 05 0 51 'Q' 0 A4 0 E4 \n", 173 | " 0 06 0 52 'R' 0 A5 0 E5 \n", 174 | " 0 07 0 53 'S' 0 A6 0 E6 \n", 175 | " 0 08 0 54 'T' 0 A7 0 E7 \n", 176 | " 0 0B 0 55 'U' 0 A8 0 E8 \n", 177 | " 0 0C 0 56 'V' 0 A9 0 E9 \n", 178 | " 0 0E 0 57 'W' 0 AA 0 EA \n", 179 | " 0 0F 0 58 'X' 0 AB 0 EB \n", 180 | " 0 10 0 59 'Y' 0 AC 0 EC \n", 181 | " 0 11 0 5A 'Z' 0 AD 0 ED \n", 182 | " 0 12 0 5B '[' 0 AE 0 EE \n", 183 | " 0 13 0 5D ']' 0 AF 0 EF \n", 184 | " 0 14 0 5E '^' 0 B0 0 F0 \n", 185 | " 0 15 0 5F '_' 0 B1 0 F1 \n", 186 | " 0 16 0 60 '`' 0 B2 0 F2 \n", 187 | " 0 17 0 62 'b' 0 B3 0 F3 \n", 188 | " 0 18 0 67 'g' 0 B4 0 F4 \n", 189 | " 0 19 0 6A 'j' 0 B5 0 F5 \n", 190 | " 0 1A 0 6B 'k' 0 B6 0 F6 \n", 191 | " 0 1B 0 71 'q' 0 B7 0 F7 \n", 192 | " 0 1C 0 76 'v' 0 B8 0 F8 \n", 193 | " 0 1D 0 77 'w' 0 B9 0 F9 \n", 194 | " 0 1E 0 78 'x' 0 BA 0 FA \n", 195 | " 0 1F 0 79 'y' 0 BB 0 FB \n", 196 | " 0 21 '!' 0 7A 'z' 0 BC 0 FC \n", 197 | " 0 24 '$' 0 7C '|' 0 BD 0 FD \n", 198 | " 0 25 '%' 0 7E '~' 0 BE 0 FE \n", 199 | " 0 26 '&' 0 7F 0 BF 0 FF \n" 200 | ] 201 | } 202 | ], 203 | "source": [ 204 | "code = []\n", 205 | "for i in range(256):\n", 206 | " code.append(i)\n", 207 | "ih = 255\n", 208 | "while ih > 0:\n", 209 | " for i in range(ih):\n", 210 | " if freq[i] < freq[i+1]:\n", 211 | " code[i], code[i+1] = code[i+1], code[i]\n", 212 | " freq[i], freq[i+1] = freq[i+1], freq[i]\n", 213 | " ih -= 1\n", 214 | "print()\n", 215 | "for i in range(64):\n", 216 | " for ch in range(i, i + 193, 64):\n", 217 | " if 0x20 <= code[ch] and code[ch] <= 0x7E:\n", 218 | " print(\" {:10d} {:02X} '{:c}'\".format(freq[ch], code[ch], code[ch]), end = \"\")\n", 219 | " else:\n", 220 | " print(\" {:10d} {:02X} \".format(freq[ch], code[ch]), end = \"\")\n", 221 | " print()" 222 | ] 223 | }, 224 | { 225 | "cell_type": "code", 226 | "execution_count": null, 227 | "metadata": {}, 228 | "outputs": [], 229 | "source": [] 230 | } 231 | ], 232 | "metadata": { 233 | "kernelspec": { 234 | "display_name": "Python 3", 235 | "language": "python", 236 | "name": "python3" 237 | }, 238 | "language_info": { 239 | "codemirror_mode": { 240 | "name": "ipython", 241 | "version": 3 242 | }, 243 | "file_extension": ".py", 244 | "mimetype": "text/x-python", 245 | "name": "python", 246 | "nbconvert_exporter": "python", 247 | "pygments_lexer": "ipython3", 248 | "version": "3.8.5" 249 | } 250 | }, 251 | "nbformat": 4, 252 | "nbformat_minor": 2 253 | } -------------------------------------------------------------------------------- /Chapter5_Python_Text.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "### Python教科書 5章プログラム例" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "#### 5-1-2 データ構造の表現\n", 15 | "Pythonでのキューの表現" 16 | ] 17 | }, 18 | { 19 | "cell_type": "code", 20 | "execution_count": 1, 21 | "metadata": {}, 22 | "outputs": [ 23 | { 24 | "data": { 25 | "text/plain": [ 26 | "deque(['A', 'B', 'C'])" 27 | ] 28 | }, 29 | "execution_count": 1, 30 | "metadata": {}, 31 | "output_type": "execute_result" 32 | } 33 | ], 34 | "source": [ 35 | "from collections import deque\n", 36 | "\n", 37 | "Q = deque() # deque型のインスタンスQを作成\n", 38 | "Q.append('A')\n", 39 | "Q.append('B')\n", 40 | "Q.append('C')\n", 41 | "Q" 42 | ] 43 | }, 44 | { 45 | "cell_type": "code", 46 | "execution_count": 2, 47 | "metadata": {}, 48 | "outputs": [ 49 | { 50 | "data": { 51 | "text/plain": [ 52 | "'A'" 53 | ] 54 | }, 55 | "execution_count": 2, 56 | "metadata": {}, 57 | "output_type": "execute_result" 58 | } 59 | ], 60 | "source": [ 61 | "Q.popleft()" 62 | ] 63 | }, 64 | { 65 | "cell_type": "code", 66 | "execution_count": 3, 67 | "metadata": {}, 68 | "outputs": [ 69 | { 70 | "data": { 71 | "text/plain": [ 72 | "deque(['B', 'C'])" 73 | ] 74 | }, 75 | "execution_count": 3, 76 | "metadata": {}, 77 | "output_type": "execute_result" 78 | } 79 | ], 80 | "source": [ 81 | "Q" 82 | ] 83 | }, 84 | { 85 | "cell_type": "markdown", 86 | "metadata": {}, 87 | "source": [ 88 | "隣接行列" 89 | ] 90 | }, 91 | { 92 | "cell_type": "code", 93 | "execution_count": 4, 94 | "metadata": {}, 95 | "outputs": [], 96 | "source": [ 97 | "graph = [[0, 1, 1, 1],\n", 98 | " [1, 0, 1, 0],\n", 99 | " [1, 1, 0, 0],\n", 100 | " [1, 0, 0, 0]]" 101 | ] 102 | }, 103 | { 104 | "cell_type": "markdown", 105 | "metadata": {}, 106 | "source": [ 107 | "隣接グラフ" 108 | ] 109 | }, 110 | { 111 | "cell_type": "code", 112 | "execution_count": 5, 113 | "metadata": {}, 114 | "outputs": [], 115 | "source": [ 116 | "graph = [['B', 'C', 'D'],\n", 117 | " ['A', 'C'],\n", 118 | " ['A', 'B'],\n", 119 | " ['A']]" 120 | ] 121 | }, 122 | { 123 | "cell_type": "markdown", 124 | "metadata": {}, 125 | "source": [ 126 | "#### 5-2-2 探索・整列のアルゴリズム" 127 | ] 128 | }, 129 | { 130 | "cell_type": "markdown", 131 | "metadata": {}, 132 | "source": [ 133 | "【例】線形探索を行う関数search()" 134 | ] 135 | }, 136 | { 137 | "cell_type": "code", 138 | "execution_count": 6, 139 | "metadata": {}, 140 | "outputs": [], 141 | "source": [ 142 | "def search(data, target):\n", 143 | " for i in range(len(data)): # 先頭から順番に探索\n", 144 | " if data[i] == target: # 見つかったときにはその位置iを返す\n", 145 | " return i\n", 146 | " return -1 # 見つからないときは-1を返す" 147 | ] 148 | }, 149 | { 150 | "cell_type": "markdown", 151 | "metadata": {}, 152 | "source": [ 153 | "【例】関数search()の実行" 154 | ] 155 | }, 156 | { 157 | "cell_type": "code", 158 | "execution_count": 7, 159 | "metadata": {}, 160 | "outputs": [ 161 | { 162 | "name": "stdout", 163 | "output_type": "stream", 164 | "text": [ 165 | "要素番号8にデータ9を見つけました。\n" 166 | ] 167 | } 168 | ], 169 | "source": [ 170 | "data = [1, 2, 3, 4, 5, 6, 7, 8, 9]\n", 171 | "target = 9\n", 172 | "print(\"要素番号{}にデータ{}を見つけました。\".format(search(data, target), target))" 173 | ] 174 | }, 175 | { 176 | "cell_type": "markdown", 177 | "metadata": {}, 178 | "source": [ 179 | "【例】2分探索を行う関数search()" 180 | ] 181 | }, 182 | { 183 | "cell_type": "code", 184 | "execution_count": 8, 185 | "metadata": {}, 186 | "outputs": [], 187 | "source": [ 188 | "def search(data, target):\n", 189 | " start, end = 0, len(data)-1 # 探索するデータの始点startと終点endを設定\n", 190 | " while start <= end: # 探索するデータがある間は繰り返す\n", 191 | " i = (start + end) // 2 # 真ん中のデータをiとする\n", 192 | " if data[i] == target: # 見つかったときにはその位置iを返す\n", 193 | " return i\n", 194 | " elif data[i] < target: # targetの値の方が大きい場合は後のグループを探索\n", 195 | " start = i + 1\n", 196 | " else: # そうでない合は前のグループを探索\n", 197 | " end = i - 1\n", 198 | " return -1 # 見つからないときは-1を返す" 199 | ] 200 | }, 201 | { 202 | "cell_type": "markdown", 203 | "metadata": {}, 204 | "source": [ 205 | "【例】バブルソートを行う関数sort()" 206 | ] 207 | }, 208 | { 209 | "cell_type": "code", 210 | "execution_count": 9, 211 | "metadata": {}, 212 | "outputs": [], 213 | "source": [ 214 | "def sort(data):\n", 215 | " for i in range(len(data)-1, 0, -1): # 後ろから順に比較していく\n", 216 | " for j in range(i): # 未整列の部分を比較\n", 217 | " if data[j] > data[j+1]: # 隣り合う要素で前の方が大きい場合\n", 218 | " data[j], data[j+1] = data[j+1], data[j] # 要素を入れ替える" 219 | ] 220 | }, 221 | { 222 | "cell_type": "markdown", 223 | "metadata": {}, 224 | "source": [ 225 | "【例】関数sort() の実行" 226 | ] 227 | }, 228 | { 229 | "cell_type": "code", 230 | "execution_count": 10, 231 | "metadata": {}, 232 | "outputs": [ 233 | { 234 | "name": "stdout", 235 | "output_type": "stream", 236 | "text": [ 237 | "[1, 1, 2, 2, 3, 3, 3, 4, 4, 4, 9]\n" 238 | ] 239 | } 240 | ], 241 | "source": [ 242 | "data = [4, 3, 2, 3, 4, 2, 1, 3, 4, 1, 9]\n", 243 | "sort(data)\n", 244 | "print(data)" 245 | ] 246 | }, 247 | { 248 | "cell_type": "markdown", 249 | "metadata": {}, 250 | "source": [ 251 | "【例】挿入ソートを行う関数sort()" 252 | ] 253 | }, 254 | { 255 | "cell_type": "code", 256 | "execution_count": 11, 257 | "metadata": {}, 258 | "outputs": [], 259 | "source": [ 260 | "def sort(data):\n", 261 | " for i in range(0, len(data)): # 最初から順に整列させていく\n", 262 | " for j in range(i-1, -1, -1): # 一番後ろの要素を挿入する場所を探す\n", 263 | " if data[j] > data[j+1]: # 隣り合う要素で前の方が大きい場合\n", 264 | " data[j], data[j+1] = data[j+1], data[j] # 要素を入れ替える\n", 265 | " else:\n", 266 | " break # 挿入する部分が見つかれば終わり" 267 | ] 268 | }, 269 | { 270 | "cell_type": "markdown", 271 | "metadata": {}, 272 | "source": [ 273 | "【例】選択ソートを行う関数sort()" 274 | ] 275 | }, 276 | { 277 | "cell_type": "code", 278 | "execution_count": 12, 279 | "metadata": {}, 280 | "outputs": [], 281 | "source": [ 282 | "def sort(data):\n", 283 | " for i in range(0, len(data)-1): # 最初から順に選択していく\n", 284 | " min_i = i # 最小値の位置をmin_iに求める\n", 285 | " for j in range(i+1, len(data)): # 最小値を探すループ\n", 286 | " if data[min_i] > data[j]: # より小さい値があれば,最小値を置き換える\n", 287 | " min_i = j\n", 288 | " data[min_i], data[i] = data[i], data[min_i] # 最小値の場所と要素を入れ替える" 289 | ] 290 | }, 291 | { 292 | "cell_type": "markdown", 293 | "metadata": {}, 294 | "source": [ 295 | "【例】シェルソートを行う関数sort() " 296 | ] 297 | }, 298 | { 299 | "cell_type": "code", 300 | "execution_count": 13, 301 | "metadata": {}, 302 | "outputs": [], 303 | "source": [ 304 | "def sort(data):\n", 305 | " gaps = [7, 3, 1] # ギャップの値をあらかじめ設定\n", 306 | " for gap in gaps: # gapを段々狭めて繰り返す\n", 307 | " for start in range(gap): # gap分離れた複数の組を順番にソート\n", 308 | " for i in range(start, len(data), gap): # gapの幅で飛ばしながら挿入ソート\n", 309 | " for j in range(i-gap, -1, -gap): # 終値を-1に設定(0まで実行)\n", 310 | " if data[j] > data[j+gap]: # gap分離れた要素で前の方が大きい場合\n", 311 | " data[j], data[j+gap] = data[j+gap], data[j] # 要素を入れ替える\n", 312 | " else:\n", 313 | " break # 挿入する部分が見つかれば終わり" 314 | ] 315 | }, 316 | { 317 | "cell_type": "markdown", 318 | "metadata": {}, 319 | "source": [ 320 | "【例】標準ライブラリheapqを利用してヒープソートを行う関数sort()" 321 | ] 322 | }, 323 | { 324 | "cell_type": "code", 325 | "execution_count": 14, 326 | "metadata": {}, 327 | "outputs": [], 328 | "source": [ 329 | "from heapq import heappush, heappop # ヒープを扱う標準ライブラリheapqを利用\n", 330 | "\n", 331 | "def sort(data):\n", 332 | " heap = [] # 空のヒープ(リスト)を作成\n", 333 | " while data: # dataから要素を取り出して,ヒープに入れる\n", 334 | " heappush(heap, data.pop()) # dataの最後の要素を取り出して,heappushでheapに入れる\n", 335 | " while heap: # heapから順に要素を取り出し,dataに戻す\n", 336 | " data.append(heappop(heap)) # heapから最小値を取り出して,dataの最後に追加する" 337 | ] 338 | }, 339 | { 340 | "cell_type": "markdown", 341 | "metadata": {}, 342 | "source": [ 343 | "【例】再帰関数f() \n", 344 | "f(n) : if n≦1 then return 1 else return n+f(n-1)" 345 | ] 346 | }, 347 | { 348 | "cell_type": "code", 349 | "execution_count": 15, 350 | "metadata": {}, 351 | "outputs": [], 352 | "source": [ 353 | "def f(n):\n", 354 | " if n <= 1:\n", 355 | " return 1\n", 356 | " else:\n", 357 | " return n + f(n-1)" 358 | ] 359 | }, 360 | { 361 | "cell_type": "markdown", 362 | "metadata": {}, 363 | "source": [ 364 | "【例】再帰関数f() の実行" 365 | ] 366 | }, 367 | { 368 | "cell_type": "code", 369 | "execution_count": 16, 370 | "metadata": {}, 371 | "outputs": [ 372 | { 373 | "name": "stdout", 374 | "output_type": "stream", 375 | "text": [ 376 | "15\n" 377 | ] 378 | } 379 | ], 380 | "source": [ 381 | "print(f(5))" 382 | ] 383 | }, 384 | { 385 | "cell_type": "markdown", 386 | "metadata": {}, 387 | "source": [ 388 | "【例】再帰を用いてクイックソートを行う関数sort()" 389 | ] 390 | }, 391 | { 392 | "cell_type": "code", 393 | "execution_count": 17, 394 | "metadata": {}, 395 | "outputs": [], 396 | "source": [ 397 | "def sort(data):\n", 398 | " n = len(data)\n", 399 | " pivot = data[n//2] # 今回の基準値には,真ん中の値を利用 \n", 400 | " left, right, middle = [], [], []\n", 401 | " for i in range(n):\n", 402 | " if data[i] < pivot: # 基準値より小さい場合は,左部分列leftに追加\n", 403 | " left.append(data[i])\n", 404 | " elif data[i] > pivot: # 基準値より大きい場合は,右部分列rightに追加\n", 405 | " right.append(data[i])\n", 406 | " else:\n", 407 | " middle.append(data[i]) # 基準値と同じ場合には,部分列middleに追加\n", 408 | " if left:\n", 409 | " left = sort(left) # 再帰でleftを分割\n", 410 | " if right:\n", 411 | " right = sort(right) # 再帰でrightを分割\n", 412 | " return left + middle + right # 順番に部分列を結合させて,戻り値にする" 413 | ] 414 | }, 415 | { 416 | "cell_type": "markdown", 417 | "metadata": {}, 418 | "source": [ 419 | "【例】関数sort()でのデータ変更" 420 | ] 421 | }, 422 | { 423 | "cell_type": "code", 424 | "execution_count": 18, 425 | "metadata": {}, 426 | "outputs": [ 427 | { 428 | "name": "stdout", 429 | "output_type": "stream", 430 | "text": [ 431 | "[1, 1, 2, 2, 3, 4, 5]\n" 432 | ] 433 | } 434 | ], 435 | "source": [ 436 | "data = [1, 3, 2, 5, 4, 2, 1]\n", 437 | "data = sort(data)\n", 438 | "print(data)" 439 | ] 440 | }, 441 | { 442 | "cell_type": "markdown", 443 | "metadata": {}, 444 | "source": [ 445 | "【例】再帰を用いてマージソートを行う関数sort()" 446 | ] 447 | }, 448 | { 449 | "cell_type": "code", 450 | "execution_count": 19, 451 | "metadata": {}, 452 | "outputs": [], 453 | "source": [ 454 | "def sort(data):\n", 455 | " if len(data) <= 1: # 長さが1以下の場合は分割できないので終了\n", 456 | " return data\n", 457 | "\n", 458 | " # 分割操作\n", 459 | " mid = len(data) // 2 # 真ん中を計算\n", 460 | " left = sort(data[:mid]) # 再帰で前半を分割してleftに\n", 461 | " right = sort(data[mid:]) # 再帰で後半を分割してrightに\n", 462 | " \n", 463 | " # 統合操作\n", 464 | " merge, l, r = [], 0, 0 # margeに統合\n", 465 | " while l < len(left) and r < len(right): # leftとrightの両方に要素がある場合\n", 466 | " if left[l] <= right[r]: # 左側≦右側の場合\n", 467 | " merge.append(left[l]) # 左側をmergeに加える\n", 468 | " l += 1\n", 469 | " else: # 左側>右側の場合\n", 470 | " merge.append(right[r]) # 右側をmergeに加える\n", 471 | " r += 1\n", 472 | " if l < len(left): # 左側が余った場合に残りを追加\n", 473 | " merge.extend(left[l:])\n", 474 | " elif r < len(right): # 右側が余った場合に残りを追加\n", 475 | " merge.extend(right[r:])\n", 476 | " return merge " 477 | ] 478 | }, 479 | { 480 | "cell_type": "markdown", 481 | "metadata": {}, 482 | "source": [ 483 | "#### 5-2-4 グラフのアルゴリズム" 484 | ] 485 | }, 486 | { 487 | "cell_type": "markdown", 488 | "metadata": {}, 489 | "source": [ 490 | "隣接リスト" 491 | ] 492 | }, 493 | { 494 | "cell_type": "code", 495 | "execution_count": 20, 496 | "metadata": {}, 497 | "outputs": [], 498 | "source": [ 499 | "edge = [[1], [2, 3], [4, 5], [6, 7],\n", 500 | " [], [], [], [8]]" 501 | ] 502 | }, 503 | { 504 | "cell_type": "markdown", 505 | "metadata": {}, 506 | "source": [ 507 | "幅優先探索" 508 | ] 509 | }, 510 | { 511 | "cell_type": "code", 512 | "execution_count": 21, 513 | "metadata": {}, 514 | "outputs": [], 515 | "source": [ 516 | "queue = deque() # キューを作成\n", 517 | "queue.append(edge[0][0]) # 根を追加" 518 | ] 519 | }, 520 | { 521 | "cell_type": "code", 522 | "execution_count": 22, 523 | "metadata": {}, 524 | "outputs": [ 525 | { 526 | "name": "stdout", 527 | "output_type": "stream", 528 | "text": [ 529 | "1 2 3 4 5 6 7 8 " 530 | ] 531 | } 532 | ], 533 | "source": [ 534 | "while len(queue) > 0:\n", 535 | " i = queue.popleft() # 先頭を取り出す\n", 536 | " print(i, end=' ')\n", 537 | " if i >= len(edge): # 葉がない場合は飛ばす\n", 538 | " continue\n", 539 | " for j in edge[i]: # 新たなノードを追加\n", 540 | " queue.append(j)" 541 | ] 542 | }, 543 | { 544 | "cell_type": "markdown", 545 | "metadata": {}, 546 | "source": [ 547 | "ノードの値と隣接リスト" 548 | ] 549 | }, 550 | { 551 | "cell_type": "code", 552 | "execution_count": 23, 553 | "metadata": {}, 554 | "outputs": [], 555 | "source": [ 556 | "node = ['', '+', '×', '-', '6', '2', '3', '1']\n", 557 | "edge = [[1], [2, 3], [4, 5], [6, 7]]" 558 | ] 559 | }, 560 | { 561 | "cell_type": "markdown", 562 | "metadata": {}, 563 | "source": [ 564 | "深さ優先探索(先行順)" 565 | ] 566 | }, 567 | { 568 | "cell_type": "code", 569 | "execution_count": 24, 570 | "metadata": {}, 571 | "outputs": [], 572 | "source": [ 573 | "def deep_search(i):\n", 574 | " print(node[i], end=' ')\n", 575 | " if i < len(edge): # 葉がない場合は飛ばす\n", 576 | " deep_search(edge[i][0]) # 左部分木を探索\n", 577 | " if i < len(edge) and len(edge[i]) == 2:\n", 578 | " deep_search(edge[i][1]) # 右部分木を探索" 579 | ] 580 | }, 581 | { 582 | "cell_type": "code", 583 | "execution_count": 25, 584 | "metadata": {}, 585 | "outputs": [ 586 | { 587 | "name": "stdout", 588 | "output_type": "stream", 589 | "text": [ 590 | "+ × 6 2 - 3 1 " 591 | ] 592 | } 593 | ], 594 | "source": [ 595 | "deep_search(edge[0][0])" 596 | ] 597 | }, 598 | { 599 | "cell_type": "code", 600 | "execution_count": 26, 601 | "metadata": {}, 602 | "outputs": [], 603 | "source": [ 604 | "# 中間順\n", 605 | "def deep_search(i):\n", 606 | " if i < len(edge): # 葉がない場合は飛ばす\n", 607 | " deep_search(edge[i][0]) # 左部分木を探索\n", 608 | " print(node[i], end=' ')\n", 609 | " if i < len(edge) and len(edge[i]) == 2:\n", 610 | " deep_search(edge[i][1]) # 右部分木を探索" 611 | ] 612 | }, 613 | { 614 | "cell_type": "code", 615 | "execution_count": 27, 616 | "metadata": {}, 617 | "outputs": [], 618 | "source": [ 619 | "# 後行順(逆ポーランド順)\n", 620 | "def deep_search(i):\n", 621 | " if i < len(edge): # 葉がない場合は飛ばす\n", 622 | " deep_search(edge[i][0]) # 左部分木を探索\n", 623 | " if i < len(edge) and len(edge[i]) == 2:\n", 624 | " deep_search(edge[i][1]) # 右部分木を探索\n", 625 | " print(node[i], end=' ')" 626 | ] 627 | }, 628 | { 629 | "cell_type": "markdown", 630 | "metadata": {}, 631 | "source": [ 632 | "#### 5-2-5 さまざまなアルゴリズム\n", 633 | "文字列探索" 634 | ] 635 | }, 636 | { 637 | "cell_type": "code", 638 | "execution_count": 28, 639 | "metadata": {}, 640 | "outputs": [], 641 | "source": [ 642 | "text = 'ACBBMACABABC'\n", 643 | "pattern = 'ACAB'" 644 | ] 645 | }, 646 | { 647 | "cell_type": "code", 648 | "execution_count": 29, 649 | "metadata": {}, 650 | "outputs": [], 651 | "source": [ 652 | "# 単純な照合方法\n", 653 | "def search1(text, pattern):\n", 654 | " for i in range(len(text)):\n", 655 | " for j in range(len(pattern)):\n", 656 | " if text[i+j] == pattern[j]:\n", 657 | " if j == len(pattern) - 1:\n", 658 | " return i\n", 659 | " else:\n", 660 | " break\n", 661 | " return -1" 662 | ] 663 | }, 664 | { 665 | "cell_type": "code", 666 | "execution_count": 30, 667 | "metadata": {}, 668 | "outputs": [ 669 | { 670 | "data": { 671 | "text/plain": [ 672 | "5" 673 | ] 674 | }, 675 | "execution_count": 30, 676 | "metadata": {}, 677 | "output_type": "execute_result" 678 | } 679 | ], 680 | "source": [ 681 | "search1(text, pattern)" 682 | ] 683 | }, 684 | { 685 | "cell_type": "markdown", 686 | "metadata": {}, 687 | "source": [ 688 | "※2021.8.21修正(正誤表に掲載) BM法 関数 def search2()\n", 689 | "* 3行目 for i, character in enumerate(pattern): -> for i, character in enumerate(pattern**[:-1]**)\n", 690 | "* 4行目 skip_dic[character] = len(pattern) - i -> skip_dic[character] = len(pattern) - i **- 1**\n", 691 | "* 6行目 while i < len(text) - len(pattern) -> while i < len(text) - len(pattern) **+ 1**" 692 | ] 693 | }, 694 | { 695 | "cell_type": "code", 696 | "execution_count": 31, 697 | "metadata": {}, 698 | "outputs": [], 699 | "source": [ 700 | "# BM法\n", 701 | "def search2(text, pattern):\n", 702 | " skip_dic = dict() # スキップ数(辞書形式)の作成\n", 703 | " for i, character in enumerate(pattern[:-1]):\n", 704 | " skip_dic[character] = len(pattern) - i - 1\n", 705 | " i = 0 # 文字の比較\n", 706 | " while i < len(text) - len(pattern) + 1: # 修正 + 1を追加(最後尾までチェック)\n", 707 | " for j in range(len(pattern)):\n", 708 | " if text[i+j] == pattern[j]:\n", 709 | " if j == len(pattern) - 1:\n", 710 | " return i\n", 711 | " else:\n", 712 | " break\n", 713 | " if text[i+len(pattern)-1] not in skip_dic: # スキップ数の決定 修正\n", 714 | " skip = len(pattern)\n", 715 | " else:\n", 716 | " skip = skip_dic[text[i+len(pattern)-1]]\n", 717 | " i += skip\n", 718 | " return -1" 719 | ] 720 | }, 721 | { 722 | "cell_type": "code", 723 | "execution_count": 32, 724 | "metadata": {}, 725 | "outputs": [ 726 | { 727 | "data": { 728 | "text/plain": [ 729 | "5" 730 | ] 731 | }, 732 | "execution_count": 32, 733 | "metadata": {}, 734 | "output_type": "execute_result" 735 | } 736 | ], 737 | "source": [ 738 | "search2(text, pattern)" 739 | ] 740 | }, 741 | { 742 | "cell_type": "markdown", 743 | "metadata": {}, 744 | "source": [ 745 | "#### 5-2-6 演習問題" 746 | ] 747 | }, 748 | { 749 | "cell_type": "markdown", 750 | "metadata": {}, 751 | "source": [ 752 | "問3" 753 | ] 754 | }, 755 | { 756 | "cell_type": "code", 757 | "execution_count": 33, 758 | "metadata": {}, 759 | "outputs": [], 760 | "source": [ 761 | "# 初期状態のスタックA,B,C\n", 762 | "A = [1, 2, 3]\n", 763 | "B = [1, 2, 3]\n", 764 | "C = [1, 2, 3]" 765 | ] 766 | }, 767 | { 768 | "cell_type": "code", 769 | "execution_count": 34, 770 | "metadata": {}, 771 | "outputs": [], 772 | "source": [ 773 | "def f():\n", 774 | " if not A:\n", 775 | " pass\n", 776 | " else:\n", 777 | " C.append(A.pop())\n", 778 | " f()\n", 779 | " B.append(C.pop())" 780 | ] 781 | }, 782 | { 783 | "cell_type": "code", 784 | "execution_count": 35, 785 | "metadata": {}, 786 | "outputs": [ 787 | { 788 | "name": "stdout", 789 | "output_type": "stream", 790 | "text": [ 791 | "[] [1, 2, 3, 1, 2, 3] [1, 2, 3]\n" 792 | ] 793 | } 794 | ], 795 | "source": [ 796 | "f()\n", 797 | "print(A, B, C)" 798 | ] 799 | }, 800 | { 801 | "cell_type": "code", 802 | "execution_count": null, 803 | "metadata": {}, 804 | "outputs": [], 805 | "source": [] 806 | } 807 | ], 808 | "metadata": { 809 | "kernelspec": { 810 | "display_name": "Python 3", 811 | "language": "python", 812 | "name": "python3" 813 | }, 814 | "language_info": { 815 | "codemirror_mode": { 816 | "name": "ipython", 817 | "version": 3 818 | }, 819 | "file_extension": ".py", 820 | "mimetype": "text/x-python", 821 | "name": "python", 822 | "nbconvert_exporter": "python", 823 | "pygments_lexer": "ipython3", 824 | "version": "3.8.10" 825 | } 826 | }, 827 | "nbformat": 4, 828 | "nbformat_minor": 2 829 | } 830 | -------------------------------------------------------------------------------- /7-2-1_IPA_sample_question.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "### 7-2-1 サンプル問題 \n", 8 | "(2019年10月28日にIPA(情報処理推進機構)が公開したPythonのサンプル問題)" 9 | ] 10 | }, 11 | { 12 | "cell_type": "markdown", 13 | "metadata": {}, 14 | "source": [ 15 | "#### 〔プログラム〕" 16 | ] 17 | }, 18 | { 19 | "cell_type": "code", 20 | "execution_count": 1, 21 | "metadata": {}, 22 | "outputs": [], 23 | "source": [ 24 | "import math # 数学関数の標準ライブラリ\n", 25 | "import matplotlib.pyplot as plt # グラフ描画の外部ライブラリ\n", 26 | "\n", 27 | "def parse(s):\n", 28 | " return [(x[0], int(x[1:])) for x in s.split(';')]\n", 29 | "\n", 30 | "class Marker:\n", 31 | " def __init__(self):\n", 32 | " self.x, self.y, self.angle = 0, 0, 0\n", 33 | " plt.xlim(-320, 320) # x 軸の表示範囲を設定\n", 34 | " plt.ylim(-240, 240) # y 軸の表示範囲を設定\n", 35 | " \n", 36 | " def forward(self, val):\n", 37 | " # 度数表で表した角度を,ラジアンで表した角度に変換\n", 38 | " rad = math.radians(self.angle)\n", 39 | " dx = val * math.cos(rad)\n", 40 | " dy = val * math.sin(rad)\n", 41 | " x1, y1, x2, y2 = self.x, self.y, self.x + dx, self.y + dy\n", 42 | " # (x1, y1) と (x2, y2) を結ぶ線分を描画\n", 43 | " plt.plot([x1, x2], [y1, y2], color='black', linewidth=2)\n", 44 | " self.x, self.y = x2, y2\n", 45 | " \n", 46 | " def turn(self, val):\n", 47 | " self.angle = (self.angle + val) % 360\n", 48 | " \n", 49 | " def show(self):\n", 50 | " plt.show() # 描画結果を表示\n", 51 | "\n", 52 | "def draw(s):\n", 53 | " insts = parse(s)\n", 54 | " marker = Marker()\n", 55 | " stack = []\n", 56 | " opno = 0\n", 57 | " while opno < len(insts):\n", 58 | " print(stack)\n", 59 | " code, val = insts[opno]\n", 60 | " if code == 'F':\n", 61 | " marker.forward(val)\n", 62 | " elif code == 'T':\n", 63 | " marker.turn(val)\n", 64 | " elif code == 'R':\n", 65 | " stack.append({'opno': opno, 'rest': val})\n", 66 | " elif code == 'E':\n", 67 | " if stack[-1]['rest'] > 1:\n", 68 | " opno = stack[-1]['opno']\n", 69 | " stack[-1]['rest'] -= 1\n", 70 | " else:\n", 71 | " stack.pop()\n", 72 | " opno += 1\n", 73 | " marker.show()" 74 | ] 75 | }, 76 | { 77 | "cell_type": "markdown", 78 | "metadata": {}, 79 | "source": [ 80 | "図2,図3の例の実行結果" 81 | ] 82 | }, 83 | { 84 | "cell_type": "code", 85 | "execution_count": 4, 86 | "metadata": {}, 87 | "outputs": [ 88 | { 89 | "name": "stdout", 90 | "output_type": "stream", 91 | "text": [ 92 | "[]\n", 93 | "[{'opno': 0, 'rest': 3}]\n", 94 | "[{'opno': 0, 'rest': 3}, {'opno': 1, 'rest': 4}]\n", 95 | "[{'opno': 0, 'rest': 3}, {'opno': 1, 'rest': 4}]\n", 96 | "[{'opno': 0, 'rest': 3}, {'opno': 1, 'rest': 4}]\n", 97 | "[{'opno': 0, 'rest': 3}, {'opno': 1, 'rest': 3}]\n", 98 | "[{'opno': 0, 'rest': 3}, {'opno': 1, 'rest': 3}]\n", 99 | "[{'opno': 0, 'rest': 3}, {'opno': 1, 'rest': 3}]\n", 100 | "[{'opno': 0, 'rest': 3}, {'opno': 1, 'rest': 2}]\n", 101 | "[{'opno': 0, 'rest': 3}, {'opno': 1, 'rest': 2}]\n", 102 | "[{'opno': 0, 'rest': 3}, {'opno': 1, 'rest': 2}]\n", 103 | "[{'opno': 0, 'rest': 3}, {'opno': 1, 'rest': 1}]\n", 104 | "[{'opno': 0, 'rest': 3}, {'opno': 1, 'rest': 1}]\n", 105 | "[{'opno': 0, 'rest': 3}, {'opno': 1, 'rest': 1}]\n", 106 | "[{'opno': 0, 'rest': 3}]\n", 107 | "[{'opno': 0, 'rest': 3}]\n", 108 | "[{'opno': 0, 'rest': 2}]\n", 109 | "[{'opno': 0, 'rest': 2}, {'opno': 1, 'rest': 4}]\n", 110 | "[{'opno': 0, 'rest': 2}, {'opno': 1, 'rest': 4}]\n", 111 | "[{'opno': 0, 'rest': 2}, {'opno': 1, 'rest': 4}]\n", 112 | "[{'opno': 0, 'rest': 2}, {'opno': 1, 'rest': 3}]\n", 113 | "[{'opno': 0, 'rest': 2}, {'opno': 1, 'rest': 3}]\n", 114 | "[{'opno': 0, 'rest': 2}, {'opno': 1, 'rest': 3}]\n", 115 | "[{'opno': 0, 'rest': 2}, {'opno': 1, 'rest': 2}]\n", 116 | "[{'opno': 0, 'rest': 2}, {'opno': 1, 'rest': 2}]\n", 117 | "[{'opno': 0, 'rest': 2}, {'opno': 1, 'rest': 2}]\n", 118 | "[{'opno': 0, 'rest': 2}, {'opno': 1, 'rest': 1}]\n", 119 | "[{'opno': 0, 'rest': 2}, {'opno': 1, 'rest': 1}]\n", 120 | "[{'opno': 0, 'rest': 2}, {'opno': 1, 'rest': 1}]\n", 121 | "[{'opno': 0, 'rest': 2}]\n", 122 | "[{'opno': 0, 'rest': 2}]\n", 123 | "[{'opno': 0, 'rest': 1}]\n", 124 | "[{'opno': 0, 'rest': 1}, {'opno': 1, 'rest': 4}]\n", 125 | "[{'opno': 0, 'rest': 1}, {'opno': 1, 'rest': 4}]\n", 126 | "[{'opno': 0, 'rest': 1}, {'opno': 1, 'rest': 4}]\n", 127 | "[{'opno': 0, 'rest': 1}, {'opno': 1, 'rest': 3}]\n", 128 | "[{'opno': 0, 'rest': 1}, {'opno': 1, 'rest': 3}]\n", 129 | "[{'opno': 0, 'rest': 1}, {'opno': 1, 'rest': 3}]\n", 130 | "[{'opno': 0, 'rest': 1}, {'opno': 1, 'rest': 2}]\n", 131 | "[{'opno': 0, 'rest': 1}, {'opno': 1, 'rest': 2}]\n", 132 | "[{'opno': 0, 'rest': 1}, {'opno': 1, 'rest': 2}]\n", 133 | "[{'opno': 0, 'rest': 1}, {'opno': 1, 'rest': 1}]\n", 134 | "[{'opno': 0, 'rest': 1}, {'opno': 1, 'rest': 1}]\n", 135 | "[{'opno': 0, 'rest': 1}, {'opno': 1, 'rest': 1}]\n", 136 | "[{'opno': 0, 'rest': 1}]\n", 137 | "[{'opno': 0, 'rest': 1}]\n" 138 | ] 139 | }, 140 | { 141 | "data": { 142 | "image/png": "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\n", 143 | "text/plain": [ 144 | "
" 145 | ] 146 | }, 147 | "metadata": { 148 | "needs_background": "light" 149 | }, 150 | "output_type": "display_data" 151 | } 152 | ], 153 | "source": [ 154 | "draw('R3;R4;F100;T90;E0;F100;E0')" 155 | ] 156 | }, 157 | { 158 | "cell_type": "markdown", 159 | "metadata": {}, 160 | "source": [ 161 | "#### 設問1" 162 | ] 163 | }, 164 | { 165 | "cell_type": "code", 166 | "execution_count": 5, 167 | "metadata": {}, 168 | "outputs": [ 169 | { 170 | "name": "stdout", 171 | "output_type": "stream", 172 | "text": [ 173 | "[]\n", 174 | "[{'opno': 0, 'rest': 5}]\n", 175 | "[{'opno': 0, 'rest': 5}]\n", 176 | "[{'opno': 0, 'rest': 5}]\n", 177 | "[{'opno': 0, 'rest': 4}]\n", 178 | "[{'opno': 0, 'rest': 4}]\n", 179 | "[{'opno': 0, 'rest': 4}]\n", 180 | "[{'opno': 0, 'rest': 3}]\n", 181 | "[{'opno': 0, 'rest': 3}]\n", 182 | "[{'opno': 0, 'rest': 3}]\n", 183 | "[{'opno': 0, 'rest': 2}]\n", 184 | "[{'opno': 0, 'rest': 2}]\n", 185 | "[{'opno': 0, 'rest': 2}]\n", 186 | "[{'opno': 0, 'rest': 1}]\n", 187 | "[{'opno': 0, 'rest': 1}]\n", 188 | "[{'opno': 0, 'rest': 1}]\n" 189 | ] 190 | }, 191 | { 192 | "data": { 193 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX8AAAD4CAYAAAAEhuazAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAYnUlEQVR4nO3de3BV9dX/8fcy3CzghXAVqJeWkYRwTwGHDrZaEZCCl6pI/IlVR3RgKh3bEX7YR9vKFB8dB1vkUaaoOILoFBTaoKJUZYoFDdcQAkKl/qBQCNIWHDSRuH5/ZEfPgwdyO8nOOd/Pa+ZM9vnufZK1kvDJYe91EnN3REQkLGfEXYCIiDQ9hb+ISIAU/iIiAVL4i4gESOEvIhKgFnEXUFsdO3b0Cy64IO4yRETSyoYNGw67e6eT19Mm/C+44AKKioriLkNEJK2Y2UfJ1nXaR0QkQAp/EZEAKfxFRAKk8BcRCZDCX0QkQAp/EZEAKfxFRAKk8BcRCZDCX0QkQAp/EZEAKfxFRAKk8BcRCZDCX0QkQA0OfzPraWZvmVmpmZWY2T3Regcze8PMdkVvz014zAwz221mO83syobWICIidZOKZ/4ngHvdPQcYBkwxs1xgOrDa3XsBq6P7RPsmAH2AUcA8M8tKQR0iIlJLDQ5/dz/g7huj7WNAKdAdGA8sjA5bCFwdbY8Hlrh7ubvvAXYDQxpah4iI1F5Kz/mb2QXAQGA90MXdD0DVDwigc3RYd2BvwsP2RWvJ3t+dZlZkZkVlZWWpLFVEJGgpC38zawcsBaa5+9HTHZpkzZMd6O7z3T3f3fM7dfraXyETEZF6Skn4m1lLqoJ/kbsvi5YPmlm3aH834FC0vg/omfDwHsD+VNQhIiK1k4ppHwMWAKXu/ljCrhXApGh7ErA8YX2CmbU2swuBXsB7Da1DRERqLxV/wH048H+AYjPbHK39X2A28JKZ3Q78P+B6AHcvMbOXgO1UTQpNcffKFNQhIiK11ODwd/e/kPw8PsDlp3jMLGBWQz+2iIjUj17hKyISIIW/iEiAFP4iIgFS+IuIBEjhLyISIIW/iEiAFP4iIgFS+IuIBEjhLyISIIW/iEiAFP4iIgFS+IuIBEjhLyISIIW/SBpwd9yT/sE7kXpR+Is0c+7O3XffTefOndmzZ0/c5UiGUPiLNGN///vfGTNmDE899RSHDx8mNzeXp556ii+++CLu0iTNKfxFmqETJ07w6KOP0qdPH1577TXat29PXl4en332GXfddRcjRoygpKQk7jIljSn8RZqZoqIihgwZws9//nOOHz/OjTfeyAcffMDWrVt58cUX6dq1K2vXrmXgwIH84he/4LPPPou7ZElDCn+RZuLYsWNMmzaNoUOHsmnTJs4//3xWrlzJkiVL6Nq1K2bGDTfcQGlpKZMnT+bzzz/noYceol+/fvz5z3+Ou3xJMwp/kWZgxYoV5Obm8vjjj2Nm/OxnP6OkpITRo0d/7dhzzjmHJ598kr/85S/k5uaya9cuLr/8cm699VYOHz4cQ/WSjhT+IjH6xz/+wXXXXcf48ePZt28f+fn5FBUV8cgjj9C2bdvTPnb48OFs2rSJhx56iNatW7Nw4UJ69+7Nc889p7FQqZHCXyQGlZWVPPHEE+Tk5LBs2TLatWvH448/zrp16xgwYECt30+rVq2YOXMmxcXFXHbZZXz88cdMmjSJK664gl27djViB5LuFP4iTWzr1q0MHz6cqVOncuzYMcaPH8/27dv5yU9+QlZWVr3eZ69evXjzzTdZuHAh2dnZrF69mr59+zJr1iwqKipS3IFkAoW/SBM5fvw406dPZ/Dgwaxfv57zzjuPZcuW8corr9CzZ88Gv38z45ZbbmHHjh1MmjSJ8vJy7r//fgYNGsTatWtT0IFkEoW/SBNYtWoVeXl5PPzww1RWVjJ16lRKS0u55pprUv6xOnbsyLPPPsvq1av59re/TUlJCd/97ne56667+Pe//53yjyfpSeEv0ogOHTpEQUEBV155JXv27KFv3768++67/O53v+Oss85q1I992WWXUVxczP3330/Lli156qmnyMnJ4aWXXtIFYVH4izQGd2fBggX07t2bxYsXc+aZZzJ79mw2bNjAsGHDmqyONm3a8Otf/5pNmzYxfPhw/vnPf3LjjTcyduxYPvrooyarQ5ofhb9Iiu3YsYPvfe973HHHHfzrX/9i5MiRbNu2jfvuu4+WLVvGUlOfPn1Ys2YNTz75JGeffTYrV64kNzeXxx57jBMnTsRSk8RL4S+SIuXl5fzyl7+kf//+rFmzhk6dOrFo0SJee+01LrroorjL44wzzmDy5MmUlpZyww03cPz4ce69916GDh3Khg0b4i5PmpjCXyQF1qxZw4ABA3jwwQepqKjg9ttvZ8eOHUycOBEzi7u8/6Vbt268+OKLFBYWcv7557Nx40aGDBnCT3/6Uz755JO4y5MmovAXaYAjR45wxx13cOmll7Jjxw4uvvhi3nnnHX7/+9/ToUOHuMs7rTFjxlBSUsK9994LwJw5c8jNzeWPf/xjzJVJU1D4i9SDu7N48WJycnJYsGABrVq14sEHH2TLli2MGDEi7vJqrW3btjz66KMUFRUxePBg9u7dy7hx4/jRj37E/v374y5PGpHCX6SOPvzwQ0aNGkVBQQGHDh3i0ksvZcuWLTzwwAO0bt067vLqZeDAgaxfv545c+bQtm1bli5dSk5ODvPmzdMfjslQCn+RWvr88895+OGHycvLY9WqVZx77rksWLCAt956i969e8ddXoNlZWVxzz33UFpayrhx4zh69ChTpkxh+PDhFBcXx12epJjCX6QW1q9fT35+PtOnT+fTTz+loKCAHTt2cNtttzW7C7oN1bNnT1555RWWLl3Keeedx7p16xg0aBAzZszg008/jbs8SRGFv8hpHD16lKlTp3LJJZewdetWLrroIl5//XWef/55OnfuHHd5jcbMuPbaa9m+fTtTpkyhsrKS2bNnk5eXxxtvvBF3eZICCn+RJNydZcuWkZOTwxNPPMEZZ5zB9OnTKS4uZuTIkXGX12TOPvts5s6dy7vvvkvfvn358MMPGTlyJDfffDOHDh2KuzxpgJSEv5k9bWaHzGxbwloHM3vDzHZFb89N2DfDzHab2U4zuzIVNYikyt69e7n66qu57rrr2L9/P0OHDmXjxo385je/4Rvf+Ebc5cVi2LBhbNiwgdmzZ9OmTRsWLVpETk4OTz/9tH5PUJpK1TP/Z4FRJ61NB1a7ey9gdXQfM8sFJgB9osfMM7P6/RJzkRSqrKzk8ccfJzc3lxUrVtC+fXvmzp3L2rVr6devX9zlxa5ly5bcd999bNu2jSuuuIIjR45w++238/3vf5+dO3fGXZ7UUUrC393XAEdOWh4PLIy2FwJXJ6wvcfdyd98D7AaGpKIOkfratGkTw4YNY9q0aXzyySdce+21lJaWMmXKlHr/gZVM9a1vfevL6x6dOnXinXfeoV+/fvzqV7+ivLw87vKklhrznH8Xdz8AEL2tvjrWHdibcNy+aO1rzOxOMysys6KysrJGLFVC9Z///IfJkyfzne98h6KiInr06MHy5ctZunQp3bsn/bYUqi4IFxQUUFpaym233UZFRQUPPPAA/fv35w9/+EPc5UktxHHBN9lcXNKThu4+393z3T2/U6dOjVyWhObll18mOzub+fPn4+7cc889bN++nXHjxsVdWtrIzs5mwYIFvP3221x88cXs3LmT66+/nv79+8ddmtSgMcP/oJl1A4jeVo8G7AMS/2ZdD0CvI5cmN2LEiC8vVj733HPMmTOH9u3bx1xVeqp+lXP1i92++c1vxlyR1KQxw38FMCnangQsT1ifYGatzexCoBfwXiPWIZJUdnY2BQUFALz//vsxV5P+jh49yu7duzEz5s2bF3c5UoNUjXq+APwVuNjM9pnZ7cBs4Aoz2wVcEd3H3UuAl4DtwGvAFHevTEUdInU1bdo0ABYtWkRFRUXM1aS3F154gRMnTjB69OiU/EF6aVwtUvFO3P2mU+y6/BTHzwJmpeJjizTEwIED6du3L8XFxRQWFjbKH1QPxTPPPAPArbfeGm8hUit6ha8Ezcy+DKtnn3021lrS2ebNm9m8eTPnnnsuP/zhD+MuR2pB4S/BKygoICsri8LCQg4ePBh3OWlp4cKql/TcdNNNtGnTJuZqpDYU/hK8Ll26MGbMGCorK1m8eHHc5aSdiooKnn/+eUCnfNKJwl+Er0LrmWee0e+qqaNXX32Vw4cPk5ubS35+ftzlSC0p/EWAsWPHkp2dTXFxMZs3b467nLRSfa3k1ltvzbi/bZDJFP4iQKtWrZg4cSKgC791UVZWxp/+9CeysrK4+eab4y5H6kDhLxKpPvWjmf/aW7x4MSdOnGDUqFF069Yt7nKkDhT+IpHqmf+PP/6YwsLCuMtJC4mnfCS9KPxFIpr5rxvN9qc3hb9IgptvvpkWLVpo5r8Wqmf7J06cSOvWrWOuRupK4S+SoHPnzpr5rwXN9qc/hb/ISTTzX7Pq2f4+ffowePDguMuRelD4i5zkqquu0sx/DTTbn/4U/iInadWq1Ze/518Xfr8ucba/+vMk6UfhL5KEZv5PTbP9mUHhL5LEgAED6Nevn2b+k9Bsf2ZQ+IskoZn/5DTbnzkU/iKnUFBQoJn/k1T/INRsf/pT+IucQuLM/6JFi+IuJ3YVFRVffh5+/OMfx1yNNJTCX+Q0NPP/lZUrV3L48GHy8vIYNGhQ3OVIAyn8RU6jeuZ/27ZtbNq0Ke5yYqXZ/syi8Bc5Dc38Vzl06BCFhYWa7c8gCn+RGiTO/JeXl8dbTEyqZ/tHjx5N165d4y5HUkDhL1KD6pn/I0eOBDvzr9n+zKPwF6lB6DP/mzdvZsuWLXTo0IGxY8fGXY6kiMJfpBaqZ/5XrlwZ3My/Zvszk8JfpBZCnflPnO3XKZ/MovAXqaXqFzaFNPOv2f7MpfAXqaUxY8bQsWPHoGb+NdufuRT+IrUU2sy/Zvszm8JfpA5CmvnXbH9mU/iL1MGAAQPo379/EDP/1f+70S9xy0wKf5E6CmHmv3q2Pzs7W7P9GUrhL1JHEydOzPiZ/8TZ/latWsVbjDQKhb9IHXXu3JmrrroqY2f+NdsfBoW/SD1k8u/5Lyws5PDhw/Tt25eBAwfGXY40ktjC38xGmdlOM9ttZtPjqkOkPhJn/jdu3Bh3OSml2f4wxBL+ZpYFPAGMBnKBm8wsN45aROojU2f+Dx48qNn+QMT1zH8IsNvdP3T3CmAJMD6mWkTqpfrUz9y5czGzjLh17dqVyspKxowZQ5cuXeL9BEujiiv8uwN7E+7vi9b+FzO708yKzKyorKysyYoTqY0BAwbEXUKj0YXezNcipo+b7ETi166auft8YD5Afn5+Zl1Vk4ywfft2evbsSbt27eIuJWW2bNlC79694y5DGllc4b8P6JlwvwewP6ZaROotJycn7hJSrn///nGXIE0grtM+7wO9zOxCM2sFTABWxFSLiEhwYnnm7+4nzGwq8DqQBTzt7iVx1CIiEqK4Tvvg7iuBlXF9fBGRkOkVviIiAVL4i4gESOEvIhIghb+ISIAU/iIiAVL4i4gESOEvIhIghb+ISIAU/iIiAVL4i4gESOEvIhIghb+ISIAU/iIiAVL4i4gESOEvIhIghb+ISIAU/iIiAVL4i4gESOEvIhIghb+ISIAU/iIiAVL4i4gESOEvIhIghb+ISIAU/iIiAVL4i4gESOEvIhIghb+ISIAU/iIiAVL4i4gESOEvIhIghb+ISIAU/iIiAVL4i4gESOEvIhIghb+ISIAaFP5mdr2ZlZjZF2aWf9K+GWa228x2mtmVCeuDzaw42vdbM7OG1CAiInXX0Gf+24BrgTWJi2aWC0wA+gCjgHlmlhXt/h/gTqBXdBvVwBpERKSOGhT+7l7q7juT7BoPLHH3cnffA+wGhphZN+Asd/+ruzvwHHB1Q2oQEZG6a6xz/t2BvQn390Vr3aPtk9eTMrM7zazIzIrKysoapVARkRC1qOkAM3sT6Jpk10x3X36qhyVZ89OsJ+Xu84H5APn5+ac8TkRE6qbG8Hf3H9Tj/e4Deibc7wHsj9Z7JFkXEZEm1FinfVYAE8ystZldSNWF3ffc/QBwzMyGRVM+twCn+t+DiIg0koaOel5jZvuAS4BCM3sdwN1LgJeA7cBrwBR3r4wedjfwe6ouAv8NeLUhNYiISN1Z1dBN85efn+9FRUVxlyEiklbMbIO755+8rlf4iogESOEvIhIghb+ISIAU/iIiAVL4i4gESOEvIhIghb+ISIAU/iIiAVL4i4gESOEvIhIghb+ISIAU/iIiAVL4i4gESOEvIhIghb+ISIAU/iIiAVL4i4gESOEvIhIghb+ISIAU/iIiAVL4i4gESOEvIhIghb+ISIAU/iIiAVL4i4gESOEvIhIghb+ISIAU/iIiAVL4i4gESOEvIhIghb+ISIAU/iIiAVL4i4gESOEvIhIghb+ISIAU/iIiAVL4i4gEqEHhb2aPmNkOM9tqZi+b2TkJ+2aY2W4z22lmVyasDzaz4mjfb83MGlKDiIjUXUOf+b8B5Ll7P+ADYAaAmeUCE4A+wChgnpllRY/5H+BOoFd0G9XAGkREpI4aFP7uvsrdT0R31wE9ou3xwBJ3L3f3PcBuYIiZdQPOcve/ursDzwFXN6QGERGpu1Se878NeDXa7g7sTdi3L1rrHm2fvJ6Umd1pZkVmVlRWVpbCUkVEwtaipgPM7E2ga5JdM919eXTMTOAEsKj6YUmO99OsJ+Xu84H5APn5+ac8TkRE6qbG8Hf3H5xuv5lNAsYCl0encqDqGX3PhMN6APuj9R5J1kVEpAk1dNpnFHAfMM7djyfsWgFMMLPWZnYhVRd233P3A8AxMxsWTfncAixvSA0iIlJ3NT7zr8FcoDXwRjSxuc7d73L3EjN7CdhO1emgKe5eGT3mbuBZ4EyqrhG8+rX3KiIijapB4e/u3z7NvlnArCTrRUBeQz6uiIg0jF7hKyISIIW/iEiAFP4iIgFS+IuIBEjhLyISIIW/iEiAFP4iIgFS+IuIBEjhLyISIIW/iEiAFP4iIgFS+IuIBMi++hX8zZuZlQEf1eLQjsDhRi6nKWVaP5B5Pamf5i/TeqpLP+e7e6eTF9Mm/GvLzIrcPT/uOlIl0/qBzOtJ/TR/mdZTKvrRaR8RkQAp/EVEApSJ4T8/7gJSLNP6gczrSf00f5nWU4P7ybhz/iIiUrNMfOYvIiI1UPiLiAQorcPfzH5tZlvNbLOZrTKz8xL2zTCz3Wa208yuTFgfbGbF0b7fmpnFU/3XmdkjZrYj6ullMzsnYV869nO9mZWY2Rdmln/SvrTrJxkzGxX1sNvMpsddT22Y2dNmdsjMtiWsdTCzN8xsV/T23IR9Sb9WzYWZ9TSzt8ysNPp+uydaT8uezKyNmb1nZluifn4Zrae2H3dP2xtwVsL2T4Ano+1cYAvQGrgQ+BuQFe17D7gEMOBVYHTcfST0MBJoEW0/DDyc5v3kABcDbwP5Cetp2U+S/rKi2i8CWkU95cZdVy3qHgEMArYlrP03MD3anl6b773mcgO6AYOi7fbAB1HdadlT9L3fLtpuCawHhqW6n7R+5u/uRxPutgWqr16PB5a4e7m77wF2A0PMrBtVPzD+6lWfteeAq5u06NNw91XufiK6uw7oEW2naz+l7r4zya607CeJIcBud//Q3SuAJVT11qy5+xrgyEnL44GF0fZCvvq8J/1aNUmhteTuB9x9Y7R9DCgFupOmPXmVT6K7LaObk+J+0jr8AcxslpntBQqA/4qWuwN7Ew7bF611j7ZPXm+ObqPqmS9kRj+JMqWfU/WRjrq4+wGoClOgc7SeVj2a2QXAQKqeLadtT2aWZWabgUPAG+6e8n6affib2Ztmti3JbTyAu890957AImBq9cOSvCs/zXqTqamf6JiZwAmqeoI07yfZw5KsNYt+6ijd6q2PtOnRzNoBS4FpJ50V+NqhSdaaVU/uXunuA6j63/8QM8s7zeH16qdFfYtrKu7+g1oeuhgoBB6g6idfz4R9PYD90XqPJOtNpqZ+zGwSMBa4PDr1AWnczyk0237q6FR9pKODZtbN3Q9Ep98ORetp0aOZtaQq+Be5+7JoOa17AnD3f5vZ28AoUtxPs3/mfzpm1ivh7jhgR7S9AphgZq3N7EKgF/Be9F+lY2Y2LJoiuQVY3qRFn4aZjQLuA8a5+/GEXWnZz2lkSj/vA73M7EIzawVMoKq3dLQCmBRtT+Krz3vSr1UM9Z1S9L2yACh198cSdqVlT2bWyaJJPzM7E/gBVdmW2n7ivrLdwKviS4FtwFbgj0D3hH0zqbrqvZOEiREgP3rM34C5RK9ybg43qi7U7AU2R7cn07yfa6h6VlIOHAReT+d+TtHjGKqmS/4GzIy7nlrW/AJwAPg8+vrcDmQDq4Fd0dsONX2tmssN+C5Vpzm2JvzbGZOuPQH9gE1RP9uA/4rWU9qPfr2DiEiA0vq0j4iI1I/CX0QkQAp/EZEAKfxFRAKk8BcRCZDCX0QkQAp/EZEA/X//YipIgTDN8wAAAABJRU5ErkJggg==\n", 194 | "text/plain": [ 195 | "
" 196 | ] 197 | }, 198 | "metadata": { 199 | "needs_background": "light" 200 | }, 201 | "output_type": "display_data" 202 | } 203 | ], 204 | "source": [ 205 | "draw('R5;F100;T72;E0')" 206 | ] 207 | }, 208 | { 209 | "cell_type": "markdown", 210 | "metadata": {}, 211 | "source": [ 212 | "実行結果1" 213 | ] 214 | }, 215 | { 216 | "cell_type": "code", 217 | "execution_count": 2, 218 | "metadata": {}, 219 | "outputs": [ 220 | { 221 | "data": { 222 | "text/plain": [ 223 | "[('R', 4), ('F', 100), ('T', 90), ('E', 0)]" 224 | ] 225 | }, 226 | "execution_count": 2, 227 | "metadata": {}, 228 | "output_type": "execute_result" 229 | } 230 | ], 231 | "source": [ 232 | "parse('R4;F100;T90;E0')" 233 | ] 234 | }, 235 | { 236 | "cell_type": "markdown", 237 | "metadata": {}, 238 | "source": [ 239 | "実行結果2" 240 | ] 241 | }, 242 | { 243 | "cell_type": "code", 244 | "execution_count": 3, 245 | "metadata": {}, 246 | "outputs": [ 247 | { 248 | "name": "stdout", 249 | "output_type": "stream", 250 | "text": [ 251 | "[]\n", 252 | "[{'opno': 0, 'rest': 2}]\n", 253 | "[{'opno': 0, 'rest': 2}, {'opno': 1, 'rest': 3}]\n", 254 | "[{'opno': 0, 'rest': 2}, {'opno': 1, 'rest': 2}]\n", 255 | "[{'opno': 0, 'rest': 2}, {'opno': 1, 'rest': 1}]\n", 256 | "[{'opno': 0, 'rest': 2}]\n", 257 | "[{'opno': 0, 'rest': 1}]\n", 258 | "[{'opno': 0, 'rest': 1}, {'opno': 1, 'rest': 3}]\n", 259 | "[{'opno': 0, 'rest': 1}, {'opno': 1, 'rest': 2}]\n", 260 | "[{'opno': 0, 'rest': 1}, {'opno': 1, 'rest': 1}]\n", 261 | "[{'opno': 0, 'rest': 1}]\n" 262 | ] 263 | }, 264 | { 265 | "data": { 266 | "image/png": "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\n", 267 | "text/plain": [ 268 | "
" 269 | ] 270 | }, 271 | "metadata": { 272 | "needs_background": "light" 273 | }, 274 | "output_type": "display_data" 275 | } 276 | ], 277 | "source": [ 278 | "draw('R2;R3;E0;E0')" 279 | ] 280 | }, 281 | { 282 | "cell_type": "code", 283 | "execution_count": null, 284 | "metadata": {}, 285 | "outputs": [], 286 | "source": [] 287 | } 288 | ], 289 | "metadata": { 290 | "kernelspec": { 291 | "display_name": "Python 3", 292 | "language": "python", 293 | "name": "python3" 294 | }, 295 | "language_info": { 296 | "codemirror_mode": { 297 | "name": "ipython", 298 | "version": 3 299 | }, 300 | "file_extension": ".py", 301 | "mimetype": "text/x-python", 302 | "name": "python", 303 | "nbconvert_exporter": "python", 304 | "pygments_lexer": "ipython3", 305 | "version": "3.8.5" 306 | } 307 | }, 308 | "nbformat": 4, 309 | "nbformat_minor": 2 310 | } 311 | -------------------------------------------------------------------------------- /first_edition/6-2-1_IPA_sample_question.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "### 6-2-1 サンプル問題 \n", 8 | "(2019年10月28日にIPA(情報処理推進機構)が公開したPythonのサンプル問題)" 9 | ] 10 | }, 11 | { 12 | "cell_type": "markdown", 13 | "metadata": {}, 14 | "source": [ 15 | "#### 〔プログラム〕" 16 | ] 17 | }, 18 | { 19 | "cell_type": "code", 20 | "execution_count": 1, 21 | "metadata": {}, 22 | "outputs": [], 23 | "source": [ 24 | "import math # 数学関数の標準ライブラリ\n", 25 | "import matplotlib.pyplot as plt # グラフ描画の外部ライブラリ\n", 26 | "\n", 27 | "def parse(s):\n", 28 | " return [(x[0], int(x[1:])) for x in s.split(';')]\n", 29 | "\n", 30 | "class Marker:\n", 31 | " def __init__(self):\n", 32 | " self.x, self.y, self.angle = 0, 0, 0\n", 33 | " plt.xlim(-320, 320) # x 軸の表示範囲を設定\n", 34 | " plt.ylim(-240, 240) # y 軸の表示範囲を設定\n", 35 | " \n", 36 | " def forward(self, val):\n", 37 | " # 度数表で表した角度を,ラジアンで表した角度に変換\n", 38 | " rad = math.radians(self.angle)\n", 39 | " dx = val * math.cos(rad)\n", 40 | " dy = val * math.sin(rad)\n", 41 | " x1, y1, x2, y2 = self.x, self.y, self.x + dx, self.y + dy\n", 42 | " # (x1, y1) と (x2, y2) を結ぶ線分を描画\n", 43 | " plt.plot([x1, x2], [y1, y2], color='black', linewidth=2)\n", 44 | " self.x, self.y = x2, y2\n", 45 | " \n", 46 | " def turn(self, val):\n", 47 | " self.angle = (self.angle + val) % 360\n", 48 | " \n", 49 | " def show(self):\n", 50 | " plt.show() # 描画結果を表示\n", 51 | "\n", 52 | "def draw(s):\n", 53 | " insts = parse(s)\n", 54 | " marker = Marker()\n", 55 | " stack = []\n", 56 | " opno = 0\n", 57 | " while opno < len(insts):\n", 58 | " print(stack)\n", 59 | " code, val = insts[opno]\n", 60 | " if code == 'F':\n", 61 | " marker.forward(val)\n", 62 | " elif code == 'T':\n", 63 | " marker.turn(val)\n", 64 | " elif code == 'R':\n", 65 | " stack.append({'opno': opno, 'rest': val})\n", 66 | " elif code == 'E':\n", 67 | " if stack[-1]['rest'] > 1:\n", 68 | " opno = stack[-1]['opno']\n", 69 | " stack[-1]['rest'] -= 1\n", 70 | " else:\n", 71 | " stack.pop()\n", 72 | " opno += 1\n", 73 | " marker.show()" 74 | ] 75 | }, 76 | { 77 | "cell_type": "markdown", 78 | "metadata": {}, 79 | "source": [ 80 | "図2,図3の例の実行結果" 81 | ] 82 | }, 83 | { 84 | "cell_type": "code", 85 | "execution_count": 4, 86 | "metadata": {}, 87 | "outputs": [ 88 | { 89 | "name": "stdout", 90 | "output_type": "stream", 91 | "text": [ 92 | "[]\n", 93 | "[{'opno': 0, 'rest': 3}]\n", 94 | "[{'opno': 0, 'rest': 3}, {'opno': 1, 'rest': 4}]\n", 95 | "[{'opno': 0, 'rest': 3}, {'opno': 1, 'rest': 4}]\n", 96 | "[{'opno': 0, 'rest': 3}, {'opno': 1, 'rest': 4}]\n", 97 | "[{'opno': 0, 'rest': 3}, {'opno': 1, 'rest': 3}]\n", 98 | "[{'opno': 0, 'rest': 3}, {'opno': 1, 'rest': 3}]\n", 99 | "[{'opno': 0, 'rest': 3}, {'opno': 1, 'rest': 3}]\n", 100 | "[{'opno': 0, 'rest': 3}, {'opno': 1, 'rest': 2}]\n", 101 | "[{'opno': 0, 'rest': 3}, {'opno': 1, 'rest': 2}]\n", 102 | "[{'opno': 0, 'rest': 3}, {'opno': 1, 'rest': 2}]\n", 103 | "[{'opno': 0, 'rest': 3}, {'opno': 1, 'rest': 1}]\n", 104 | "[{'opno': 0, 'rest': 3}, {'opno': 1, 'rest': 1}]\n", 105 | "[{'opno': 0, 'rest': 3}, {'opno': 1, 'rest': 1}]\n", 106 | "[{'opno': 0, 'rest': 3}]\n", 107 | "[{'opno': 0, 'rest': 3}]\n", 108 | "[{'opno': 0, 'rest': 2}]\n", 109 | "[{'opno': 0, 'rest': 2}, {'opno': 1, 'rest': 4}]\n", 110 | "[{'opno': 0, 'rest': 2}, {'opno': 1, 'rest': 4}]\n", 111 | "[{'opno': 0, 'rest': 2}, {'opno': 1, 'rest': 4}]\n", 112 | "[{'opno': 0, 'rest': 2}, {'opno': 1, 'rest': 3}]\n", 113 | "[{'opno': 0, 'rest': 2}, {'opno': 1, 'rest': 3}]\n", 114 | "[{'opno': 0, 'rest': 2}, {'opno': 1, 'rest': 3}]\n", 115 | "[{'opno': 0, 'rest': 2}, {'opno': 1, 'rest': 2}]\n", 116 | "[{'opno': 0, 'rest': 2}, {'opno': 1, 'rest': 2}]\n", 117 | "[{'opno': 0, 'rest': 2}, {'opno': 1, 'rest': 2}]\n", 118 | "[{'opno': 0, 'rest': 2}, {'opno': 1, 'rest': 1}]\n", 119 | "[{'opno': 0, 'rest': 2}, {'opno': 1, 'rest': 1}]\n", 120 | "[{'opno': 0, 'rest': 2}, {'opno': 1, 'rest': 1}]\n", 121 | "[{'opno': 0, 'rest': 2}]\n", 122 | "[{'opno': 0, 'rest': 2}]\n", 123 | "[{'opno': 0, 'rest': 1}]\n", 124 | "[{'opno': 0, 'rest': 1}, {'opno': 1, 'rest': 4}]\n", 125 | "[{'opno': 0, 'rest': 1}, {'opno': 1, 'rest': 4}]\n", 126 | "[{'opno': 0, 'rest': 1}, {'opno': 1, 'rest': 4}]\n", 127 | "[{'opno': 0, 'rest': 1}, {'opno': 1, 'rest': 3}]\n", 128 | "[{'opno': 0, 'rest': 1}, {'opno': 1, 'rest': 3}]\n", 129 | "[{'opno': 0, 'rest': 1}, {'opno': 1, 'rest': 3}]\n", 130 | "[{'opno': 0, 'rest': 1}, {'opno': 1, 'rest': 2}]\n", 131 | "[{'opno': 0, 'rest': 1}, {'opno': 1, 'rest': 2}]\n", 132 | "[{'opno': 0, 'rest': 1}, {'opno': 1, 'rest': 2}]\n", 133 | "[{'opno': 0, 'rest': 1}, {'opno': 1, 'rest': 1}]\n", 134 | "[{'opno': 0, 'rest': 1}, {'opno': 1, 'rest': 1}]\n", 135 | "[{'opno': 0, 'rest': 1}, {'opno': 1, 'rest': 1}]\n", 136 | "[{'opno': 0, 'rest': 1}]\n", 137 | "[{'opno': 0, 'rest': 1}]\n" 138 | ] 139 | }, 140 | { 141 | "data": { 142 | "image/png": "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\n", 143 | "text/plain": [ 144 | "
" 145 | ] 146 | }, 147 | "metadata": { 148 | "needs_background": "light" 149 | }, 150 | "output_type": "display_data" 151 | } 152 | ], 153 | "source": [ 154 | "draw('R3;R4;F100;T90;E0;F100;E0')" 155 | ] 156 | }, 157 | { 158 | "cell_type": "markdown", 159 | "metadata": {}, 160 | "source": [ 161 | "#### 設問1" 162 | ] 163 | }, 164 | { 165 | "cell_type": "code", 166 | "execution_count": 5, 167 | "metadata": {}, 168 | "outputs": [ 169 | { 170 | "name": "stdout", 171 | "output_type": "stream", 172 | "text": [ 173 | "[]\n", 174 | "[{'opno': 0, 'rest': 5}]\n", 175 | "[{'opno': 0, 'rest': 5}]\n", 176 | "[{'opno': 0, 'rest': 5}]\n", 177 | "[{'opno': 0, 'rest': 4}]\n", 178 | "[{'opno': 0, 'rest': 4}]\n", 179 | "[{'opno': 0, 'rest': 4}]\n", 180 | "[{'opno': 0, 'rest': 3}]\n", 181 | "[{'opno': 0, 'rest': 3}]\n", 182 | "[{'opno': 0, 'rest': 3}]\n", 183 | "[{'opno': 0, 'rest': 2}]\n", 184 | "[{'opno': 0, 'rest': 2}]\n", 185 | "[{'opno': 0, 'rest': 2}]\n", 186 | "[{'opno': 0, 'rest': 1}]\n", 187 | "[{'opno': 0, 'rest': 1}]\n", 188 | "[{'opno': 0, 'rest': 1}]\n" 189 | ] 190 | }, 191 | { 192 | "data": { 193 | "image/png": "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\n", 194 | "text/plain": [ 195 | "
" 196 | ] 197 | }, 198 | "metadata": { 199 | "needs_background": "light" 200 | }, 201 | "output_type": "display_data" 202 | } 203 | ], 204 | "source": [ 205 | "draw('R5;F100;T72;E0')" 206 | ] 207 | }, 208 | { 209 | "cell_type": "markdown", 210 | "metadata": {}, 211 | "source": [ 212 | "実行結果1" 213 | ] 214 | }, 215 | { 216 | "cell_type": "code", 217 | "execution_count": 2, 218 | "metadata": {}, 219 | "outputs": [ 220 | { 221 | "data": { 222 | "text/plain": [ 223 | "[('R', 4), ('F', 100), ('T', 90), ('E', 0)]" 224 | ] 225 | }, 226 | "execution_count": 2, 227 | "metadata": {}, 228 | "output_type": "execute_result" 229 | } 230 | ], 231 | "source": [ 232 | "parse('R4;F100;T90;E0')" 233 | ] 234 | }, 235 | { 236 | "cell_type": "markdown", 237 | "metadata": {}, 238 | "source": [ 239 | "実行結果2" 240 | ] 241 | }, 242 | { 243 | "cell_type": "code", 244 | "execution_count": 3, 245 | "metadata": {}, 246 | "outputs": [ 247 | { 248 | "name": "stdout", 249 | "output_type": "stream", 250 | "text": [ 251 | "[]\n", 252 | "[{'opno': 0, 'rest': 2}]\n", 253 | "[{'opno': 0, 'rest': 2}, {'opno': 1, 'rest': 3}]\n", 254 | "[{'opno': 0, 'rest': 2}, {'opno': 1, 'rest': 2}]\n", 255 | "[{'opno': 0, 'rest': 2}, {'opno': 1, 'rest': 1}]\n", 256 | "[{'opno': 0, 'rest': 2}]\n", 257 | "[{'opno': 0, 'rest': 1}]\n", 258 | "[{'opno': 0, 'rest': 1}, {'opno': 1, 'rest': 3}]\n", 259 | "[{'opno': 0, 'rest': 1}, {'opno': 1, 'rest': 2}]\n", 260 | "[{'opno': 0, 'rest': 1}, {'opno': 1, 'rest': 1}]\n", 261 | "[{'opno': 0, 'rest': 1}]\n" 262 | ] 263 | }, 264 | { 265 | "data": { 266 | "image/png": "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\n", 267 | "text/plain": [ 268 | "
" 269 | ] 270 | }, 271 | "metadata": { 272 | "needs_background": "light" 273 | }, 274 | "output_type": "display_data" 275 | } 276 | ], 277 | "source": [ 278 | "draw('R2;R3;E0;E0')" 279 | ] 280 | }, 281 | { 282 | "cell_type": "code", 283 | "execution_count": null, 284 | "metadata": {}, 285 | "outputs": [], 286 | "source": [] 287 | } 288 | ], 289 | "metadata": { 290 | "kernelspec": { 291 | "display_name": "Python 3", 292 | "language": "python", 293 | "name": "python3" 294 | }, 295 | "language_info": { 296 | "codemirror_mode": { 297 | "name": "ipython", 298 | "version": 3 299 | }, 300 | "file_extension": ".py", 301 | "mimetype": "text/x-python", 302 | "name": "python", 303 | "nbconvert_exporter": "python", 304 | "pygments_lexer": "ipython3", 305 | "version": "3.7.3" 306 | } 307 | }, 308 | "nbformat": 4, 309 | "nbformat_minor": 2 310 | } 311 | -------------------------------------------------------------------------------- /first_edition/Chapter 4. Python Text.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "### Python教科書 4章プログラム例" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "#### 4-1-1 オブジェクト指向" 15 | ] 16 | }, 17 | { 18 | "cell_type": "markdown", 19 | "metadata": {}, 20 | "source": [ 21 | "【例】クラスDogの定義" 22 | ] 23 | }, 24 | { 25 | "cell_type": "code", 26 | "execution_count": 1, 27 | "metadata": {}, 28 | "outputs": [], 29 | "source": [ 30 | "class Dog:\n", 31 | " def cry(self):\n", 32 | " print('ワン')" 33 | ] 34 | }, 35 | { 36 | "cell_type": "markdown", 37 | "metadata": {}, 38 | "source": [ 39 | "【例】クラスDogからインスタンスpochiとshiroを生成" 40 | ] 41 | }, 42 | { 43 | "cell_type": "code", 44 | "execution_count": 2, 45 | "metadata": {}, 46 | "outputs": [], 47 | "source": [ 48 | "pochi = Dog()\n", 49 | "shiro = Dog()" 50 | ] 51 | }, 52 | { 53 | "cell_type": "markdown", 54 | "metadata": {}, 55 | "source": [ 56 | "【例】クラスDogで生成したインスタンスでメソッドcry()を実行" 57 | ] 58 | }, 59 | { 60 | "cell_type": "code", 61 | "execution_count": 3, 62 | "metadata": {}, 63 | "outputs": [ 64 | { 65 | "name": "stdout", 66 | "output_type": "stream", 67 | "text": [ 68 | "ワン\n" 69 | ] 70 | } 71 | ], 72 | "source": [ 73 | "pochi.cry()" 74 | ] 75 | }, 76 | { 77 | "cell_type": "code", 78 | "execution_count": 4, 79 | "metadata": {}, 80 | "outputs": [ 81 | { 82 | "name": "stdout", 83 | "output_type": "stream", 84 | "text": [ 85 | "ワン\n" 86 | ] 87 | } 88 | ], 89 | "source": [ 90 | "shiro.cry()" 91 | ] 92 | }, 93 | { 94 | "cell_type": "markdown", 95 | "metadata": {}, 96 | "source": [ 97 | "【例】クラスDogを継承してサブクラスShibaInuを定義" 98 | ] 99 | }, 100 | { 101 | "cell_type": "code", 102 | "execution_count": 5, 103 | "metadata": {}, 104 | "outputs": [], 105 | "source": [ 106 | "class ShibaInu(Dog): # クラスDogを継承してサブクラスShibaInuを定義\n", 107 | " def wait(self): # 新たなメソッドwait()を定義\n", 108 | " print('待つ')" 109 | ] 110 | }, 111 | { 112 | "cell_type": "markdown", 113 | "metadata": {}, 114 | "source": [ 115 | "【例】クラスShibaInuのインスタンスを作成" 116 | ] 117 | }, 118 | { 119 | "cell_type": "code", 120 | "execution_count": 6, 121 | "metadata": {}, 122 | "outputs": [ 123 | { 124 | "name": "stdout", 125 | "output_type": "stream", 126 | "text": [ 127 | "待つ\n" 128 | ] 129 | } 130 | ], 131 | "source": [ 132 | "hachi = ShibaInu()\n", 133 | "hachi.wait()" 134 | ] 135 | }, 136 | { 137 | "cell_type": "markdown", 138 | "metadata": {}, 139 | "source": [ 140 | "【例】クラスDogのメソッドを実行" 141 | ] 142 | }, 143 | { 144 | "cell_type": "code", 145 | "execution_count": 7, 146 | "metadata": {}, 147 | "outputs": [ 148 | { 149 | "name": "stdout", 150 | "output_type": "stream", 151 | "text": [ 152 | "ワン\n" 153 | ] 154 | } 155 | ], 156 | "source": [ 157 | "hachi.cry()" 158 | ] 159 | }, 160 | { 161 | "cell_type": "markdown", 162 | "metadata": {}, 163 | "source": [ 164 | "【例】標準ライブラリabcを利用した抽象クラスの作成" 165 | ] 166 | }, 167 | { 168 | "cell_type": "code", 169 | "execution_count": 8, 170 | "metadata": {}, 171 | "outputs": [], 172 | "source": [ 173 | "# ポリモーフィズムのための標準ライブラリabcからインポート\n", 174 | "from abc import ABCMeta, abstractmethod \n", 175 | "\n", 176 | "# 元となる動物クラス\n", 177 | "class Animal(metaclass = ABCMeta): # 抽象クラス ABCMeta を利用\n", 178 | " @abstractmethod # インポートした抽象メソッドabstractmethodを使用\n", 179 | " def cry(self): # 抽象メソッドcry()を定義\n", 180 | " pass # 何もしない\n", 181 | "\n", 182 | "# クラスDog\n", 183 | "class Dog(Animal): # Animalクラスを継承\n", 184 | " def cry(self): # 犬の鳴き方でcry()をオーバライド \n", 185 | " print('ワン')\n", 186 | "\n", 187 | "# クラスCat\n", 188 | "class Cat(Animal): # Animalクラスを継承\n", 189 | " def cry(self): # 猫の鳴き方でcry()をオーバライド \n", 190 | " print('ニャー')" 191 | ] 192 | }, 193 | { 194 | "cell_type": "markdown", 195 | "metadata": {}, 196 | "source": [ 197 | "【例】継承クラスでメソッドを実行" 198 | ] 199 | }, 200 | { 201 | "cell_type": "code", 202 | "execution_count": 9, 203 | "metadata": {}, 204 | "outputs": [ 205 | { 206 | "name": "stdout", 207 | "output_type": "stream", 208 | "text": [ 209 | "ワン\n" 210 | ] 211 | } 212 | ], 213 | "source": [ 214 | "pochi = Dog()\n", 215 | "tama = Cat()\n", 216 | "\n", 217 | "pochi.cry()" 218 | ] 219 | }, 220 | { 221 | "cell_type": "code", 222 | "execution_count": 10, 223 | "metadata": {}, 224 | "outputs": [ 225 | { 226 | "name": "stdout", 227 | "output_type": "stream", 228 | "text": [ 229 | "ニャー\n" 230 | ] 231 | } 232 | ], 233 | "source": [ 234 | "tama.cry()" 235 | ] 236 | }, 237 | { 238 | "cell_type": "markdown", 239 | "metadata": {}, 240 | "source": [ 241 | "【例】メソッド__init__()による変数の初期設定" 242 | ] 243 | }, 244 | { 245 | "cell_type": "code", 246 | "execution_count": 11, 247 | "metadata": {}, 248 | "outputs": [], 249 | "source": [ 250 | "class Dog:\n", 251 | " def __init__(self, name, weight): # 初期設定する特殊メソッド__init__\n", 252 | " self.name = name # self.nameは通常のインスタンス変数\n", 253 | " self.__weight = weight # self.__weightはプライベート変数" 254 | ] 255 | }, 256 | { 257 | "cell_type": "markdown", 258 | "metadata": {}, 259 | "source": [ 260 | "【例】プライベート変数の定義後にインスタンスを生成" 261 | ] 262 | }, 263 | { 264 | "cell_type": "code", 265 | "execution_count": 12, 266 | "metadata": {}, 267 | "outputs": [ 268 | { 269 | "name": "stdout", 270 | "output_type": "stream", 271 | "text": [ 272 | "ポチ\n" 273 | ] 274 | } 275 | ], 276 | "source": [ 277 | "pochi = Dog('ポチ', 20) # nameに'ポチ',weightに20を設定\n", 278 | "print(pochi.name)" 279 | ] 280 | }, 281 | { 282 | "cell_type": "markdown", 283 | "metadata": {}, 284 | "source": [ 285 | "【例】プライベート変数の表示(エラー)" 286 | ] 287 | }, 288 | { 289 | "cell_type": "code", 290 | "execution_count": 13, 291 | "metadata": {}, 292 | "outputs": [ 293 | { 294 | "ename": "AttributeError", 295 | "evalue": "'Dog' object has no attribute '__weight'", 296 | "output_type": "error", 297 | "traceback": [ 298 | "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", 299 | "\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)", 300 | "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mpochi\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m__weight\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", 301 | "\u001b[1;31mAttributeError\u001b[0m: 'Dog' object has no attribute '__weight'" 302 | ] 303 | } 304 | ], 305 | "source": [ 306 | "print(pochi.__weight)" 307 | ] 308 | }, 309 | { 310 | "cell_type": "markdown", 311 | "metadata": {}, 312 | "source": [ 313 | "【例】プライベート変数へのアクセスのためにメソッドを定義" 314 | ] 315 | }, 316 | { 317 | "cell_type": "code", 318 | "execution_count": 14, 319 | "metadata": {}, 320 | "outputs": [], 321 | "source": [ 322 | "class Dog:\n", 323 | " def __init__(self, name, weight):\n", 324 | " self.name = name \n", 325 | " self.__weight = weight # __weightはプライベート変数\n", 326 | " \n", 327 | " def getWeight(self): # __weightのゲッター\n", 328 | " return self.__weight # __weightの値を返却\n", 329 | " \n", 330 | " def setWeight(self, weight): # __weightのセッター\n", 331 | " self.__weight = weight # __weightに値を設定" 332 | ] 333 | }, 334 | { 335 | "cell_type": "markdown", 336 | "metadata": {}, 337 | "source": [ 338 | "【例】ゲッターによる値の取得" 339 | ] 340 | }, 341 | { 342 | "cell_type": "code", 343 | "execution_count": 15, 344 | "metadata": {}, 345 | "outputs": [ 346 | { 347 | "name": "stdout", 348 | "output_type": "stream", 349 | "text": [ 350 | "20\n" 351 | ] 352 | } 353 | ], 354 | "source": [ 355 | "pochi = Dog('ポチ', 20) # nameに'ポチ',__weightに20を設定\n", 356 | "print(pochi.getWeight()) # ゲッターで,__weightの値を取得して表示" 357 | ] 358 | }, 359 | { 360 | "cell_type": "markdown", 361 | "metadata": {}, 362 | "source": [ 363 | "【例】セッターによる値の設定" 364 | ] 365 | }, 366 | { 367 | "cell_type": "code", 368 | "execution_count": 16, 369 | "metadata": {}, 370 | "outputs": [ 371 | { 372 | "name": "stdout", 373 | "output_type": "stream", 374 | "text": [ 375 | "25\n" 376 | ] 377 | } 378 | ], 379 | "source": [ 380 | "pochi.setWeight(25) # セッターで,__weightに25を設定\n", 381 | "print(pochi.getWeight()) # ゲッターで,__weightの値を取得して表示" 382 | ] 383 | }, 384 | { 385 | "cell_type": "markdown", 386 | "metadata": {}, 387 | "source": [ 388 | "【例】クラスPersonとクラスDogを定義" 389 | ] 390 | }, 391 | { 392 | "cell_type": "code", 393 | "execution_count": 17, 394 | "metadata": {}, 395 | "outputs": [], 396 | "source": [ 397 | "class Person: # 人間クラス\n", 398 | " def __init__(self, name):\n", 399 | " self.name = name\n", 400 | " def hello(self): # hello()メソッド\n", 401 | " print('こんにちは') # 実際に挨拶をするのは人間\n", 402 | "\n", 403 | "class Dog:\n", 404 | " def __init__(self, name, owner):\n", 405 | " self.name = name\n", 406 | " self.owner = owner # ownerに,人間クラスのインスタンスを設定\n", 407 | " def hello(self): # hello()メソッド\n", 408 | " self.owner.hello() # ownerに,hello()メソッドの実行を委譲 " 409 | ] 410 | }, 411 | { 412 | "cell_type": "markdown", 413 | "metadata": {}, 414 | "source": [ 415 | "【例】クラスPersonのインスタンスkenをクラスDogのオーナーに設定" 416 | ] 417 | }, 418 | { 419 | "cell_type": "code", 420 | "execution_count": 18, 421 | "metadata": {}, 422 | "outputs": [], 423 | "source": [ 424 | "ken = Person('けん')\n", 425 | "pochi = Dog('ポチ', ken)" 426 | ] 427 | }, 428 | { 429 | "cell_type": "markdown", 430 | "metadata": {}, 431 | "source": [ 432 | "【例】インスタンスpochiのオーナーを出力" 433 | ] 434 | }, 435 | { 436 | "cell_type": "code", 437 | "execution_count": 19, 438 | "metadata": {}, 439 | "outputs": [ 440 | { 441 | "name": "stdout", 442 | "output_type": "stream", 443 | "text": [ 444 | "けん\n" 445 | ] 446 | } 447 | ], 448 | "source": [ 449 | "print(pochi.owner.name)" 450 | ] 451 | }, 452 | { 453 | "cell_type": "markdown", 454 | "metadata": {}, 455 | "source": [ 456 | "【例】クラスDogからクラスPersonへの処理の委譲" 457 | ] 458 | }, 459 | { 460 | "cell_type": "code", 461 | "execution_count": 20, 462 | "metadata": {}, 463 | "outputs": [ 464 | { 465 | "name": "stdout", 466 | "output_type": "stream", 467 | "text": [ 468 | "こんにちは\n" 469 | ] 470 | } 471 | ], 472 | "source": [ 473 | "pochi.hello()" 474 | ] 475 | }, 476 | { 477 | "cell_type": "markdown", 478 | "metadata": {}, 479 | "source": [ 480 | "#### 4-2-1 クラス" 481 | ] 482 | }, 483 | { 484 | "cell_type": "markdown", 485 | "metadata": {}, 486 | "source": [ 487 | "【例】クラスの定義" 488 | ] 489 | }, 490 | { 491 | "cell_type": "code", 492 | "execution_count": 21, 493 | "metadata": {}, 494 | "outputs": [], 495 | "source": [ 496 | "class Car:\n", 497 | " kind = 'car'\n", 498 | " def run(self):\n", 499 | " print('Car is running.')" 500 | ] 501 | }, 502 | { 503 | "cell_type": "markdown", 504 | "metadata": {}, 505 | "source": [ 506 | "【例】クラスCar の属性を参照" 507 | ] 508 | }, 509 | { 510 | "cell_type": "code", 511 | "execution_count": 22, 512 | "metadata": {}, 513 | "outputs": [ 514 | { 515 | "data": { 516 | "text/plain": [ 517 | "'car'" 518 | ] 519 | }, 520 | "execution_count": 22, 521 | "metadata": {}, 522 | "output_type": "execute_result" 523 | } 524 | ], 525 | "source": [ 526 | "Car.kind" 527 | ] 528 | }, 529 | { 530 | "cell_type": "markdown", 531 | "metadata": {}, 532 | "source": [ 533 | "【例】クラスCarでのインスタンス生成" 534 | ] 535 | }, 536 | { 537 | "cell_type": "code", 538 | "execution_count": 23, 539 | "metadata": {}, 540 | "outputs": [], 541 | "source": [ 542 | "tesla = Car()" 543 | ] 544 | }, 545 | { 546 | "cell_type": "markdown", 547 | "metadata": {}, 548 | "source": [ 549 | "【例】クラスCarでのメソッドの実行" 550 | ] 551 | }, 552 | { 553 | "cell_type": "code", 554 | "execution_count": 24, 555 | "metadata": {}, 556 | "outputs": [ 557 | { 558 | "name": "stdout", 559 | "output_type": "stream", 560 | "text": [ 561 | "Car is running.\n" 562 | ] 563 | } 564 | ], 565 | "source": [ 566 | "tesla.run()" 567 | ] 568 | }, 569 | { 570 | "cell_type": "markdown", 571 | "metadata": {}, 572 | "source": [ 573 | "【例】クラスCarで初期値に属性nameを定義" 574 | ] 575 | }, 576 | { 577 | "cell_type": "code", 578 | "execution_count": 25, 579 | "metadata": {}, 580 | "outputs": [], 581 | "source": [ 582 | "class Car:\n", 583 | " def __init__(self, name):\n", 584 | " self.name = name" 585 | ] 586 | }, 587 | { 588 | "cell_type": "markdown", 589 | "metadata": {}, 590 | "source": [ 591 | "【例】インスタンスtesla作成時に属性nameに値を設定" 592 | ] 593 | }, 594 | { 595 | "cell_type": "code", 596 | "execution_count": 26, 597 | "metadata": {}, 598 | "outputs": [], 599 | "source": [ 600 | "tesla = Car('model 3')" 601 | ] 602 | }, 603 | { 604 | "cell_type": "markdown", 605 | "metadata": {}, 606 | "source": [ 607 | "【例】インスタンスteslaの属性nameを表示" 608 | ] 609 | }, 610 | { 611 | "cell_type": "code", 612 | "execution_count": 27, 613 | "metadata": {}, 614 | "outputs": [ 615 | { 616 | "name": "stdout", 617 | "output_type": "stream", 618 | "text": [ 619 | "model 3\n" 620 | ] 621 | } 622 | ], 623 | "source": [ 624 | "print(tesla.name)" 625 | ] 626 | }, 627 | { 628 | "cell_type": "markdown", 629 | "metadata": {}, 630 | "source": [ 631 | "【例】クラスCarを継承してサブクラスTruckを定義" 632 | ] 633 | }, 634 | { 635 | "cell_type": "code", 636 | "execution_count": 28, 637 | "metadata": {}, 638 | "outputs": [], 639 | "source": [ 640 | "class Truck(Car):\n", 641 | " pass" 642 | ] 643 | }, 644 | { 645 | "cell_type": "markdown", 646 | "metadata": {}, 647 | "source": [ 648 | "【例】スーパクラスCarを継承したサブクラスTruckの実行" 649 | ] 650 | }, 651 | { 652 | "cell_type": "code", 653 | "execution_count": 29, 654 | "metadata": {}, 655 | "outputs": [ 656 | { 657 | "name": "stdout", 658 | "output_type": "stream", 659 | "text": [ 660 | "Cyber Truck\n" 661 | ] 662 | } 663 | ], 664 | "source": [ 665 | "cybertruck = Truck('Cyber Truck')\n", 666 | "print(cybertruck.name)" 667 | ] 668 | }, 669 | { 670 | "cell_type": "markdown", 671 | "metadata": {}, 672 | "source": [ 673 | "【例】スーパクラスCarのメソッドをサブクラスTruckで上書き" 674 | ] 675 | }, 676 | { 677 | "cell_type": "code", 678 | "execution_count": 30, 679 | "metadata": {}, 680 | "outputs": [], 681 | "source": [ 682 | "class Car: # Carクラスを定義\n", 683 | " def exclaim(self): # メソッドexclaim()を定義\n", 684 | " print('I am a car.')\n", 685 | "\n", 686 | "class Truck(Car): # Carクラスを継承してTruckクラスを定義\n", 687 | " def exclaim(self): # メソッドexclaim()をオーバライド\n", 688 | " print('I am a truck.')" 689 | ] 690 | }, 691 | { 692 | "cell_type": "markdown", 693 | "metadata": {}, 694 | "source": [ 695 | "【例】スーパクラスCarとサブクラスTruckのインスタンスで同じメソッドを実行" 696 | ] 697 | }, 698 | { 699 | "cell_type": "code", 700 | "execution_count": 31, 701 | "metadata": {}, 702 | "outputs": [ 703 | { 704 | "name": "stdout", 705 | "output_type": "stream", 706 | "text": [ 707 | "I am a car.\n" 708 | ] 709 | } 710 | ], 711 | "source": [ 712 | "tesla = Car()\n", 713 | "cybertruck = Truck()\n", 714 | "tesla.exclaim()" 715 | ] 716 | }, 717 | { 718 | "cell_type": "code", 719 | "execution_count": 32, 720 | "metadata": {}, 721 | "outputs": [ 722 | { 723 | "name": "stdout", 724 | "output_type": "stream", 725 | "text": [ 726 | "I am a truck.\n" 727 | ] 728 | } 729 | ], 730 | "source": [ 731 | "cybertruck.exclaim()" 732 | ] 733 | }, 734 | { 735 | "cell_type": "markdown", 736 | "metadata": {}, 737 | "source": [ 738 | "【例】サブクラスTruckにだけメソッドを追加" 739 | ] 740 | }, 741 | { 742 | "cell_type": "code", 743 | "execution_count": 33, 744 | "metadata": {}, 745 | "outputs": [], 746 | "source": [ 747 | "class Car:\n", 748 | " def exclaim(self):\n", 749 | " print('I am a car.')\n", 750 | "\n", 751 | "class Truck(Car):\n", 752 | " def exclaim(self): # メソッドexclaim()をオーバライド\n", 753 | " print('I am a truck.')\n", 754 | " def baggage(self): # 新しいメソッドbaggage()の追加\n", 755 | " print('I can carry baggage.')" 756 | ] 757 | }, 758 | { 759 | "cell_type": "markdown", 760 | "metadata": {}, 761 | "source": [ 762 | "【例】サブクラスTruckにインスタンスを生成して追加したメソッドを実行" 763 | ] 764 | }, 765 | { 766 | "cell_type": "code", 767 | "execution_count": 34, 768 | "metadata": {}, 769 | "outputs": [ 770 | { 771 | "name": "stdout", 772 | "output_type": "stream", 773 | "text": [ 774 | "I can carry baggage.\n" 775 | ] 776 | } 777 | ], 778 | "source": [ 779 | "cybertruck = Truck()\n", 780 | "cybertruck.baggage()" 781 | ] 782 | }, 783 | { 784 | "cell_type": "markdown", 785 | "metadata": {}, 786 | "source": [ 787 | "【例】スーパクラスCarのメソッドをサブクラスTruckで実行" 788 | ] 789 | }, 790 | { 791 | "cell_type": "code", 792 | "execution_count": 35, 793 | "metadata": {}, 794 | "outputs": [], 795 | "source": [ 796 | "class Car:\n", 797 | " def exclaim(self):\n", 798 | " print('I am a car.')\n", 799 | "\n", 800 | "class Truck(Car):\n", 801 | " def exclaim(self):\n", 802 | " super().exclaim() # スーパクラスのexclaim()を利用\n", 803 | " print('I am a truck.')" 804 | ] 805 | }, 806 | { 807 | "cell_type": "markdown", 808 | "metadata": {}, 809 | "source": [ 810 | "【例】クラスTruckのインスタンスを生成してメソッドを実行" 811 | ] 812 | }, 813 | { 814 | "cell_type": "code", 815 | "execution_count": 36, 816 | "metadata": {}, 817 | "outputs": [ 818 | { 819 | "name": "stdout", 820 | "output_type": "stream", 821 | "text": [ 822 | "I am a car.\n", 823 | "I am a truck.\n" 824 | ] 825 | } 826 | ], 827 | "source": [ 828 | "cybertruck = Truck()\n", 829 | "cybertruck.exclaim()" 830 | ] 831 | }, 832 | { 833 | "cell_type": "markdown", 834 | "metadata": {}, 835 | "source": [ 836 | "#### 4-2-2 クラスの応用" 837 | ] 838 | }, 839 | { 840 | "cell_type": "markdown", 841 | "metadata": {}, 842 | "source": [ 843 | "【例】インスタンス変数とクラス変数の作成" 844 | ] 845 | }, 846 | { 847 | "cell_type": "code", 848 | "execution_count": 37, 849 | "metadata": {}, 850 | "outputs": [], 851 | "source": [ 852 | "class Dog:\n", 853 | " count = 0 # countはクラス変数\n", 854 | " def __init__(self, name):\n", 855 | " self.name = name # nameはインスタンス変数\n", 856 | " Dog.count += 1 # インスタンス作成ごとに,countに1を加える" 857 | ] 858 | }, 859 | { 860 | "cell_type": "markdown", 861 | "metadata": {}, 862 | "source": [ 863 | "【例】複数のインスタンスでインスタンス変数とクラス変数を表示" 864 | ] 865 | }, 866 | { 867 | "cell_type": "code", 868 | "execution_count": 38, 869 | "metadata": {}, 870 | "outputs": [ 871 | { 872 | "name": "stdout", 873 | "output_type": "stream", 874 | "text": [ 875 | "犬の名前: ポチ シロ ハチ\n", 876 | "犬の数 : 3\n" 877 | ] 878 | } 879 | ], 880 | "source": [ 881 | "pochi = Dog('ポチ')\n", 882 | "shiro = Dog('シロ')\n", 883 | "hachi = Dog('ハチ')\n", 884 | "print('犬の名前:', pochi.name, shiro.name, hachi.name)\n", 885 | "print('犬の数 :', Dog.count)" 886 | ] 887 | }, 888 | { 889 | "cell_type": "markdown", 890 | "metadata": {}, 891 | "source": [ 892 | "【例】クラス変数countの内容を表示するクラスメソッドdisplay()を追加" 893 | ] 894 | }, 895 | { 896 | "cell_type": "code", 897 | "execution_count": 39, 898 | "metadata": {}, 899 | "outputs": [], 900 | "source": [ 901 | "class Dog:\n", 902 | " count = 0 # countはクラス変数\n", 903 | " def __init__(self, name):\n", 904 | " self.name = name # nameはインスタンス変数\n", 905 | " Dog.count += 1 # インスタンス作成ごとに,countに1を加える\n", 906 | " @classmethod # クラスメソッドを示すデコレータ\n", 907 | " def display(cls): # クラスメソッド。clsはクラス自体を指す\n", 908 | " print('Dogクラスには,犬が', cls.count, '匹います。')" 909 | ] 910 | }, 911 | { 912 | "cell_type": "markdown", 913 | "metadata": {}, 914 | "source": [ 915 | "【例】複数のインスタンスを作成してからクラスメソッドを実行" 916 | ] 917 | }, 918 | { 919 | "cell_type": "code", 920 | "execution_count": 40, 921 | "metadata": {}, 922 | "outputs": [ 923 | { 924 | "name": "stdout", 925 | "output_type": "stream", 926 | "text": [ 927 | "Dogクラスには,犬が 3 匹います。\n" 928 | ] 929 | } 930 | ], 931 | "source": [ 932 | "pochi = Dog('ポチ')\n", 933 | "shiro = Dog('シロ')\n", 934 | "hachi = Dog('ハチ')\n", 935 | "Dog.display()" 936 | ] 937 | }, 938 | { 939 | "cell_type": "markdown", 940 | "metadata": {}, 941 | "source": [ 942 | "【例】クラスDogで作成したインスタンスを表示(デフォルト)" 943 | ] 944 | }, 945 | { 946 | "cell_type": "code", 947 | "execution_count": 41, 948 | "metadata": {}, 949 | "outputs": [ 950 | { 951 | "name": "stdout", 952 | "output_type": "stream", 953 | "text": [ 954 | "<__main__.Dog object at 0x000001C1D3A3C160>\n" 955 | ] 956 | } 957 | ], 958 | "source": [ 959 | "pochi = Dog('ポチ')\n", 960 | "print(pochi)" 961 | ] 962 | }, 963 | { 964 | "cell_type": "markdown", 965 | "metadata": {}, 966 | "source": [ 967 | "【例】__repr__()による表示方法の定義" 968 | ] 969 | }, 970 | { 971 | "cell_type": "code", 972 | "execution_count": 42, 973 | "metadata": {}, 974 | "outputs": [], 975 | "source": [ 976 | "class Dog:\n", 977 | " def __init__(self, name):\n", 978 | " self.name = name\n", 979 | " def __repr__(self): # オブジェクトの表現方法を指定\n", 980 | " return 'Dog object ' + self.name" 981 | ] 982 | }, 983 | { 984 | "cell_type": "markdown", 985 | "metadata": {}, 986 | "source": [ 987 | "【例】クラスDogで作成したインスタンスを表示(__repr__()使用時)" 988 | ] 989 | }, 990 | { 991 | "cell_type": "code", 992 | "execution_count": 43, 993 | "metadata": {}, 994 | "outputs": [ 995 | { 996 | "name": "stdout", 997 | "output_type": "stream", 998 | "text": [ 999 | "Dog object ポチ\n" 1000 | ] 1001 | } 1002 | ], 1003 | "source": [ 1004 | "pochi = Dog('ポチ')\n", 1005 | "print(pochi)" 1006 | ] 1007 | }, 1008 | { 1009 | "cell_type": "markdown", 1010 | "metadata": {}, 1011 | "source": [ 1012 | "【例】1週間を表すクラスWeek\n", 1013 | "* enumは,Python3.4からの新機能です" 1014 | ] 1015 | }, 1016 | { 1017 | "cell_type": "code", 1018 | "execution_count": 44, 1019 | "metadata": {}, 1020 | "outputs": [], 1021 | "source": [ 1022 | "from enum import Enum\n", 1023 | "\n", 1024 | "class Week(Enum):\n", 1025 | " MONDAY = 1\n", 1026 | " TUESDAY = 2\n", 1027 | " WEDNESDAY = 3\n", 1028 | " THURSDAY = 4\n", 1029 | " FRIDAY = 5\n", 1030 | " SATURDAY = 6\n", 1031 | " SUNDAY = 7" 1032 | ] 1033 | }, 1034 | { 1035 | "cell_type": "markdown", 1036 | "metadata": {}, 1037 | "source": [ 1038 | "【例】クラスWeekに変数を設定" 1039 | ] 1040 | }, 1041 | { 1042 | "cell_type": "code", 1043 | "execution_count": 45, 1044 | "metadata": {}, 1045 | "outputs": [ 1046 | { 1047 | "name": "stdout", 1048 | "output_type": "stream", 1049 | "text": [ 1050 | "Week.SUNDAY\n" 1051 | ] 1052 | } 1053 | ], 1054 | "source": [ 1055 | "week_today = Week.SUNDAY\n", 1056 | "print(week_today)" 1057 | ] 1058 | }, 1059 | { 1060 | "cell_type": "markdown", 1061 | "metadata": {}, 1062 | "source": [ 1063 | "【例】auto()を用いたクラスWeekの定義\n", 1064 | "* auto()は,Python3.6からの新機能です" 1065 | ] 1066 | }, 1067 | { 1068 | "cell_type": "code", 1069 | "execution_count": 46, 1070 | "metadata": { 1071 | "scrolled": true 1072 | }, 1073 | "outputs": [], 1074 | "source": [ 1075 | "from enum import Enum, auto\n", 1076 | "\n", 1077 | "class Week(Enum):\n", 1078 | " MONDAY = auto()\n", 1079 | " TUESDAY = auto()\n", 1080 | " WEDNESDAY = auto()\n", 1081 | " THURSDAY = auto()\n", 1082 | " FRIDAY = auto()\n", 1083 | " SATURDAY = auto()\n", 1084 | " SUNDAY = auto()" 1085 | ] 1086 | }, 1087 | { 1088 | "cell_type": "markdown", 1089 | "metadata": {}, 1090 | "source": [ 1091 | "【例】クラスWeekに割り当てられた数字を表示" 1092 | ] 1093 | }, 1094 | { 1095 | "cell_type": "code", 1096 | "execution_count": 47, 1097 | "metadata": {}, 1098 | "outputs": [ 1099 | { 1100 | "name": "stdout", 1101 | "output_type": "stream", 1102 | "text": [ 1103 | "SUNDAY 7\n" 1104 | ] 1105 | } 1106 | ], 1107 | "source": [ 1108 | "print(Week.SUNDAY.name, Week.SUNDAY.value)" 1109 | ] 1110 | }, 1111 | { 1112 | "cell_type": "markdown", 1113 | "metadata": {}, 1114 | "source": [ 1115 | "#### 4-2-3 演習問題" 1116 | ] 1117 | }, 1118 | { 1119 | "cell_type": "markdown", 1120 | "metadata": {}, 1121 | "source": [ 1122 | "問1 インスタンスの作成" 1123 | ] 1124 | }, 1125 | { 1126 | "cell_type": "code", 1127 | "execution_count": 48, 1128 | "metadata": {}, 1129 | "outputs": [ 1130 | { 1131 | "name": "stdout", 1132 | "output_type": "stream", 1133 | "text": [ 1134 | "ベンノ\n", 1135 | "マイン\n" 1136 | ] 1137 | } 1138 | ], 1139 | "source": [ 1140 | "class Student:\n", 1141 | " def __init__(self, teacher, mentor):\n", 1142 | " self.teacher = teacher\n", 1143 | " self.mentor = mentor\n", 1144 | "\n", 1145 | "luts = Student('マイン', 'ベンノ')\n", 1146 | "print(luts.mentor)\n", 1147 | "print(luts.teacher)" 1148 | ] 1149 | }, 1150 | { 1151 | "cell_type": "markdown", 1152 | "metadata": {}, 1153 | "source": [ 1154 | "問2 継承" 1155 | ] 1156 | }, 1157 | { 1158 | "cell_type": "code", 1159 | "execution_count": 49, 1160 | "metadata": {}, 1161 | "outputs": [], 1162 | "source": [ 1163 | "class Car:\n", 1164 | " def drive(self):\n", 1165 | " print('Car is driving')\n", 1166 | "\n", 1167 | "class Truck(Car):\n", 1168 | " def carry(self):\n", 1169 | " print('Truck is carrying')" 1170 | ] 1171 | }, 1172 | { 1173 | "cell_type": "code", 1174 | "execution_count": 50, 1175 | "metadata": {}, 1176 | "outputs": [ 1177 | { 1178 | "name": "stdout", 1179 | "output_type": "stream", 1180 | "text": [ 1181 | "Car is driving\n" 1182 | ] 1183 | } 1184 | ], 1185 | "source": [ 1186 | "cybertruck = Truck()\n", 1187 | "cybertruck.drive()" 1188 | ] 1189 | }, 1190 | { 1191 | "cell_type": "markdown", 1192 | "metadata": {}, 1193 | "source": [ 1194 | "問3 クラス変数" 1195 | ] 1196 | }, 1197 | { 1198 | "cell_type": "code", 1199 | "execution_count": 51, 1200 | "metadata": {}, 1201 | "outputs": [], 1202 | "source": [ 1203 | "class Practice:\n", 1204 | " data_list = []\n", 1205 | " \n", 1206 | " def add_data_list(self, data):\n", 1207 | " self.data_list.append(data)" 1208 | ] 1209 | }, 1210 | { 1211 | "cell_type": "code", 1212 | "execution_count": 52, 1213 | "metadata": {}, 1214 | "outputs": [], 1215 | "source": [ 1216 | "practice1 = Practice()\n", 1217 | "practice1.add_data_list(\"data 1\")\n", 1218 | "\n", 1219 | "practice2 = Practice()\n", 1220 | "practice2.add_data_list(\"data 2\")" 1221 | ] 1222 | }, 1223 | { 1224 | "cell_type": "code", 1225 | "execution_count": 53, 1226 | "metadata": {}, 1227 | "outputs": [ 1228 | { 1229 | "name": "stdout", 1230 | "output_type": "stream", 1231 | "text": [ 1232 | "data_list: data 1 data 2 " 1233 | ] 1234 | } 1235 | ], 1236 | "source": [ 1237 | "print(\"data_list:\", end=\" \")\n", 1238 | "for data in practice1.data_list:\n", 1239 | " print(data, end=\" \")" 1240 | ] 1241 | }, 1242 | { 1243 | "cell_type": "code", 1244 | "execution_count": 54, 1245 | "metadata": {}, 1246 | "outputs": [ 1247 | { 1248 | "data": { 1249 | "text/plain": [ 1250 | "['data 1', 'data 2']" 1251 | ] 1252 | }, 1253 | "execution_count": 54, 1254 | "metadata": {}, 1255 | "output_type": "execute_result" 1256 | } 1257 | ], 1258 | "source": [ 1259 | "Practice.data_list" 1260 | ] 1261 | }, 1262 | { 1263 | "cell_type": "code", 1264 | "execution_count": null, 1265 | "metadata": {}, 1266 | "outputs": [], 1267 | "source": [] 1268 | } 1269 | ], 1270 | "metadata": { 1271 | "kernelspec": { 1272 | "display_name": "Python 3", 1273 | "language": "python", 1274 | "name": "python3" 1275 | }, 1276 | "language_info": { 1277 | "codemirror_mode": { 1278 | "name": "ipython", 1279 | "version": 3 1280 | }, 1281 | "file_extension": ".py", 1282 | "mimetype": "text/x-python", 1283 | "name": "python", 1284 | "nbconvert_exporter": "python", 1285 | "pygments_lexer": "ipython3", 1286 | "version": "3.7.3" 1287 | } 1288 | }, 1289 | "nbformat": 4, 1290 | "nbformat_minor": 2 1291 | } 1292 | --------------------------------------------------------------------------------