From dab0b7ccf227549aea2c1f56580bb2b6d4f43ea7 Mon Sep 17 00:00:00 2001 From: chvmvd Date: Sat, 4 Feb 2023 16:17:57 +0900 Subject: [PATCH 1/6] Add swap description --- docs/01python/12practice/index.mdx | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/01python/12practice/index.mdx b/docs/01python/12practice/index.mdx index 130869e2d..96d347b39 100644 --- a/docs/01python/12practice/index.mdx +++ b/docs/01python/12practice/index.mdx @@ -78,6 +78,14 @@ $n$ 番目まで Fizz Buzz での正しい解を表示するプログラムを +`a, b = b, a` は、次と同じ意味です。 + +```python +tmp = a +a = b +b = tmp +``` + 再帰を使うと次のようにもできます。再帰は後の項で説明します。 From 33634c026a01206c3ef95692f5666e570019d798 Mon Sep 17 00:00:00 2001 From: chvmvd Date: Sat, 4 Feb 2023 17:25:02 +0900 Subject: [PATCH 2/6] Update image article --- .../01image/black_to_red.drawio.png | Bin 3969 -> 0 bytes docs/02advanced/01image/black_to_red.png | Bin 0 -> 3920 bytes docs/02advanced/01image/index.mdx | 73 ++- .../01image/lattice_pattern.drawio.svg | 41 -- docs/02advanced/01image/lattice_pattern.png | Bin 0 -> 5428 bytes .../01image/weighted_mean.drawio.svg | 293 ++++++++++ .../01image/weighted_mean_2d.drawio.svg | 519 ++++++++++++++++++ static/image/append.ipynb | 18 + .../black_to_green_another_solution.ipynb | 43 -- 9 files changed, 887 insertions(+), 100 deletions(-) delete mode 100644 docs/02advanced/01image/black_to_red.drawio.png create mode 100644 docs/02advanced/01image/black_to_red.png delete mode 100644 docs/02advanced/01image/lattice_pattern.drawio.svg create mode 100644 docs/02advanced/01image/lattice_pattern.png create mode 100644 docs/02advanced/01image/weighted_mean.drawio.svg create mode 100644 docs/02advanced/01image/weighted_mean_2d.drawio.svg create mode 100644 static/image/append.ipynb delete mode 100644 static/image/black_to_green_another_solution.ipynb diff --git a/docs/02advanced/01image/black_to_red.drawio.png b/docs/02advanced/01image/black_to_red.drawio.png deleted file mode 100644 index cd9a3bb1690f1a29f18e37f022d30696fa74602f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3969 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 BLq`Ar literal 0 HcmV?d00001 diff --git a/docs/02advanced/01image/index.mdx b/docs/02advanced/01image/index.mdx index a640e7065..4b514a155 100644 --- a/docs/02advanced/01image/index.mdx +++ b/docs/02advanced/01image/index.mdx @@ -11,7 +11,7 @@ Python で画像を表現してみましょう。 ## 白黒の表現 -大学がアルゴリズム入門の授業用に作った `ita` ライブラリを使えば、簡単に画像を表現できます。 +東京大学がアルゴリズム入門の授業用に作った `ita` ライブラリを使えば、簡単に画像を表現できます。`ita` ライブラリは、インストールして使う必要があります。ライブラリをインストールするには、先頭で `!pip install ita` と書けば良いのでした。 次のように、0 と 1 が格納された二次元配列を作って、それを `ita` ライブラリの `image_show` 関数に与えれば、白黒の画像を表現できます。0 が黒、1 が白となります。 @@ -21,7 +21,7 @@ Python で画像を表現してみましょう。 `ita` ライブラリを使って次のような画像を作ってみましょう。 -![lattice patter](lattice_pattern.drawio.svg) +![市松模様](lattice_pattern.drawio.svg) @@ -62,7 +62,7 @@ Python で画像を表現してみましょう。 次のような画像を作ってみましょう。 -![black to red](black_to_red.drawio.png) +![黒から赤へのグラデーション](black_to_red.drawio.png) @@ -74,29 +74,54 @@ Python で画像を表現してみましょう。 左から右にかけて、黒色から緑色に色が変化するグラデーション画像を作ってみましょう。 -![black to green](black_to_green.png) +![黒から赤へのグラデーション](black_to_green.png) - +`配列.append(要素)` とすることで、配列の末尾に要素を追加できます。 - + -`配列.append(要素)` とすることで、配列の末尾に要素を追加できます。 + + +左側が黒で右側に行くにつれてだんだん緑になるように、数値を少しずつ変化させていけば良さそうです。 -この問題ならそれぞれの行がすべて同じなので、`row` を使いまわすこともできます。 +二次元配列の作り方としては、まず空の配列を作り、それに `append` を使って値を入れていき一次元配列を作ります。 +さらに、これを空の配列に入れていけば、二次元配列になります。 - + + + + + ### 練習問題 2 -左から右にかけて、白色から青色に色が変化するグラデーション画像を作ってみましょう。 +左から右にかけて、白色から青色に色が変化するグラデーション画像を作ってみましょう。これは、少し難しいです。分からなかったら、ヒントを見てください。 -![white to blue](white_to_blue.png) +![白から青へのグラデーション](white_to_blue.png) - + + +次のように、加重平均をとると、うまくできます。 -加重平均をとると、うまくできます。 +![加重平均の説明](weighted_mean.drawio.svg) + +$$ +\left\{ + \begin{align*} + R&=(1-t)R_1+tR_2 \\ + G&=(1-t)G_1+tG_2 \\ + B&=(1-t)B_1+tB_2 + \end{align*} +\right. +$$ + +右側の色と左の色を定義して、その加重平均をとるという流れになるかと思います。 + + + + @@ -106,11 +131,27 @@ Python で画像を表現してみましょう。 左上が白、右上が赤、左下が緑、右下が青となるようなグラデーション画像を作ってみましょう。 -![gradation](gradation.png) +![グラデーション](gradation.png) - + -二次元で加重平均をとると、うまくできます。 +次のように、二次元で加重平均をとると、うまくできます。 + +![加重平均の説明](weighted_mean_2d.drawio.svg) + +$$ +\left\{ + \begin{align*} + R&=s\{(1-t)R_1+tR_2\}+(1-s)\{(1-t)R_3+tR_4\} \\ + G&=s\{(1-t)G_1+tG_2\}+(1-s)\{(1-t)G_3+tG_4\} \\ + B&=s\{(1-t)B_1+tB_2\}+(1-s)\{(1-t)B_3+tB_4\} + \end{align*} +\right. +$$ + + + + diff --git a/docs/02advanced/01image/lattice_pattern.drawio.svg b/docs/02advanced/01image/lattice_pattern.drawio.svg deleted file mode 100644 index 167ab7d9d..000000000 --- a/docs/02advanced/01image/lattice_pattern.drawio.svg +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/02advanced/01image/lattice_pattern.png b/docs/02advanced/01image/lattice_pattern.png new file mode 100644 index 0000000000000000000000000000000000000000..d5f4c7d92b9516a5902260240ffb1658f24c48b4 GIT binary patch literal 5428 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 literal 0 HcmV?d00001 diff --git a/docs/02advanced/01image/weighted_mean.drawio.svg b/docs/02advanced/01image/weighted_mean.drawio.svg new file mode 100644 index 000000000..457560483 --- /dev/null +++ b/docs/02advanced/01image/weighted_mean.drawio.svg @@ -0,0 +1,293 @@ + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+
+
+
+ + `t` + +
+
+ + + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + `1-t` + +
+
+ + + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + `(R_1,G_1,B_1)` + +
+
+ + + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + `(R,G,B)` + +
+
+ + + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + `(R_2,G_2,B_2)` + +
+
+
+ + + + + Text is not SVG - cannot display + + + +
\ No newline at end of file diff --git a/docs/02advanced/01image/weighted_mean_2d.drawio.svg b/docs/02advanced/01image/weighted_mean_2d.drawio.svg new file mode 100644 index 000000000..c10abce04 --- /dev/null +++ b/docs/02advanced/01image/weighted_mean_2d.drawio.svg @@ -0,0 +1,519 @@ + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + +
+
+
+
+ + `t` + +
+
+ + + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + `1-t` + +
+
+ + + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + `(R_1,G_1,B_1)` + +
+
+ + + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + `(R_2,G_2,B_2)` + +
+
+ + + + + + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + `(R,G,B)` + +
+
+ + + + + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + `(R_3,G_3,B_3)` + +
+
+ + + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + `(R_4,G_4,B_4)` + +
+
+ + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + `1-s` + +
+
+ + + + +
+
+
+ + + + + + + + + + + + + + + + +
+
+
+
+ + `s` + +
+
+
+ + + + + Text is not SVG - cannot display + + + +
\ No newline at end of file diff --git a/static/image/append.ipynb b/static/image/append.ipynb new file mode 100644 index 000000000..cb5407725 --- /dev/null +++ b/static/image/append.ipynb @@ -0,0 +1,18 @@ +{ + "nbformat": 4, + "nbformat_minor": 2, + "metadata": {}, + "cells": [ + { + "metadata": {}, + "source": [ + "a = [1, 2]\n", + "a.append(3)\n", + "print(a)" + ], + "cell_type": "code", + "outputs": [], + "execution_count": null + } + ] +} diff --git a/static/image/black_to_green_another_solution.ipynb b/static/image/black_to_green_another_solution.ipynb deleted file mode 100644 index eab4b266c..000000000 --- a/static/image/black_to_green_another_solution.ipynb +++ /dev/null @@ -1,43 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "!pip install ita" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import ita\n", - "\n", - "%matplotlib inline" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "n = 100\n", - "image = []\n", - "row = []\n", - "for i in range(n):\n", - " row.append([0, i / (n - 1), 0])\n", - "for i in range(n):\n", - " image.append(row)\n", - "ita.plot.image_show(image)" - ] - } - ], - "metadata": {}, - "nbformat": 4, - "nbformat_minor": 2 -} From 9a417507b5ca5c2fe091bf5d65abfe653bb9f4c8 Mon Sep 17 00:00:00 2001 From: chvmvd Date: Sat, 4 Feb 2023 17:41:17 +0900 Subject: [PATCH 3/6] Add %matplotlib inline description --- docs/02advanced/01image/index.mdx | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/docs/02advanced/01image/index.mdx b/docs/02advanced/01image/index.mdx index 4b514a155..a25bf77fc 100644 --- a/docs/02advanced/01image/index.mdx +++ b/docs/02advanced/01image/index.mdx @@ -11,7 +11,14 @@ Python で画像を表現してみましょう。 ## 白黒の表現 -東京大学がアルゴリズム入門の授業用に作った `ita` ライブラリを使えば、簡単に画像を表現できます。`ita` ライブラリは、インストールして使う必要があります。ライブラリをインストールするには、先頭で `!pip install ita` と書けば良いのでした。 +東京大学がアルゴリズム入門の授業用に作った `ita` ライブラリを使えば、簡単に画像を表現できます。(`ita` って、Introduction to Algorithms の略なんですかね?) +`ita` ライブラリは、インストールして使う必要があります。ライブラリをインストールするには、先頭で `!pip install ita` と書けば良いのでした。 + +`ita` ライブラリで画像を扱う場合は、次のようなコードをはじめの方に書いておく必要があります。これに関しては、おまじないだと思ってください。Google Colaboratory 上でうまく表示するために、必要になっています。 + +```python +%matplotlib inline +``` 次のように、0 と 1 が格納された二次元配列を作って、それを `ita` ライブラリの `image_show` 関数に与えれば、白黒の画像を表現できます。0 が黒、1 が白となります。 From 8b97abb9047a65050754e573dcd9a3e5f16dd20a Mon Sep 17 00:00:00 2001 From: chvmvd Date: Sat, 4 Feb 2023 18:08:29 +0900 Subject: [PATCH 4/6] Update life-game article --- docs/02advanced/02life-game/index.mdx | 76 +++++++++++++++++--------- static/life-game/is_alive.ipynb | 18 +++--- static/life-game/life_game.ipynb | 49 ++++++++++------- static/life-game/life_game_func.ipynb | 38 ++++++------- static/life-game/next_generation.ipynb | 36 ++++++------ 5 files changed, 126 insertions(+), 91 deletions(-) diff --git a/docs/02advanced/02life-game/index.mdx b/docs/02advanced/02life-game/index.mdx index 0d4c8da48..f35d092fc 100644 --- a/docs/02advanced/02life-game/index.mdx +++ b/docs/02advanced/02life-game/index.mdx @@ -81,17 +81,21 @@ import PlayArrowIcon from "@mui/icons-material/PlayArrow"; ## ライフゲームで遊んでみる -ライフゲームを簡単に遊べるプログラムを作ってみました。下のマスをクリックまたはタッチすると、マスの色を反転することができます。これで少し遊ぶことでライフゲームの仕組みを理解してください。 +ライフゲームを簡単に遊べる Web アプリを作ってみました。下のマスをクリックまたはタッチすると、マスの色を反転することができます。これで少し遊ぶことでライフゲームの仕組みを理解してください。 ## ライフゲームのプログラム -早速、ライフゲームの Python でのプログラムを見てみましょう。この後、詳しく解説するので、分からなくても構いません。ブラウザ上で動かせるようにしたので、ボタンを押して実際に動く様子を確認してみてください。 +### 全体 + +早速、ライフゲームの Python でのプログラムを見てみましょう。この後、詳しく解説するので、分からなくても構いません。Python のプログラムの実行結果をブラウザ上で動かせるようにしてあるので、ボタンを押して実際に動く様子を確認してみてください。 -それでは、実際に詳しく見ていきましょう。 +それでは、実際にライフゲームのプログラムを作っていきましょう。 + +### 盤面の表し方 次のような盤面はプログラム上でどのように表すのが良いでしょうか? @@ -105,6 +109,8 @@ board = [[1, 1, 0], [0, 0, 0]] ``` +### 生きたセルをカウント + 次に、ある盤面の $i$ 行 $j$ 列の周りに生きたセルが何個あるのかを求める関数を作りましょう。 関数の引数に `board`、`i`、`j` があるとしましょう。このとき、$i-1$ 行目から $i+1$ 行目でありかつ $j-1$ 列目から $j+1$ 列目であるセルの値の和から、$i$ 行 $j$ 列のセルの値(つまり自分の値)を引けばできそうです。次のようになると思えます。 @@ -115,62 +121,82 @@ board = [[1, 1, 0], - +### あるセルの生死の判定 次に、次の世代においてあるセルが生きているかを確認する関数を作ってみましょう。先程、あるセルの周りに生きたセルが何個あるのかを求める関数を作ったので、それを使います。関数の引数は、先程のように `board`、`i`、`j` で良いでしょう。後は、ライフゲームの定義通りにプログラムを書いていけばよいでしょう。 -`neighbors_cnt in [2, 3]` は `neighbors_cnt == 2 or neighbors_cnt == 3` と同じです。 +### 次の世代の計算 次に、次の世代の盤面を計算する関数を考えます。 -引数は `board` として、次の世代の様子を格納する配列を作ってそこに結果を格納していきましょう。配列の作り方はいろいろありますが、ここでは大学が用意した ita ライブラリを使いましょう。ita ライブラリを使うには、パッケージのインストールの項で述べたようにプログラムの冒頭に次のように書いてライブラリをインポートする必要があります。 +引数は `board` として、次の世代の様子を格納する配列を作ってそこに結果を格納していきましょう。 + +配列の作り方はいろいろありますが、ここではリスト内包表記と呼ばれる方法で行いましょう。 +例えば、`[0, 0, 0, 0, 0]` のような配列は次のようにして作ることができます。 ```python -!pip install ita +[0 for _ in range(5)] ``` +つまり、`[0 for _ in range(n)]` は、`[0, 0, 0, ..., 0]` のようになります。 + +さらに、`[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]` のような配列は次のようにして作ります。 + ```python -import ita +[[0 for _ in range(3)] for _ in range(4)] +``` + +:::note `ita` ライブラリの `make2d` 関数 + +大学が用意した `ita` ライブラリでも配列を作ることができます。 + +次のような構文で新たな一次元配列を作ることができます。 + +```python +ita.array.make1d(要素数) ``` -冒頭にこれらを書いたら次のような構文で新たな二次元配列を作ることができます。 +さらに、新たな二次元配列を作ることもできます。 ```python ita.array.make2d(行数,列数) ``` +::: + これらを使ってあげると、次のようなプログラムになるはずです。 -次の世代の盤面を計算することができたので、次は指定した世代までの盤面を計算する関数を作りましょう。 - -先ほどと同様に次のような構文で新たな一次元配列を作ることができます。 +### すべての盤面の計算 -```python -ita.array.make1d(要素数) -``` +次の世代の盤面を計算することができたので、次は指定した世代までの盤面を計算する関数を作りましょう。 -これを用いて、引数を `board` と世代数 `n` にすると、次のようにプログラムを書けます。 +引数を `board` と世代数 `n` にすると、次のようにプログラムを書けます。 -後はこれをアニメーションにしてあげれば、完成です。 - -まず、次のようなコードを書いておきましょう。これは、おまじないだと思ってください。Google Colaboratory 上でうまく表示するために、必要です。 +### アニメーション -```python -%matplotlib inline -``` +後はこれをアニメーションにしてあげれば、完成です。 -次に、次のように書くことでサンプルデータを取得することができます。これはライフゲームにおいて有名なデータで、グライダーが移動していくように見えるものです。 +サンプルデータは次のようにしましょう。これはグライダーと呼ばれるライフゲームにおいて有名なデータで、グライダーが移動していくように見えるものです。 ```python -data = ita.lifegame_glider() +data = [ + [0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 1, 1, 1, 0], + [0, 0, 0, 0, 1, 0, 0, 0], + [0, 0, 0, 0, 0, 1, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0], +] ``` -画像を作るのは、ita ライブラリを使えば簡単です。三次元配列を次のように渡してあげれば、1 のところは黒で 0 のところは白にしてアニメーションをつくってくれます。 +アニメーションを作るのは、`ita` ライブラリを使えば簡単です。三次元配列を次のように渡してあげれば、1 のところは黒で 0 のところは白にしてアニメーションをつくってくれます。 ```python ita.plot.animation_show(三次元配列) diff --git a/static/life-game/is_alive.ipynb b/static/life-game/is_alive.ipynb index 10add88ae..89566802c 100644 --- a/static/life-game/is_alive.ipynb +++ b/static/life-game/is_alive.ipynb @@ -1,10 +1,10 @@ { + "nbformat": 4, + "nbformat_minor": 2, + "metadata": {}, "cells": [ { - "cell_type": "code", - "execution_count": null, "metadata": {}, - "outputs": [], "source": [ "def count_neighbors(board, i, j):\n", " cnt = 0\n", @@ -23,7 +23,7 @@ " else:\n", " return 0\n", " else:\n", - " if neighbors_cnt in [2, 3]:\n", + " if 2 <= neighbors_cnt <= 3:\n", " return 1\n", " elif neighbors_cnt <= 1:\n", " return 0\n", @@ -33,10 +33,10 @@ "\n", "board = [[1, 1, 0], [1, 0, 0], [0, 0, 0]]\n", "print(is_alive(board, 0, 0))" - ] + ], + "cell_type": "code", + "outputs": [], + "execution_count": null } - ], - "metadata": {}, - "nbformat": 4, - "nbformat_minor": 2 + ] } diff --git a/static/life-game/life_game.ipynb b/static/life-game/life_game.ipynb index 48e73321f..12a603776 100644 --- a/static/life-game/life_game.ipynb +++ b/static/life-game/life_game.ipynb @@ -1,30 +1,30 @@ { + "nbformat": 4, + "nbformat_minor": 2, + "metadata": {}, "cells": [ { - "cell_type": "code", - "execution_count": null, "metadata": {}, - "outputs": [], "source": [ "!pip install ita" - ] + ], + "cell_type": "code", + "outputs": [], + "execution_count": null }, { - "cell_type": "code", - "execution_count": null, "metadata": {}, - "outputs": [], "source": [ "import ita\n", "\n", "%matplotlib inline" - ] + ], + "cell_type": "code", + "outputs": [], + "execution_count": null }, { - "cell_type": "code", - "execution_count": null, "metadata": {}, - "outputs": [], "source": [ "def count_neighbors(board, i, j):\n", " cnt = 0\n", @@ -43,7 +43,7 @@ " else:\n", " return 0\n", " else:\n", - " if neighbors_cnt in [2, 3]:\n", + " if 2 <= neighbors_cnt <= 3:\n", " return 1\n", " elif neighbors_cnt <= 1:\n", " return 0\n", @@ -54,7 +54,7 @@ "def next_generation(board):\n", " row = len(board)\n", " column = len(board[0])\n", - " next_board = ita.array.make2d(row, column)\n", + " next_board = [[0 for _ in range(column)] for _ in range(row)]\n", " for i in range(len(board)):\n", " for j in range(len(board[0])):\n", " next_board[i][j] = is_alive(board, i, j)\n", @@ -62,21 +62,30 @@ "\n", "\n", "def life_game(board, n):\n", - " results = ita.array.make1d(n)\n", + " results = [0 for _ in range(n)]\n", " results[0] = board\n", " for i in range(1, n):\n", " results[i] = next_generation(results[i - 1])\n", " return results\n", "\n", "\n", - "data = ita.lifegame_glider()\n", + "data = [\n", + " [0, 0, 0, 0, 0, 0, 0, 0],\n", + " [0, 0, 0, 0, 0, 0, 0, 0],\n", + " [0, 0, 0, 0, 0, 0, 0, 0],\n", + " [0, 0, 0, 0, 0, 0, 0, 0],\n", + " [0, 0, 0, 0, 1, 1, 1, 0],\n", + " [0, 0, 0, 0, 1, 0, 0, 0],\n", + " [0, 0, 0, 0, 0, 1, 0, 0],\n", + " [0, 0, 0, 0, 0, 0, 0, 0],\n", + "]\n", "n = 20\n", "images = life_game(data, n)\n", "ita.plot.animation_show(images)" - ] + ], + "cell_type": "code", + "outputs": [], + "execution_count": null } - ], - "metadata": {}, - "nbformat": 4, - "nbformat_minor": 2 + ] } diff --git a/static/life-game/life_game_func.ipynb b/static/life-game/life_game_func.ipynb index 73b743cea..bc0e8a702 100644 --- a/static/life-game/life_game_func.ipynb +++ b/static/life-game/life_game_func.ipynb @@ -1,28 +1,28 @@ { + "nbformat": 4, + "nbformat_minor": 2, + "metadata": {}, "cells": [ { - "cell_type": "code", - "execution_count": null, "metadata": {}, - "outputs": [], "source": [ "!pip install ita" - ] + ], + "cell_type": "code", + "outputs": [], + "execution_count": null }, { - "cell_type": "code", - "execution_count": null, "metadata": {}, - "outputs": [], "source": [ "import ita" - ] + ], + "cell_type": "code", + "outputs": [], + "execution_count": null }, { - "cell_type": "code", - "execution_count": null, "metadata": {}, - "outputs": [], "source": [ "def count_neighbors(board, i, j):\n", " cnt = 0\n", @@ -41,7 +41,7 @@ " else:\n", " return 0\n", " else:\n", - " if neighbors_cnt in [2, 3]:\n", + " if 2 <= neighbors_cnt <= 3:\n", " return 1\n", " elif neighbors_cnt <= 1:\n", " return 0\n", @@ -52,7 +52,7 @@ "def next_generation(board):\n", " row = len(board)\n", " column = len(board[0])\n", - " next_board = ita.array.make2d(row, column)\n", + " next_board = [[0 for _ in range(column)] for _ in range(row)]\n", " for i in range(len(board)):\n", " for j in range(len(board[0])):\n", " next_board[i][j] = is_alive(board, i, j)\n", @@ -60,7 +60,7 @@ "\n", "\n", "def life_game(board, n):\n", - " results = ita.array.make1d(n)\n", + " results = [0 for _ in range(n)]\n", " results[0] = board\n", " for i in range(1, n):\n", " results[i] = next_generation(results[i - 1])\n", @@ -70,10 +70,10 @@ "board = [[1, 1, 0], [1, 0, 0], [0, 0, 0]]\n", "n = 20\n", "print(life_game(board, n))" - ] + ], + "cell_type": "code", + "outputs": [], + "execution_count": null } - ], - "metadata": {}, - "nbformat": 4, - "nbformat_minor": 2 + ] } diff --git a/static/life-game/next_generation.ipynb b/static/life-game/next_generation.ipynb index c4240caae..be442285e 100644 --- a/static/life-game/next_generation.ipynb +++ b/static/life-game/next_generation.ipynb @@ -1,28 +1,28 @@ { + "nbformat": 4, + "nbformat_minor": 2, + "metadata": {}, "cells": [ { - "cell_type": "code", - "execution_count": null, "metadata": {}, - "outputs": [], "source": [ "!pip install ita" - ] + ], + "cell_type": "code", + "outputs": [], + "execution_count": null }, { - "cell_type": "code", - "execution_count": null, "metadata": {}, - "outputs": [], "source": [ "import ita" - ] + ], + "cell_type": "code", + "outputs": [], + "execution_count": null }, { - "cell_type": "code", - "execution_count": null, "metadata": {}, - "outputs": [], "source": [ "def count_neighbors(board, i, j):\n", " cnt = 0\n", @@ -41,7 +41,7 @@ " else:\n", " return 0\n", " else:\n", - " if neighbors_cnt in [2, 3]:\n", + " if 2 <= neighbors_cnt <= 3:\n", " return 1\n", " elif neighbors_cnt <= 1:\n", " return 0\n", @@ -52,7 +52,7 @@ "def next_generation(board):\n", " row = len(board)\n", " column = len(board[0])\n", - " next_board = ita.array.make2d(row, column)\n", + " next_board = [[0 for _ in range(column)] for _ in range(row)]\n", " for i in range(len(board)):\n", " for j in range(len(board[0])):\n", " next_board[i][j] = is_alive(board, i, j)\n", @@ -61,10 +61,10 @@ "\n", "board = [[1, 1, 0], [1, 0, 0], [0, 0, 0]]\n", "print(next_generation(board))" - ] + ], + "cell_type": "code", + "outputs": [], + "execution_count": null } - ], - "metadata": {}, - "nbformat": 4, - "nbformat_minor": 2 + ] } From 92f0811b43aea5d5c39a03eaf7b93e07d833be31 Mon Sep 17 00:00:00 2001 From: chvmvd Date: Sat, 4 Feb 2023 18:16:40 +0900 Subject: [PATCH 5/6] Update error article --- docs/02advanced/03error/index.mdx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/02advanced/03error/index.mdx b/docs/02advanced/03error/index.mdx index d7e1baeba..17de3b3b2 100644 --- a/docs/02advanced/03error/index.mdx +++ b/docs/02advanced/03error/index.mdx @@ -7,6 +7,8 @@ import Answer from "@site/src/components/Answer"; # 誤差 +ここでは、誤差について扱います。誤差は、期末テストなどで聞かれやすい分野であり、用語を忘れやすい分野でもあるので、気をつけてください。 + ## 浮動小数点数 コンピューターでは、浮動小数点方式が使われます。浮動小数点方式では、仮数部と指数部によって数値を表現します。 @@ -22,8 +24,8 @@ $12345 = \underbrace{1.2345}_{\text{仮数部}}\times 10^{\overbrace{-4}^{\text{ 世の中には、有限桁の小数では表せない数字は多くあります。 まずは、10 進数で考えましょう。 -例えば、$\frac{1}{3}$ は有限桁の小数では表せません。$0.3$ も $0.33$ も $0.333$ も $\frac{1}{3}$ の近似でしかありません。 -たとえ、次のようにどんなに桁を大きくしても有限である限り近似には変わりません。 +例えば、$1/3$ は有限桁の小数では表せません。$0.3$ も $0.33$ も $0.333$ も $1/3$ の近似でしかありません。 +たとえ、次のようにどんなに桁を大きくしても有限である限り近似であることには変わりがありません。 $$ 0.3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333 @@ -43,7 +45,7 @@ $$ このように $0.1_{(10)}$ は 2 進数では有限桁で表せません。 -コンピューターは二進数で処理をするので一度二進数に変換しますが、そのときに無限桁を扱うことはできないので、有効桁以降を切り捨てることになります。これによって、誤差が出るのが丸め誤差です。 +コンピューターは 2 進数で処理をするので一度 10 進数を 2 進数に変換しますが、そのときに無限桁を扱うことはできないので、有効桁以降を切り捨てることになります。これによって、誤差が出るのが丸め誤差です。 ### 丸め誤差の例 From 21545ee28161d562b4510652bb90dd9902e31707 Mon Sep 17 00:00:00 2001 From: chvmvd Date: Sat, 4 Feb 2023 18:37:48 +0900 Subject: [PATCH 6/6] Fix broken links --- docs/02advanced/01image/index.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/02advanced/01image/index.mdx b/docs/02advanced/01image/index.mdx index a25bf77fc..75a1fc81c 100644 --- a/docs/02advanced/01image/index.mdx +++ b/docs/02advanced/01image/index.mdx @@ -28,7 +28,7 @@ Python で画像を表現してみましょう。 `ita` ライブラリを使って次のような画像を作ってみましょう。 -![市松模様](lattice_pattern.drawio.svg) +![市松模様](lattice_pattern.png) @@ -69,7 +69,7 @@ Python で画像を表現してみましょう。 次のような画像を作ってみましょう。 -![黒から赤へのグラデーション](black_to_red.drawio.png) +![黒から赤へのグラデーション](black_to_red.png)