4Clojure問題の翻訳と解答

Clojureに4Clojure Problemsという問題集のサイトがあって、とてもよくできているので翻訳してみました。

GitHub - kalz2q/4clojure-jp: translation of 4clojure problems in japanese

Markdownで書いて、README.mdにはりつけてあります。

問題はさまざまだけど数学系が多いかな。

解答はいろんな人が書いているのをコピペして、コピペする前に一応テストを走らせたので大丈夫だと思います。

ほんとははてなに貼り付けたかったのですが、ちょっと大きすぎるみたいなのでgithubにしました。

勉強し始めたばかりなのでClojureがわからないだけでなく、そもそもの問題が何度読んでもわからないのが多かったけど、テストケースがついているのと、今回解答も載せたので、なんとなくわかるのがいい。テストケースだけではわからなくても文章でわかったり、プログラムを読んでわかったりすることもありますよね。

git cloneできない

何台かあるうちの一台のUbuntu 18.04マシンで、git cloneができないという事態が発生しました。

~$ git clone https://github.com/syl20bnr/spacemacs.git
Cloning into 'spacemacs'...
ssh: Could not resolve hostname github: Name or service not known
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

そんな馬鹿な、といろいろ調べたのですが解決しないでいたところ、ひょっとしてと思って、

https

http

に書き直したら問題なく、git cloneできました。

なぜだろう。

Google Home でスケジュールが聞けない

Google Homeで今日の予定は? と聞くと、

「3件入っています。最初のは午前7時からで、・・・」

とか言ってくれるのがとても便利だったのですが、先月くらいからカレンダーに予定を入れているのに聞けなくなってしまいました。

すいません、わかりません。
とか、
お役に立てそうにありません。
予定を見つけられませんでした。
とか返事をします。

いろいろやってみるとパソコンのChromeに入っているGoogle Calendarスマホに入っているGoogle Calendarは同期が取れているのに、それが見つけられないでいるみたいです。
メールやフォトは同期が取れているので不思議なのですが、最終的に解決しませんでした。

ところが!!!

Gmailのアドレスをもう一つ作成して、スマホをそれにして、Google Homeをリセットしたところ、そのアドレスの予定を読み上げてくれる。
とりあえず、ちょっとめんどうだけど、使えています。
パソコンのGoogl Chromeでアイコンをクリックするだけで切り替えられるのではじめ思ったほどめんどうではないです。

以上

クイズ 連分数

PythonのSymPyのネットにあるチュートリアルを読んでいたら、連分数のクイズがありました。

連分数とは分数の中に分数があるような以下のような形の分数です。

from sympy import *
init_printing()
x,y,z = symbols('x y z')

def list_to_frac(l):
    expr = Integer(0)
    for i in reversed(l[1:]):
        expr += i
        expr = 1 / expr
    return l[0] + expr
frac = list_to_frac([x,y,z])
frac

$$x + \frac{1}{y + \frac{1}{z}}$$

一般的な形としては添字付きの変数であらわします。

syms = symbols('a0:5')
syms

$$\left ( a_{0}, \quad a_{1}, \quad a_{2}, \quad a_{3}, \quad a_{4}\right )$$

a0, a1, a2, a3, a4 = syms

frac = list_to_frac(syms)
frac

$$a_{0} + \frac{1}{a_{1} + \frac{1}{a_{2} + \frac{1}{a_{3} + \frac{1}{a_{4}}}}}$$

さてこれを通分すると次のようになります。

frac=cancel(frac)
frac

$$\frac{a_{0} a_{1} a_{2} a_{3} a_{4} + a_{0} a_{1} a_{2} + a_{0} a_{1} a_{4} + a_{0} a_{3} a_{4} + a_{0} + a_{2} a_{3} a_{4} + a_{2} + a_{4}}{a_{1} a_{2} a_{3} a_{4} + a_{1} a_{2} + a_{1} a_{4} + a_{3} a_{4} + 1}$$

で問題は、変数をランダムに混ぜて、cancelされた式から元の連分数をつくれ、というものです。

