Thothの日誌

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

「テスカトリポカ」を読みました

とても深淵な表紙に惹かれたのと直木賞2位という事もあって購入しました。

あらすじを大まかに説明すると、
麻薬密売人組織を築いていたメキシコ人が敵対する組織によって家族、兄弟を殺され、その復讐を成す為に力を付けようとします。そして紆余曲折あって日本で臓器売買、特に心臓移植のビジネスを手掛けることになります。
それと並行して、メキシコと日本のハーフの少年コシモが親殺しによって少年院に入れられていましたが無事出所し、彼もこの組織に入る事で物語が大きく動く、というものです。


人物達が徐々に登場し、なおかつそれぞれに生い立ちや組織に入る経緯が語られるのでそれが済むまでに、特にコシモがバルミロの組織に入るまでに本書の半分を割いているのが特徴です。そのような作風ではヴィクトル・ユゴーレミゼの作者)と似ているかもしれません。

物語のセットアップの時間がかなり多いので冗長さを感じる人は出てくると思います。とはいえそれぞれのセットアップに転換点や変化は富んでいるのでおそらく読んでいて退屈になるのはアステカ神話の説明の箇所かなぁと思います。

ここから先はラストに関する疑問なのでネタバレが怖い方はブラウザバックをお願いします。
















パブロはどうなった?

何となく死んだような話の展開でしたが、そうだとすると疑問が残る点があります。

終盤、コシモはパブロの娘に会いますが、何故彼の家族と判明できたのか、また彼女にコシモとパブロの名を刻んだナイフを渡します。本文を読むとパブロはコシモに自身の家族のことを伝えていないように思われます。

コシモと共にいた男は誰?

パブロ説
パブロはバルミロに殺されておらず、コシモとその後に会って家族について伝えた。そのおかげでコシモはパブロの娘を知り、ナイフを渡すことができた。
バルミロとパブロの最後のやり取りを見ると「エルコシネーロ、もう終わりだ」とバルミロに対してパブロが言うもののその後、バルミロの描写は港に向かっていくところから再開する為、明確なパブロの死の描写がない。パブロの家族に自分自身が死んだと伝えたのも死を偽装した可能性がある。自分が生きていて、もしもバルミロ達の生き残りがいれば家族が危ない為自身の死を偽装した(パブロの家族にはパブロが亡くなったと伝えられている)。

バルミロ説
コシモに頭を割られているのでかなり怪しいが、共に港に落ちるも生還する。彼ならパブロの身内について知っていてもおかしくないと思う。だが、あのバルミロが最後コシモにパブロの遺品を渡す手伝いをするか、と言われるとかなり厳しい。

コシモの人間関係は非常に限られていて一緒にいた男の選択肢はこの2択しかないような…。
創作物の暗黙の了解として、突然ぽっと出の登場人物がラストを飾るとは思えないのでそれまでの間に登場人物として登場させる、というルールみたいなものがノックス十戒で定められています。必ずしも遵守される訳ではないけど…

最後に

テスカトリポカという名前はゴッドイーターというゲームで聞いたことがあるので存在自体は知っていましたが、まさかここまで強大で恐ろしい神様として伝えられているとは知りませんでした。
また、本書では結構スペイン語が登場してくるのでスペイン語についても少し調べてみたのですが、日本と同じ母音数でほぼローマ字読み、又はアルファベット読みで読めてしまうというのは驚きでした。これをきっかけにスペイン語にも興味を持ちましたね。

「女王たちを一緒にするな」を解いてみました


「問題解決のPythonプログラミング」という本の第4章「女王たちを一緒にするな」の問題を解いてみました。

前回↓

Nクイーン問題の一歩手前の8クイーン問題ですね。8×8の盤面で8つのクイーンがお互いの効き(移動範囲)に入らないように配置することができるか?という問題です。
ここで表示されるリストは各インデックスが盤面の列数を、それぞれの数字が盤面の行数を表します。

問題1

サンプルにあるコードを完成させると、8クイーン問題の解答が出力されるようになります。その解が結構あるので、新たに任意の解の数字だけ出力させるプログラムを書く、というものですね。

