Thothの日誌

日々の活動や読んだ本について書き綴っていこうと思います

「帽子を全員で揃える」を解いてみる

オライリーの本でPythonを用いてアルゴリズムについて学べるものがあったのでやってみました。

全部で21もの単元があるのでかなりやりごたえのある本でした。
今回は1章の「帽子を全員で揃える」の練習問題をやってみました。

cap1 = ['F','F','B','B','B','F','B',
        'B','B','F','F','B','F']

cap2 = ['F','F','B','B','B','F','B',
        'B','B','F','F','F','F']

cap3 = 'F F B H B F B B B F H F F'.split() # これでもリストを作成できます

def change(caps):
    """
Fは前向き、Bは後ろ向き。
列の中で帽子の向きが変わっていたら向きを変えるように指摘する
P12の問題1の答え
"""
    start = 0
    forward = 0
    backward = 0
    intervals = []
    for i in range(1, len(caps)):
        if caps[start] != caps[i]:
            intervals.append((start, i - 1, caps[start]))
            if caps[start] == 'F':
                forward += 1
            else:
                backward += 1
            start = i
    intervals.append((start, len(caps)- 1, caps[start]))

    if caps[start] == 'F':
        forward += 1
    else:
        backward += 1

    if forward < backward:
        flip = 'F'
    else:
        flip = 'B'
    for t in intervals:
        if t[2] == flip:
            if t[0] == t[1]:
                print(F'{t[0]}のポジションの人は帽子の向きを変えてください')
            else:
                print(F'{t[0]}から{t[1]}のポジションの人は帽子の向きを変えてください')

def onepass_change2(caps: list) ->None:
    """これがP12の問題2の答え"""
    if len(caps) > 0:
        caps = caps + [caps[0]]
    else:
        return
    for i in range(1, len(caps)):
        if caps[i] != caps[i-1]:
            if caps[i] != caps[0]:
                print(f'{i}のポジションの人', end='')
                start = i
            else:
                end = i - 1
                if start - end == 0:
                    print('は帽子を変えてください')
                else:
                    print(F"から{i-1}のポジションの人は帽子の向きを変えてください")

def ignore_change(caps):
    """
P12の問題3用
Hは帽子をかぶってない人を表す。Hの人は無視して行う
"""
    start = 0
    forward = 0
    backward = 0
    intervals = []
    for i in range(1, len(caps)):
        if caps[start] != caps[i]:
            intervals.append((start, i - 1, caps[start]))
            if caps[start] == 'F':
                forward += 1
            elif caps[start] == 'B':
                backward += 1
            start = i
    intervals.append((start, len(caps)- 1, caps[start]))

    if caps[start] == 'F':
        forward += 1
    else:
        backward += 1

    if forward < backward:
        flip = 'F'
    else:
        flip = 'B'
    for t in intervals:
        if t[2] == flip:
            if t[0] == t[1]:
                print(F'{t[0]}のポジションの人は帽子の向きを変えてください')
            else:
                print(F'{t[0]}から{t[1]}のポジションの人は帽子の向きを変えてください')

if __name__ == '__main__':
    change(cap1)
    print()
    onepass_change2(cap1)
    print()
    ignore_change(cap3)

見やすくなるように各解答の間に空白を出力させました。
その出力がそれぞれ、


2から4のポジションの人は帽子の向きを変えてください
6から8のポジションの人は帽子の向きを変えてください
11のポジションの人は帽子の向きを変えてください


2のポジションの人から4のポジションの人は帽子の向きを変えてください
6のポジションの人から8のポジションの人は帽子の向きを変えてください
11のポジションの人は帽子を変えてください


2のポジションの人は帽子の向きを変えてください
4のポジションの人は帽子の向きを変えてください
6から8のポジションの人は帽子の向きを変えてください

のようになります。

アルゴリズムを身につけようと…

アルゴリズムを学ぼうとこちらの教材を用いていて勉強しておりました。

 

