!pip install ita -U --userのように「-U」オプション付きでライブラリitaをインストールするコードが書かれていましたが,これを大学の教育用計算機システム上で実行するとおかしくなることがあるようです.現在は,
!pip install ita --userのように「-U」オプションなしのものを配布しています.もう一度Notebookをダウンロードし直して新しいファイルを使ってください.これを実行しようとしても,
AttributeError: '_NamespacePath' object has no attribute 'sort'というエラーが出る時は,ターミナルで
rm -rf ~/.localを一度実行すると回復するようです.
def merge_unique(data1, data2): #整列済みの配列data1とdata2を併合した上位k個を返す
result = []
#結果の格納先を用意
i1 = 0 #data1は何番目まで処理したか?
i2 = 0 #data2は何番目まで処理したか?
while i1 < len(data1) or i2 < len(data2):
if (i2 >= len(data2) or
(i1 < len(data1) and data1[i1] <= data2[i2])):
if len(result) == 0 or data1[i1] != result[len(result) - 1]:
result.append(data1[i1])
i1 = i1 + 1
else:
if len(result) == 0 or data2[i2] != result[len(result) - 1]:
result.append(data2[i2])
i2 = i2 + 1
return result
def ex9_6(data):
n = len(data)
if n <= 1:
return data
else:
data1 = ex9_6(data[0 : n // 2])
data2 = ex9_6(data[n // 2 : n])
return merge_unique(data1, data2)
上のプログラムのmerge_unique はdata1, data2 が整列されていれば,重複があっても動くが,data1, data2が整列されていて,かつ重複がない場合のみを想定してよく,以下のように書いた人もいた(一部改変).
def merge_unique(data1,data2):
l = 0
r = 0 #どこまで見たか
res = []
#どちらかが尽きるまで追加していく
while l < len(data1) and r < len(data2):
if data1[l] <= data2[r]:
if data1[l] == data2[r]:
r += 1
res.append(data1[l])
l += 1
else:
res.append(data2[r])
r += 1
#残ったものをくっつける
res.extend(data1[l:] + data2[r:])
return res
mkdir ~/algo19のようにします.そして,ターミナルを開くたびに
cd ~/algo19 jupyter notebookと入力してJupyter Notebookを動かしてください.詳しくは,はいぱーワークブック「14.4 コマンドを使ったファイル操作」を参照してください.
cd ~/algo19を済ませてから,
python vote.py 選択肢番号のように使います.
Jupyter Notebookを使いながら(一旦終了せずに),投票システムも使うには,ターミナルのメニューバーの「シェル」->「新規タブ」を選ぶか,[Command]+[T]で別のタブを開いて(あるいは[Command]+[N]で別のウィンドウを開いて),投票システムを使うことをお勧めします.このあたりのことは,「はいぱーワークブック」の15.4 ターミナルの便利な使い方に書いてあるので参考にしてください.


cd ~/algo19と入力してください.これらの機能を使うと,Jupyter Notebookを抜けずにvoteできます.
ターミナルの基本的な使い方は,はいぱーワークブックの15.2 ターミナルの基本的な使い方を,より高度な使い方は,15.4 ターミナルの便利な使い方を参照してください.
cdというコマンドと「~」の意味は,はいぱーワークブックの14.4 コマンドを使ったファイル操作の14.4.1 ディレクトリを読むと分かります.