def eight_queens_n(answer: int, n=8):
    """練習問題1の解答用。求める解の数を引数にとり、その数だけ出力する"""
    board = [-1] * n
    ans_count = 0
    for i in range(n):
        board[0] = i
        for j in range(n):
            board[1] = j
            if not no_conflicts(board, 1):
                continue
            for k in range(n):
                board[2] = k
                if not no_conflicts(board, 2):
                    continue
                for l in range(n):
                    board[3] = l
                    if not no_conflicts(board, 3):
                        continue                
                    for m in range(n):
                        board[4] = m
                        if not no_conflicts(board, 4):
                            continue
                        for o in range(n):
                            board[5] = o
                            if not no_conflicts(board, 5):
                                continue
                            for p in range(n):
                                board[6] = p
                                if not no_conflicts(board, 6):
                                    continue
                                for q in range(n):
                                    board[7] = q
                                    if no_conflicts(board, 7):
                                        print(board)
                                        ans_count += 1
                                        if ans_count == answer:
                                            return
    return

パズル問題2

8クイーン問題を解く際、予めユーザーが特定の場所にクイーンを置いていたらどんな解答になるか出力する問題です。リストの-1がまだクイーンが置かれていないことを示します。

def eight_queens_location(location: list, n=8):
    "パズル問題2の解答"
    board = [-1] * n
    for i in range(n):
        board[0] = i
        for j in range(n):
            board[1] = j
            if not no_conflicts(board, 1):
                continue
            for k in range(n):
                board[2] = k
                if not no_conflicts(board, 2):
                    continue
                for l in range(n):
                    board[3] = l
                    if not no_conflicts(board, 3):
                        continue                
                    for m in range(n):
                        board[4] = m
                        if not no_conflicts(board, 4):
                            continue
                        for o in range(n):
                            board[5] = o
                            if not no_conflicts(board, 5):
                                continue
                            for p in range(n):
                                board[6] = p
                                if not no_conflicts(board, 6):
                                    continue
                                for q in range(n):
                                    board[7] = q
                                    if no_conflicts(board, 7):
                                        for r, s in zip(location, board):
                                            if r != -1:
                                                if r != s:
                                                    break
                                        else: # 指定場所が一致したら
                                            print(board)
    return

解答結果

解答結果を出力すると…

# 上記のコードの続き
if __name__ == '__main__':
    # 練習問題1
    print("練習問題1")
    eight_queens_n(4)
    print()

    # パズル問題2
    print("パズル問題2")
    eight_queens_location([-1, 4, -1, -1, -1, -1, -1, 0])

その出力が

練習問題1
[0, 4, 7, 5, 2, 6, 1, 3]
[0, 5, 7, 2, 6, 3, 1, 4]
[0, 6, 3, 5, 7, 1, 4, 2]
[0, 6, 4, 7, 1, 3, 5, 2]

パズル問題2
[2, 4, 1, 7, 5, 3, 6, 0]

スペイン語に興味を持ちました

この前この本を読んだのですが、スペイン語がそこそこ出てくるのでスペイン語について調べてみました。


スペイン語の母音は「a,e,i,o,u」で日本語と同じ5つで読む際にちょっとした違いはありますがほぼローマ字読みで読めてしまうということから興味を持ちました。
Soy un estudiante. (ソイ ウン エストゥディアンテ) 私は学生です。
Voy a la escuela. (ボイ ア ラ エスクエラ) 私は学校に行きます。
などなど。

ただし、男性名詞、女性名詞の2種類があり、他にも単数形、複数形によって活用が変わるのでそこがややこしい所でもあります。
早速入門書と単語帳を購入したので学習をしていこうかなと思う所存です。どこまでできるようになるかは未知数ですが…

風花雪月 紅花ルナ 第2部突入時のステータスなど

前回、翠風ルナをクリアしたと報告しました。

 

 

そして今回は紅花ルートを攻略したいと思います。白雲の章はどのルートでも同じなので軽く飛ばしました。

紅花スタートのミルディン大橋の戦いでのものですね。

 

2022/09/17追記 紅花クリアしました

f:id:Thothlog:20220917152309j:image

引き継ぎありルナですが、翠風に引き続き紅花ルートもクリアしました。2ルートルナをクリアすると流石にルナティックという難易度にも慣れてきましたね。とはいえ蒼月ルナは最難関と呼ばれるくらい難しいらしいので今後どうなるかは分かりませんが…。

 