アルゴリズムによくある探索、ソート、貪欲アルゴリズム、分割統治法、再帰深さ優先探索幅優先探索、二分探索などの要素を問題を解くことによって身に着けることができるので、よくあるPythonアルゴリズム本にあるような、うんちくだけで終わってしまって結局自分は身に着けることができたのかうやむやになってしまう事態は避けることができたように思います。

パズル問題は難しそうなのでまだまだ解けていない問題も多いですが、練習問題に関しては結構解けたのではないかと思います。

 

この本の難点は答えが書いてないので「これで合ってるよな?」と常に自問しないといけないところですね。

 

モチベーションが続けばそれら練習問題の自分なりの解答を掲載していこうと思います。

 

とりあえず一章の分です

「同志少女よ、敵を撃て」を読みました

「同志少女よ、敵を撃て」をオーディオブックで聴きました。

 

 

独ソ戦ソ連の女狙撃兵となった主人公のセラフィマ目線から戦争を見ていくことになります。

 

この本を書くまでに関連する資料を沢山読み込んだであろうことがうかがえるくらいに緻密な描写が多く、狙撃する際のミルとか距離とかの説明を受けて「ヘェ〜」と感心してしまいました。(小並感)

 

しかし、セラフィマの心境の変化が分かりやすく書かれていて物語の転機が掴みやすく、結構分厚い本ですが、(オーディオブックだと15時間34分)退屈せずに聴くことができました。

 

 

イリーナの課題、助言

印象に残ったのは訓練学校卒業時でのイリーナからの課題である、トランプを使って決められた角度に決められた距離だけ進む、というもの。スナイパーというのはこうして距離感を培っていくのかと思いました。また、この課題は「自分の居場所を見失うな」というイリーナからの忠告が暗に込められていると思います。

 

動機の階層化

また、動機の階層化というのも重要なポイントだと思いました。

なぜ戦争をするのか、というと建前上は「国を守るため」という模範解答的なものが出てきますが、それだけではなく、個人的な動機も必要になる。しかしいざ戦場に立った時は個人的な思いを隅に追いやってただ目の前の敵を撃て、イリーナの言葉を私の言葉で言い表すとこのようになります。

 

兵士として優秀になったとしても

作中、歴史上史実の人物の女性狙撃兵であるルドミュラパブリチェンコというキャラクターが登場します。彼女は大変優秀な成績を収めていて狙撃兵達から尊敬されていました。

そんな彼女にセラフィマは会いにいくのですが、その時の彼女はとても寂しそうな孤独な印象がありました。

地の文でも、戦中は兵士としても戦うことを強制していたのに戦後になると突然市民として生きろ、と放置されることになり多くの兵士たちがPTSDに悩んだと書かれていました。そしてそのトラウマに囚われている様を弱さの証として恥ずべきものだとされているのはやるせない気持ちになりました。

戦争は人間を兵士として最適化するだけだったと地の文でもあり、国のためや名誉の為だけに活動するといざそれがなくなった時に虚無に陥ってしまうということかもしれません。

 

フリッツ、魔女のレッテル貼り

セラフィマが所属する赤軍はドイツ兵のことを「フリッツ」と呼ぶように指示され、まるで人間ではないかのようにドイツ兵を扱うように徹底されていました。ドイツ兵もまたソ連兵に対して同様のことをしていました。一種のレッテル貼りというか、自分達との区別ですね。

それが変わったと感じたのが終盤セラフィマが故郷復活の為に活動していても近隣の住民からは元女性狙撃兵ということで「魔女」と噂し、近寄るのを避けていました。

その住民の中の少年が彼女らに手紙を渡す必要が出てくるのですが、そこで少年は初めてセラフィマに会い、彼女が当時の戦友の死を知り、涙を流している姿を見て彼女もまた自分達と同じ人間なのだと実感するシーンがありました。

 

「敵を撃て」の敵

そして終盤に一度だけタイトル回収があります。地の分で「同士少女よ、敵を撃て」のワンフーズが出てきます。その「敵」はネタバレなので伏せておきますが、ドイツ軍ではありません。

 

タチアナの存在

セラフィマは親と村人を殺され、その憎悪とイリーナからの「死にたいか、戦いたいか」の問いに答える形で兵士になります。いわば兵士になる事を選ばされたかのように描かれていました。