import random
l = list(symbols('a0:5'))
random.shuffle(l)
orig_frac = frac = cancel(list_to_frac(l))
del l

ここでlを求めるわけですが、先に答えを見たりしないようにご丁寧にlを消去しています。
解いたあと、正解かどうかはorig_fracと、求めたlでcancel(list_to_frac(l))したものを比べれば確認できます。

frac

$$\frac{a_{0} a_{1} a_{2} a_{3} a_{4} + a_{0} a_{1} a_{3} + a_{0} a_{2} a_{4} + a_{0} + a_{1} a_{2} a_{4} + a_{1} a_{3} a_{4} + a_{1} + a_{4}}{a_{0} a_{2} a_{3} a_{4} + a_{0} a_{3} + a_{2} a_{4} + a_{3} a_{4} + 1}$$

l=[]
frac = apart(frac, a1)
frac

$$a_{1} + \frac{a_{0} a_{2} a_{4} + a_{0} + a_{4}}{a_{0} a_{2} a_{3} a_{4} + a_{0} a_{3} + a_{2} a_{4} + a_{3} a_{4} + 1}$$

l.append(a1)
frac = 1/(frac - a1)
frac

$$\frac{1}{a_{0} a_{2} a_{4} + a_{0} + a_{4}} \left(a_{0} a_{2} a_{3} a_{4} + a_{0} a_{3} + a_{2} a_{4} + a_{3} a_{4} + 1\right)$$

frac = apart(frac, a3)
frac

$$a_{3} + \frac{a_{2} a_{4} + 1}{a_{0} a_{2} a_{4} + a_{0} + a_{4}}$$

l.append(a3)
frac = 1/(frac - a3)
frac

$$\frac{a_{0} a_{2} a_{4} + a_{0} + a_{4}}{a_{2} a_{4} + 1}$$

frac = apart(frac, a0)
frac

$$a_{0} + \frac{a_{4}}{a_{2} a_{4} + 1}$$

l.append(a0)
frac = 1/(frac - a0)
frac

$$\frac{1}{a_{4}} \left(a_{2} a_{4} + 1\right)$$

frac = apart(frac, a2)
frac

$$a_{2} + \frac{1}{a_{4}}$$

l.append(a2)
frac = 1/(frac - a2)
frac

$$a_{4}$$

frac = apart(frac, a4)
frac

$$a_{4}$$

l.append(a4)
list_to_frac(l)

$$a_{1} + \frac{1}{a_{3} + \frac{1}{a_{0} + \frac{1}{a_{2} + \frac{1}{a_{4}}}}}$$

l

$$\left [ a_{1}, \quad a_{3}, \quad a_{0}, \quad a_{2}, \quad a_{4}\right ]$$

orig_frac

$$\frac{a_{0} a_{1} a_{2} a_{3} a_{4} + a_{0} a_{1} a_{3} + a_{0} a_{2} a_{4} + a_{0} + a_{1} a_{2} a_{4} + a_{1} a_{3} a_{4} + a_{1} + a_{4}}{a_{0} a_{2} a_{3} a_{4} + a_{0} a_{3} + a_{2} a_{4} + a_{3} a_{4} + 1}$$

cancel(list_to_frac(l))

$$\frac{a_{0} a_{1} a_{2} a_{3} a_{4} + a_{0} a_{1} a_{3} + a_{0} a_{2} a_{4} + a_{0} + a_{1} a_{2} a_{4} + a_{1} a_{3} a_{4} + a_{1} + a_{4}}{a_{0} a_{2} a_{3} a_{4} + a_{0} a_{3} + a_{2} a_{4} + a_{3} a_{4} + 1}$$

AnacondaとSageMathとJupyter

PythonやJupyterをインストールするのにAnacondaを使うと思いますが、するとSageMathが使えなくなります。問題は二つあって、

1.SageMathはPython2.7なのに対し、AnacondaはPython3である。

2.Anacondaと両立させるにはSageMathをローカルにインストールする必要があるが、sudo apt installではローカルインストールにならない。