ベレス

f:id:Thothlog:20220816112930j:image

遊び心で英語でプレイしようと思ったので名前は英語表記になっております。ブログに投稿するため、一時的に日本語に戻しました。攻略中も英語でやってました。流石に何周もしているのでイベントはスキップですが、攻略時の英語だけでも案外勉強になります。クリアしたら改めて全編英語でイベント鑑賞もありかもしれません。

今回先生はスナイパーを極めようと思いました。物理武器の剣、槍、斧、籠手は網羅していましたが、まだ弓はサブウェポンでしか使ったことがないのでやってみることにしました。とは言え、弓は基本戦技である曲射しか習得しないので序盤はぱっとしなかったです。スナイパーになってからが本領発揮でハンターボレーで1殺できるのでありがたいです。…先生が強いというよりハンターボレーが強いのでは…?(笑)

クリア時

f:id:Thothlog:20220917150808j:image

ハンボレが強すぎて言うことなしです。

 

エガちゃん

f:id:Thothlog:20220816112943j:image

初見紅花はハードでやりましたがその時はカイゼリン路線で行きました。とても悲しいですが弱かったです…。専用職なのに…。最終マップで進軍が全然進まないのもカイゼリンで行くにはお勧めしない要素ですね。

今回はルナなのでドラゴン路線で行きます。他の人はやっているかもしれませんが私はまだやっていなかったので使ってみたかったです。

最終マップではアイムールの戦技でタコ殴りにする予定です。(笑)

クリア時

f:id:Thothlog:20220917150856j:image

ドーピングをしまくった為とんでもないゴリラに成長したエガちゃん。

もうちょっとアイムールを使っても良かったかもしれないです。狂嵐をもっと見たかった…。とはいえエガちゃん外伝は狂嵐ドラマスで突撃していかないと相手の物量が凄すぎて進軍できなかったですね…。

 

ヒューベルト

f:id:Thothlog:20220816113014j:image

得点の移動力+2とカドゥケウス装備で攻撃範囲を補い、ダークビショップで行きます。ハードではダークナイトだったのですが、最終マップの燃える床は意外にも魔導士は移動コスト1で移動できるのでこれでもいいかなと思いました。その変わり技能のリソースを信仰に振り、リカバーまで習得させておきました。リンハルトがベンチ状態のわが軍ではビショップという回復専門職は0で攻略するため、魔導士はほぼ全員リカバーorリブローまで習得させております。(どっちも習得しない方々もいますが…)

慎重に進めるため、これまでは思考停止でビショップを組み込んでおりましたが、ビショップの何もせず行動終了率が結構高いのでダメージ源が減ってしまっているなぁと前から思っていたからですね。意外とビショップ不在でも何とかなります。

クリア時

f:id:Thothlog:20220917151026j:image

バンシーで足止めしたり役に立ってくれました。今回はダークビショップのまま運用しましたが結構いけますね。

 

フェルディナント

f:id:Thothlog:20220816113115j:image

回避盾その1。彼は格闘回避担当です。引継ぎありで攻略しているので飛行Bまで引き上げて警戒姿勢を習得させてあります。まだ+にもなっていないのに十分すぎる回避性能を誇ります。レベルアップによるHP上昇に備えて毎ターンHPが自動回復する指輪を持たせています。(女神の指輪だったかな)格闘は3すくみを考えなくてもいいので剣回避盾では荷が重いパラディンやファルコン相手にも強気に出れるのがいいですね。また、素手で戦うこともできるので壊れた籠手と合わせてフリーマップによる指導が捗るのが強み。これのおかげで魔神や鬼神、命中+を習得していない組の習得が加速しました。

クリア時

f:id:Thothlog:20220917151125j:image

彼のお陰でほぼ全員技能S+獲得することができました。最強の回避盾兼育成係でした。

 

カスパル

f:id:Thothlog:20220816113124j:image

アタッカー用格闘要因ですね。紅花ルートは悪路が多いので軽歩兵が助かるのもあり、格闘重視で育成しています。ウォーマスターにまで上り詰めましたが終盤はグラップラーで行くつもりです。獅子王隊も配備しておけばとても優秀なアタッカーになってくれます。

