真夜中は涼しいのでありがたい。NHK が一晩中大雨対策の番組をやっているのが気になるが寝る。

5:45 に一度目がさめる。トイレに行って戻って二度寝。するとぐったりと疲れが出てきて 8:00 に体が動くようになる。朝飯は納豆とおにぎり。やはりおにぎりは一個で十分かもしれない。 雨が降っているが、しばらくしてやむ。

スッキリを観ながら 9:00 に PC を開く。書類の仕込みをやるか。 未応募の求人票を一枚ずつ応募先の送付状(宛名書き)と、 これはどうかと思うが履歴書日付の自動更新を発動。

9:45 送付状 8 社ぶん終わり。でも全部には応募しない。さっきから体がだるい。 鈍っているという表現がぴったりだ。

10:45 麻雀コード整理。シャンテン数関連のコードだけをモジュールに分けると、独立性が意外に高いことがわかる。 コマンドラインから牌姿を与えてシャンテンを標準出力に書き出すメイン関数を実装。 国士とチートイもここに持ってくる。

早めに外出。早めに横川コミュニティー会館図書室を利用。 新聞と統計解析。カイ自乗検定とあと何かを読んだと思う。

13:00 ハローワーク墨田。きょうは検索しないで紹介状を取得する。 あまりにも書類選考通過率が低いので、一気に三社いってみる。 職員が先方に予告電話をするのが、そばで聞いていてドギマギする。

13:30 ファミリーマート江東橋一丁目店で応募書類を印刷する。90 円。だいぶ慣れた。

ハローワークの筆記台を借りて応募書類の宛先を封筒に書き込む。すべて終わって楽天地に移動。

14:05 錦糸町パルコ内郵便局へ移動。さらに筆記台で糊を借りて封印。 そのまま三通を郵便受付に提出して郵送してもらう。360 円。

14:10 錦糸町ロフトでボールペンの替芯を購入。110 円。

14:15 西友錦糸町店。221 円。

  • ピザパン
  • ポテチ鶏ごぼう
  • 板チョコビター

錦糸公園の馴染みのベンチでおやつ休憩。ギリギリ雨が降っていない。 ごぼうの風味が食べているうちに慣れてくるのは問題だ。 そして板チョコをかじると脳内にシアワセ物質が出てくる(筧史朗風表現)。

オリナスのヤマダ電機に移動してワイドショーを観て時間つぶし。 それからタイトー F ステーションオリナス錦糸町店に移動。また 5 クレ使ってしまった。 MJ トップ獲れない。

18:35 カスミオリナス錦糸町店。477 円。

  • あんかけ八宝菜焼きそば
  • 野菜ジュース 900ml

19:05 ビッグエー墨田業平店。254 円。豆腐か納豆か忘れている。

  • シュークリーム
  • 小粒納豆 (3)
  • ふっくらおむすび明太マヨ
  • ふっくらおむすび辛子明太子

だんだん雨が強くなる。左靴が濡れ始めると危ない。19:20 向島の部屋に戻る。 エコバッグ(北区銭湯スタンプラリー戦利品)に入れていたあんかけ焼きそばのフタが微妙にゆるくて中身が若干漏れている。 仕方がないのでそのまま食う。

晩飯を食ってレシートの整理をしてから、雨の中電話ボックスに移動することになる。 もう 20:00 だ。

インターネット関係の作業をする。メール着信なし。今日の応募にかけるしかない。

部屋に戻って風呂に入る。扉の内側がカビだらけなのをシャワーで洗い落とす。 風呂から出てみると、床が水浸し。前のアパートではこれでいけたのに。 古バスタオルを一枚消費して床の水気を吸収する。あらかた終わったところで古びた肌着の存在を思い出す。これはダメだ。

21:20 PC をやる。また汗が吹き出してきた。国士のシャンテンを書き直す。

いい加減水虫を治療しないと。ホームレスをやめれば自然治癒するかといえば、全然そうではないとわかった。 なんとか給付金をゲットして薬代にしたい。なんの手続きもしていないが。

チートイシャンテンもリフォーム。この関数のロジックだけは他と違って引数が麻雀牌である必要がない。

麻雀の練習をしていると日付が変わっている。

Programming Notes

国士無双用のシャンテン数計測関数を書き直す。考え方を四面子一雀頭のそれと合わせることにする。

def count_shanten_13_orphans(player_hand: Union[Counter, Iterable]) -> int:
    """Count the shanten number of player's hand growing to Thirteen Orphans

    The length of ``players_hand`` must be 13 or 14.

    >>> count_shanten_13_orphans(tiles.tiles('139m19p19s東南西北白発中'))
    0
    >>> count_shanten_13_orphans(tiles.tiles('19m19p19s東南南西北白発中'))
    -1

    >>> count_shanten_13_orphans(tiles.tiles('17m133469p388s北発中')) # 9m19s東南西白
    7
    >>> count_shanten_13_orphans(tiles.tiles('17m133469p88s西北発中')) # 9m19s東南白
    6
    >>> count_shanten_13_orphans(tiles.tiles('11m133469p88s西北発中')) # 9m19s東南白
    5
    >>> count_shanten_13_orphans(tiles.tiles('119m13369p88s西北発中')) # 19s東南白
    4
    >>> count_shanten_13_orphans(tiles.tiles('119m1369p188s西北発中'))
    3
    >>> count_shanten_13_orphans(tiles.tiles('119m169p1889s西北発中'))
    2
    >>> count_shanten_13_orphans(tiles.tiles('119m19p1889s東西北発中'))
    1
    >>> count_shanten_13_orphans(tiles.tiles('119m19p189s東南西北発中'))
    0
    >>> count_shanten_13_orphans(tiles.tiles('119m19p19s東南西北発中'))
    0
    """

    if not isinstance(player_hand, Counter):
        player_hand = Counter(player_hand)

    if sum(player_hand.values()) not in (13, 14):
        raise ValueError('player_hand must be concealed')

    num_orphans = len(orphans := player_hand & tiles.THIRTEEN_ORPHANS)
    if (player_hand - orphans) & orphans:
        return 12 - num_orphans

    return 13 - num_orphans

例によって雀頭の有無で場合分けが必要だ。

ところで私は他人の麻雀プログラムを見たことがない。しかし Python プログラマーならばクラス collections.Counter を必ず利用していると信じる。 こんなふうに constant instance を定義しておいてフィルターする手法があまりにも見通し良し。