この問題を解決するために以下の手順でSageMathをローカル・インストールします。

1.インストールの間、PATHからanaconda3/binを削除する。
echo $PATH > newpath.txt
newpath.txtを編集して、export PATH='newpath....'とする。
source newpath.txt
echo $PATH でanaconda3/binがないことを確認する。

2.http://www.sagemath.org/download-source.htmlからsage-8.3.tar.gzをダウンロードし、$HOMEに展開すると、sage-8.3というフォルダーができている。

3.環境を整える。自分の場合全部最新バージョンでした。
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install binutils gcc g++ make tar git openssl libssl-dev
sudo apt-get install gfortran m4 perl build-essential gfortran sudo apt-get install imagemagick texlive dvipng

3.インストールする。4,5時間かかると思う。
cd sage-8.3
make

4.起動について
$HOME/sage-8.3/sage -n jupyter
で起動する。これでsageのnotebookが使える。
普通のjupyterを使う時はjupyter-notebookで起動する。

sageでつくったnotebookを普通のjupyterで開いたり、逆をするとnotebookが壊れて悲惨なことになるので注意する。

近い将来いろいろ解決すると思うのですが、いまのところこれで動いています。

環境は、Ubuntu 18.04、SageMath 8.3、conda 4.5。

質問: Ubuntu 18.04でSageMath

えっと、以下の記事はその後解決したので、別の記事にしてまた書きます。

基本的にUbuntu 18.04やSageMathがいけないのではなくて、AnacondaとSageMathが両立しないのが問題みたいで、解決方法も考えました。


質問: Ubuntu 18.04になってSageMathが動かないのですが、だれか動いている人いますか。

Jupyterがあるからいいじゃん、という答えはおいといて。

18.04では

sudo apt install sagemath

とするのが正しいインストール方法みたいなのですが、これでsagemathのバージョン8.1がインストールされるのですが、起動しません。

SageMathのホームページでダウンロードのメニューでは

sage-8.3-Ubuntu_16.04-x86_64.tar.bz2

というのが最新でsageは8.3と最新になっているけどUbuntuが16.04で17.04にすらなっていない。
ダウンロードして、解凍して、起動しようとするとエラーになります。

追記:
時間ができたらソースからmakeしてみようと思います。

追記:
ソースからのmakeはpatch-2.7.5がダメというエラーになります。ソースはsage8.3と8.0でやってみました。どちらも同じエラーになります。

追記:
conda install -c conda-forge sage
でインストールしてみました。インストールは終了しますが、起動ができない。環境変数SAGE_ROOTとかセットしろと言われるのでセットして、起動できるようになっても、起動の途中でエラーになる。Sage Crash Reportを出せと言われたのでsage-supportチームに送りました。
ということは少しは進んでいるのか。

感想
あちこちにほころびがあって、なんとなくSageMathは終わっているのかなぁ、という気がする。
いろいろ勉強させてもらったので残念です。

リュックサックに2リットルのペットボトルが何本入るか

筋トレをやるのにリュックをウエイト代わりにする、というアイデアがあります。

リュックサックは30Lとか書いてあるけどこれは容量であって、30リットルの水やウエイトが入るわけではない。
ネットで検索すると、ボックスタイプのノースフェイスの30Lのリュックで2Lのペットボトルが6本入ったというのを誰かが書いていました。2Lのペットボトルはそれ以上入らないけど、まだ余裕はある、とのことでした。

我が家にファスナーがこわれた30-34Lのファウデ(vaude)のリュックが捨てずにあったので実験してみました。

まず縦に8本入りました。
その上に横に一本。 両脇のポケットに1本ずつ。 合計11本、22kg入りました。

いつもダンベルやバーベルで40kgくらい持ち上げているので22kgは大したことない、と思ったのですが、リュックで22kgは相当重い。
これでスクワットを20回やって死にかけました。
荷重が腰の上に来るので、背骨には楽ですが、下半身、大臀筋につらい。
筋肉痛で歩けない。

以上