クリア時

f:id:Thothlog:20220917151222j:image

最終マップは予定通りグラップラーで行きました。猛烈鉄拳の火力はとんでもなく、訓練用籠手+で近接の敵をワンパンできるという凄まじい威力でした。(獅子王隊配備で)

 

 

 

ベルナデッタ

f:id:Thothlog:20220816113148j:image

ボウナイトで囲いの矢を撃ってもらいます。狙撃によるつり出しも可能ですね。彼女と回避盾のおかげで鉄壁が不要なのがありがたい。ただ、問題点は火力不足な点ですね…。彼女にとどめを刺させたいのに彼女では倒せない事が多いので素直に足止め要因と割り切ってもいいかもしれません。

クリア時

f:id:Thothlog:20220917151419j:image

予定通りボウナイトになりました。囲いの矢は便利で魔獣を足止めするだけで後詰めの敵を止めることができるのが便利でした。

 

ペトラ

f:id:Thothlog:20220816113159j:image

剣回避盾。踊り子をペトラにして剣回避+20を習得させました。また、警戒姿勢+にまで引き上げたので彼女も回避性能はピカイチです。紅花ルートは挟み撃ちや複数の方向から敵が進軍してくることが多いので回避盾が一人では足りません。ただ、ファルコンにすると火力不足は深刻なことになりそうな予感…。アサシンのままでもいいかもしれないです。

クリア時

f:id:Thothlog:20220917151534j:image

これだけ回避を盛っておけばガンガン避けてくれるのでフェルディナントと一緒に釣りだししてました。

 

イエリッツァ

f:id:Thothlog:20220816113214j:image

天才はやはり優秀ですね。速攻で鬼神と命中が習得でき、なおかつグラップラーにまでなれるとは…(画像時点ではまだまだですが、その後すぐにできてしまいました。)初見紅花では死神騎士を使いましたが、後半の悪路の前ではかなりきつかったのでグラップラーで行きます。ドラゴンも考えましたが流石にきついですね…。

クリア時

f:id:Thothlog:20220917151625j:image

強いので特に言うことが…。

 

以下、遠距離魔法組。

コンスタンツェ、マヌエラ、ドロテアのサンスト、メティオだけで計10発もの遠距離魔法を浴びせることができます。ドロテアだけだとメティオ2発しかないので、貧乏性が発動して打たずじまいになってしまうなと思いまして…。

これだけいると結構打てるのでスナイパーや砲台狩りには最適ですね。そしてこれら遠距離魔法があるからこそ全員グレモリィでも問題ない理由になります。エガちゃんと支援のある教団組にはマヌエラとハンネマンがいますし、アビス組ならコンスタンツェがいるので採用したところ魔導士の割合が高い編成になりました。「黒鷲ならでは」という感じがして使っていて楽しいです。

 

ドロテア

f:id:Thothlog:20220816113229j:image

オーソドックスですがグレモリィでメティオによる支援ばらまきがシンプルに有効ですね。意外と火力にも困らないのでアーマー程度なら溶かせます。

クリア時

f:id:Thothlog:20220917151723j:image

魔力成長率は魔道士系では低いはずなのですが、今回のドロテアはよく育ってくれたおかげでグレモリィでも火力に困ることはありませんでした。メティオでワンパンできないのはキツイなぁ(砲台などで)と思いましたが近づけばアロー、トロン、アグネアの矢と優秀な魔法が多いので成長率だけでは語れないキャラだなぁと思いました。成長率は高いのに習得魔法が微妙なフレンは見習ってほしい…。彼女の場合レスキュー、リザーブでの支援がメインなのでしょうけど…。

 

コンスタンツェ

f:id:Thothlog:20220816113241j:image

レスキューとサンストを活かすため彼女もグレモリィで行きます。彼女の難点は命中難であることですかね。命中+を習得させてもまだ火力が足りないです。フレンがいないので貴重なレスキュー要因でもあります。

クリア時

f:id:Thothlog:20220917152013j:image

サンストの命中があまりにも不安だったので命中+の習得をさせました。

今回はユーリスを使ってないのでドローミは彼女に持たせました。レスキューしつつ再移動するのはかなり便利でした。

 

マヌエラ

