プロジェクト

全般

プロフィール

日記 #1159

完了
NO NO

日記 #958: 2026年

2026-W31

日記 #1159: 2026-W31

nop_thread さんが約2ヶ月前に追加. 約2ヶ月前に更新.

ステータス:
終了
担当者:
開始日:
2026/07/27
pinned:
いいえ
リマインド予定日:
前回確認日:
2026/08/06

NO nop_thread さんが約2ヶ月前に更新 操作 #1

ステラソラの戦闘面再評価

nop_thread さんは #968#note-5 で書きました:

戦闘は結構楽しい。
いわゆるローグライトというやつ?
ランダム性ゆえ周回する理由があり、根本的な部分のゲームシステムがシンプルで (つまり何らかの属性やその組み合わせによって例外や追加事項が増殖するようなゲーム性ではないので)、即応性を求められない形で戦略を最適化する楽しみがある。
かなり自分に合っていると思う。

……と半年前には思っていたが、結局育成が重いのと、一度強い記録ができたらそれを使ってゴリ押ししがちになる (周回の負担が微小な改善に釣り合わないと感じるようになる) ので、結局戦闘もやらなくなった。
具体的には、塔の周回を全然しなくなって他の戦闘もほとんどオートでやっている。

結局記録を作る部分も、目標の構成を調整する部分はあるものの、本質的には運要素を試行数で圧倒するのが大部分である。
強いキャラを引くガチャも当然運要素で、厳選も運要素なので、最初から最後までだいたいが運を数で圧倒しているだけだと思うと、だんだん何が面白いのかわからなくなってきた。

NO nop_thread さんが約2ヶ月前に更新 · 編集済み 操作 #2

  • pinnedはい から いいえ に変更
  • リマインド予定日 を削除 (2026/07/29)

dc コマンドでワンライナー

https://mastodon.cardina1.red/@lo48576/117029489319185158

最近、いいかげん atri のデスクトップ壁紙を用意しようという気持ちになってきているが (チケット作らないと……)、手始めにメインモニタのウルトラワイド 5K2K のアスペクト比を知りたいと思ったところで丁度良いコマンドがないことに気付いた。
GCD (最大公約数) を求めてそれで割れば比率は出せるが、 GCD を一発で出せる UNIX コマンドに心当たりがない。
awk や bc あたりに何かないかと思ったが、検索してみても bash やら awk やらでユークリッドの互除法を書きましょうみたいな雑な (ある意味真っ当な?) ソリューションばかり出てくる。
この程度のことのためにスカスカのスクリプトを書かされるのはかなり癪なので、自分で “密度の高い” シェルスクリプトを用意することにした。

……というわけで選択したのが dc(1) である。
なぜかというと、多倍長整数を扱えてコンパイルが不要で標準的な環境に入っていてオーバーキルな依存がなくて、という基準を満たすものがこれくらいしか思い付かなかったからである。
べつに Python やら Ruby やらは「どこにでもある」と仮定しても良いのだが、 Python を入れているのは単に Gentoo で Portage が依存しているせいであって入れたくて入れているわけではなく、 Ruby に至っては必須の依存でもないし、サーバ環境や小さな Docker 内には実際そのようなものがないこともある (では小さなコンテナでこういうことをしたいかというと、今のところそうではないが)。
ポータビリティと (依存とソース両方の面での) コンパクトさを兼ね備えているのが dc(1) なので、可読性や速度を気にしないならこれを使わない理由はなかった。
dc(1) は bc(1) と同じパッケージで提供されており日頃ターミナルでは bc(1) の方ばかり使っているので、 bc(1) も選択肢には入ってくるが、インタラクティブでないなら中置記法を使いたい理由もあまりない。
なんならインタラクティブでも開き括弧の挿入のためにカーソルをあちこち動かすのもダルいので、ここらでひとつ dc(1) の逆ポに慣れておきたいと思ったわけである。

で、実際やってみるとこれがなかなかのパズルで、特に関数定義やループなどの仕組みがなく「コマンド列を文字列としてスタックに積んでおいて、『文字列を実行するコマンド』でそれを実行する」という少々アクロバティックな方法で再帰が実現されていたので、最近使っていなかった脳の部位を活性化させる羽目になった。
SKI コンビネータとか Scheme とかで遊んでいた頃以来かもしれない。

GCD を求めるコードを一旦自力で書いて改めて検索してみると Wikipedia や Rosetta Code に (それぞれ微妙に異なるが) 最小とされる実装があり、普通に負けた。
やはりこの辺りは習熟してセンスを養っていかないと短縮が難しそうである。
Lazy K (というか SKI コンビネータ) を手書きしていた頃に感じていた楽しさを思い出した。

さて GCD だけ求めてもしょうがなくて知りたいのは整数比なので、 GCD で割る部分まで dc で実装し、最終的にできたスクリプトがこれである:

#!/bin/sh

# input: <integer>...
# output: <GCD> <input divided by GCD>...

ARGS="$(echo "$@" | tr -cd '0-9 ')"
dc -e "${ARGS} 0sIdSI[rdSIr[d_3R%d0<G]dsGx+z1<A]sAzdsC1<Ap[dLIr/ps_lI0<B]dsBx"

いやぁキモいな。
しかしやっていることはスタックマシンでのスタック操作でしかないので、分解してコメントを足していけば結構読める部類である。
少なくとも SKI コンビネータよりはずっと読みやすい。
SKI コンビネータではリストを cons cell で扱う必要があり、しかもこれが関数形式になっていたためだいぶ扱いづらかったが、 dc(1) ではスタックやレジスタという特定の形式のデータの置き場が明確に存在してプログラムはそこを弄るという形であるため、読み書きしやすさでいうと型なしと型つきの言語くらいの大きな差がある。

とにかく、これを実行すると GCD と整数比が改行区切りで出てくる。

$ intratio.sh 1920 1080
120
16
9

GCD が120、整数比は 16:9。ヨシ!
これでワイドモニタの壁紙の比率を知ることができるようになった。

$ ./intratio.sh 5120 2160
80
64
27

5120x2160 は 64:27。
いやキモいな!

NO nop_thread さんが約2ヶ月前に更新 操作 #3

  • ステータス進行中 から 終了 に変更

NO nop_thread さんが約2ヶ月前に更新 操作 #4

  • 前回確認日2026/08/06 にセット

他の形式にエクスポート: PDF Atom