ところが終盤、タチアナも家族を失いイリーナから同じ問いを受けた際に「私は看護師だから相手を殺すのは嫌だ、だが死ぬのも嫌だ。自分のできる事(治療)をする」と答えました。これはタチアナを通して作者からのメッセージでもあるような気がしました。二つしか選択肢がないように見えても第3の選択肢がある場合もある、と。

 

本屋大賞を受賞するだけあって読み応えのある本でした。おすすめです。

コロナ陽性になりました…

8月9日に発熱し、8月10日にPCR検査にてコロナ陽性と診断されました。発熱自体は11日にはおさまっておりましたが、咳が長引きました。

発症初期は寝ることしかできないくらいに酷いものでしたが、落ち着いてくると10日間という長い療養期間をどのように過ごそうか、という問題が出てきます。

私の場合は
Netflix & Amazon Prime Video
Kindle & 紙の書籍
Audible
プログラミング
ファイアーエムブレム風花雪月

などで過ごしました。

Netflix & Amazon Prime Video

Dr.STONE」、「メイドインアビス」、「アルドノア・ゼロ」(第1話のみ)などの視聴をしました。
先にNetflixのランダム再生で興味のあるものを探し、Prime Videoで続きを見るような流れですね。Prime Videoは30日間無料体験をすることができたもので。

Audible

ハリーポッターと秘密の部屋」をきいていました。ベットで寝込んでいた時に聞いていたのですが、当時はまだまだ症状がきつかったので落ち着いてからにした方が良かったかもしれません。

Kindle & 紙の書籍

あしながおじさん」という本を読んでいました。「わたしのあしながおじさん」の原作ですかね。典型的なシンデレラストーリーでしたが、孤児生まれの少女が大学に行った際の新鮮な気持ちは読んでいて面白かったです。
また、Amazon Primeに加入したおかげで「銀河英雄伝説」が無料で読めたのでそれも読み始めました。「アルスラーン戦記」と同じ作者だったんですね。これを機にKindle Unlimitedに加入してみました。

プログラミング

オライリーの「問題解決のPythonプログラミング」という、アルゴリズムの問題集のような本の問題を解いていました。中には難しい問題もあるのでそうしたものは今は置いておいて、他にも「Pythonでつくるゲーム開発入門講座実践編」をKindleで購入してやり始めることにしました。

ファイアーエムブレム風花雪月

紅花ルナの攻略をしていました。無事白きものはアイムールでタコ殴りにしました。(笑)

桐島は出てこないのか…

桐島、部活やめるってよ」を読みました。

 

 

タイトルが非常に印象的な本ですが、肝心の桐島は全く出てきません。代わりに桐島がバレー部を突然退部する事で周りの人間に直接的、間接的に影響を受け、その様子を描いたのが本作になります。ミステリーのような明確な解決というものはなく、あくまでも登場人物それぞれが抱えているものをつづったものになるので少し肩透かしを食らってしまうかもしれません。印象に残った人を挙げると…

 

 

 

小泉風助

バレー部部員。桐島が退部したことで自分が試合に出られるようになり嬉しい反面、そんな自分に対して嫌悪を抱くという相反する思いに悩まされていました。また、ベンチにいたときに桐島にキャプテンの印を貼るときに強い印象を覚えていたり、自分がコートに立つことでベンチにいる人に聞きたくなった時に自分がベンチにいた役割を改めて認識していました。

 

前田涼也

実写版で神木君が演じていた人らしいですね。(私は観てないです…)

スクールカーストというものを強く認識している人。とはいえ、彼の映画に対する情熱は全くかかわりのなかった宏樹には眩しく見えるものというのが個人的には良いなと思いました。(小並感)

 

 

宮部実果

一番重い人かもしれないです。親の再婚によって父と義母と義姉と住んでいましたが、事故により父と義姉が亡くなってしまいました。そのショックによって義母から義姉として認識されて生活することになってしまいます。