f:id:Thothlog:20220816113252j:image

魔神を習得させるとスナイパーやアーマー程度なら倒せるので火力は意外とあります。ただ、医務室に勤めながらリブロ―もリカバーも習得しないのは如何なものか…。

クリア時

f:id:Thothlog:20220917152115j:image

火力はコンスタンツェには及びませんが命中に勝る印象がありましたね。

パレオさんのブログ

今週のお題「おすすめブログ紹介」ということで今回は「パレオな男のブログ」を紹介したいと思います。
URLはこちらになります。
https://yuchrszk.blogspot.com/

このブログのテーマはダイエット、健康、メンタルヘルス、仕事でのパフォーマンス、人生、幸福感と多岐に渡り、かつパレオさんこと鈴木祐さんは若い頃から論文を読むのが日課だったらしく、科学に則った内容のものが多いです。よくある「俺の体験記」のような自己啓発でもなく、絵空ごとを述べているのでもない地に足のついた内容が多いのでとても勉強になります。

鈴木さんの書いた本では下記の本を読みました。

「パーティーに行くタイミング」を解いてみた

こちらの本の第2章「パーティーに行くタイミング」の練習問題及び、パズル問題の(自分なりの)解答を掲載します。
これよりも良い解答、誤りがございましたら指摘していただけると幸いです。

前回はこちら


ちなみに下記のコードの関数には""" """で囲まれた文字列がありますが、これはdocstringというものでして、関数の説明文にあたる物になります。
help(func)で出力される文字列を埋め込むことができます。確か、Fluent Python によると作成した関数オブジェクトの__doc__属性に入れられたと思います。

練習問題1

サンプルコードに自分がパーティに居られる時間の引数を追加してその時間内で会うことができる有名人の最大人数を出力する問題ですね。

from copy import deepcopy

sched = [(6,8), (6,12), (6,7), (7,8),
         (7,10), (8,9), (8,10), (9,12),
         (9,10), (10,11), (10, 12), (11,12)]

sched2 = [(6.0, 8.0), (6.5, 12.0), (6.5, 7.0), (7.0, 8.0),
          (7.5, 10.0), (8.0, 9.0), (8.0, 10.0), (9.0, 12.0),
          (9.5, 10.0), (10.0, 11.0), (10.0, 12.0), (11.0, 12.0)]

# P23パズル問題3用
sched3 = [(6.0, 8.0, 2), (6.5, 12.0, 1), (6.5, 7.0, 2), (7.0, 8.0, 2),
          (7.5, 10.0, 3), (8.0, 9.0, 2), (8.0, 10.0, 1), (9.0, 12.0, 2),
          (9.5, 10.0, 4), (10.0, 11.0, 2), (10.0, 12.0, 3), (11.0, 12.0, 7)]

def your_time(sched, ystart, yend):
    """P22の問題①用"""
    count = [0] * (yend + 1)
    for i in range(ystart, yend):
        count[i] = 0
        for c in sched:
            if c[0] <= i and c[1] > i:
                count[i] += 1
    return count

def your_best_time(schedule, ystart, yend):
    """P22の問題1用"""
    count = your_time(schedule, ystart, yend)
    maxcount = 0
    for i in range(ystart, yend + 1):
        if count[i] > maxcount:
            maxcount = count[i]
            time = i
    print(f'{ystart}時から{yend}時までの場合、{time}時に{maxcount}人の有名人が来ています')

your_best_time(sched2, 5, 13)

出力が

5時から13時までの場合、8時に4人の有名人が来ています

練習問題2

別のやり方で有名人が最大になる時間帯を求める問題です。

def practice2(sched):
    """P22練習問題2用。有名人の滞在時間を順に選び、
他の有名人で滞在時間中にその選んだ有名人の開始時間を含むのが何人いるかを数える。
パーティーに行く時間は他の有名人が一番多くいる滞在時間の有名人の開始時間にする。
"""
    sorted_time = deepcopy(sched)
    sortlist(sorted_time)
    count_dict = {} # 人数: 開始時間の辞書
    max_count = 0
    for c in sorted_time: # タイムリストからセレブ一人を選ぶ
        count = 0
        check_list = deepcopy(sorted_time)
        check_list.remove(c) # 自分自身は除外する
        for t in check_list: # 他の有名人の滞在時間中に選んだセレブの開始時間を含むのが何人いるか
            if t[0] <= c[0] < t[1]:
                count += 1
        if count > max_count:
            max_count = count
        if count_dict.get(max_count, 0) == 0:
            count_dict[max_count] = c[0]

    print(f"""{count_dict[max_count]}時に行くと一番有名人が多くなり、{max_count + 1}人います""") # 選んだセレブも足すのでmax_count + 1

practice2(sched)

これの出力はサンプルコードでやっていたものと同様になります。

9時に行くと一番有名人が多くなり、5人います

パズル問題3

各有名人ごとにもどれだけ好ましいか、重みが付属されているものとして、その重みが最大になる時間帯を見つける問題です。

def bias(sched):
    """P23パズル問題用。
各有名人には重みがある為、重みが最大になる時間帯はいつになるかを判定する"""
    sorted_time = deepcopy(sched)
    sortlist(sorted_time)
    dignity_dict = {} # 重み: 開始時間の辞書
    dignity = 0
    count = 0
    max_count = 0
    for c in sorted_time: # タイムリストからセレブ一人を選ぶ
        count = c[2]
        check_list = deepcopy(sorted_time)
        check_list.remove(c) # 自分自身は除外する
        for t in check_list: # 他の有名人の滞在時間中に選んだセレブの開始時間を含むのが何人いるか
            if t[0] <= c[0] < t[1]:
                count += t[2]
        if count > dignity:
            dignity = count
        if dignity_dict.get(dignity, 0) == 0:
            dignity_dict[dignity] = c[0]
    print(f"""{dignity_dict[dignity]}時に行くと、最も威厳のある方々が来られます。
その重みの合計は{dignity}です""")

bias(sched3)

その出力が

11.0時に行くと、最も威厳のある方々が来られます。
その重みの合計は13です

次回↓
thothlog.hatenablog.com

銀河英雄伝説1 黎明編を読みました

コロナに罹患した際、発熱が治まった頃の療養期間中にKindle銀河英雄伝説があったので読んでみました。普段の自分なら紙の本を購入することが多く、Amazonで購入して郵送されるのを待つのですが、あの状況では流石に待ち遠しいと感じて電子書籍で見ることにした次第です。


タイトルに「銀河」と付いているように人類は地球を脱出している為、舞台は宇宙になります。ルドルフという男が民衆の支持の元に皇帝になりましたが、その男は有生思想を持っていました。体や知能に障害のある者を抹殺せよ、という事を言ってしまいます。
この帝国はドイツ風の名前だったり、ルドルフという名前も何処となく彼に似ている事からおそらく帝国のモデルはナチスドイツでルドルフはヒトラーをモデルにしているのかな?と思いました。
しかし、ルドルフの息子も障害を抱えていたというのがなんとも皮肉なのが…

このような事をしでかしてしまったので国が分裂し、元々あった帝国は「銀河帝国」と、帝国から抜け出した集団が「自由惑星同盟」(フリープラネッツ)を作り、その2者間の戦争を描いた作品になります。
帝国側にはラインハルト・フォン・ローエングラムが、同盟側にはヤン・ウェンリーがメインに歴史小説風に物語が進行していきます。

ラインハルトは「常勝の天才」と呼ばれ、戦術的にも戦略的にも勝つ事に長けています。ヤンは「不敗の魔術師」と呼ばれ、どんなに不利な状況でもそれ以上に被害が大きくならないように危機を切り抜ける事に長けています。

ラインハルトは野心が強く、権力を強く求めているのに対して、ヤンは野心がなく、出世は求めないから戦争を終わらせて安らかに生きていきたいと願っていると正反対の2人ですね。

特に印象的だったのは本書の終盤、ヤンが口にした、

(中略)人間の社会には思想の潮流が二つあるんだ。生命以上の価値が存在する、という説と、生命に優るものはない、という説とだ。人は戦いをはじめるとき前者を口実にし、戦いをやめるとき後者を理由にする。それを何百年、何千年もつづけてきた……」

という台詞ですね。日本の太平洋戦争を思い浮かべてしまいました。
結構長いシリーズになるので最後まで読破できるかは分かりませんが1巻はとても興味深かったです。