義母から大切にされていないと嘆きつつ、彼女自身もまた義母の誕生日祝いを購入するときに年齢を知らなかった、そこまで関心を払っていなかった自分に気づかされます。

 

菊池宏樹

一見陽キャに見えても、胸に抱えるものがあるのだなと感じました。読んでいて最もつかみどころが無いと感じましたが、それは彼自身、何を考えているのか、何に対して不満を感じているか分かっていなかったのですね。終盤、前田を見たときに何かに対して全力で打ち込んでも、結果が出せないかもしれないという恐怖によって一歩を踏み出せない状況だったと気づきます。

 

 

Pythonの外部ライブラリが増えると…

CPythonを使っているとコマンドプロンプトやターミナルで気軽に「pip install ~」と入力できてしまうために、外部ライブラリが増えてしまいますよね。

今回は自動でそれら外部ライブラリをアップデートできる方法を紹介します。そのライブラリがpip-reviewというものです。
外部ライブラリなのでコマンドラインで以下のように入力し、インストールする必要があります。

$ pip install pip-review 


コマンドラインからpip-reviewを実行するには

$ pip-review --auto
と入力すれば現在そのパソコンにインストールされている全外部ライブラリをアップデートしてくれます。


とはいえ、毎回コマンドラインに入力するのもめんどくさいので私はこのようなファイルを作成いたしました。

import subprocess as sp
import os
os.chdir("自分の管理しやすいディレクトリ")
run = ['pip-review --auto', 'pip freeze > requirements.txt']
for r in run:
    sp.run(r)

ディレクトリの変更をするのはこのファイルをデスクトップに保存して実行する予定なのでつけております。
デスクトップから実行するだけですべてアップデートしてくれますし、その外部ライブラリ一覧ファイルも保存してくれるようになるので本当に便利でおススメです。

遺伝子検査を受けてみました

人間は遺伝から5割、環境から5割の影響を受けて人生を生きる事になるそうです。

 

また、スヌーピーにもこんな言葉がありますね

配られたカードで勝負するっきゃないのさ、それがどうゆう意味であれ

 

では、自分にはどんなカード(遺伝子)があるか気になってきたのでGeneLifeで遺伝子検査を受けてみました。

GeneLifeは志向性や身体的特徴、疾患リスクに重きを置いていて、Myselfでは性格における遺伝的素養(開放性が高いとか)を知る事ができます。検査項目数が結構多いので気になった点を抜粋していきたいと思います。

 

 

GeneLife

飲酒量は多い傾向なので、ひょっとしたらやけ酒するタイプなのかもしれないですね…普段は全く飲まないのですが…

f:id:Thothlog:20220730214914p:image

 

買いだめ傾向も多かったです。確かに積読する時は結構するので納得ですね。

f:id:Thothlog:20220730214956p:image

 

気になるのはやや夜型傾向だった事です。現代の生活では朝型の人向けの生活リズムになっているので気をつけなくては…

f:id:Thothlog:20220730215002p:image

 

情報処理に関してはそこそこ良いものを持っているのかもしれないです。

f:id:Thothlog:20220730215435p:image

 

筋肉のつき方は遅筋タイプでした。これは持久力を求められる競技向けのタイプみたいです。

f:id:Thothlog:20220730215605p:image

 

Myself

そしてMyselfではあらかじめ性格診断を行います。遺伝子が持っている性格の傾向と、自分の自覚する性格を比べる事ができます。私の結果はこちらのようになりました。

f:id:Thothlog:20220730215931p:image

私は結構内向的な性格で、他人と関わるのが苦手だと感じていたのですが、遺伝子では社会性が高く、どうやら他者との関わりを求めているようでした。これは意外。

また、開放性と慎重性(精神の安定度)も高いのでこれは強みとして活かしたいと思いました。そして少しショックを受けたのがそんなに勤勉性が高くなかった事ですね…。

確かにそんなに勉強してこなかったし…部活の取り組みも素晴らしいものではなかったような気がするので…。本来の自分を突きつけられているようでちょっと情けなくなってしまいました。とはいえ標準的な勤勉性なので最悪でなかっただけマシと言えるでしょう。