これは「SATySFi Advent Caleandar 2022」の3日目の記事です。
(2日目は bd_gfngfn さん、4日目は yozu さんです。)
先日「TeX言語でドドスコ」のネタを披露したわけですが、その当然の帰結として「SATySFiでドドスコ」のネタを披露する強い必要性に迫られた気がする(えっ)ので、やってみました
※前提とするSATySFiのバージョンは0.0.7~0.0.8です。
※「ドドスコ問題」の詳細についてはTeX言語の方の記事を参照してください。ここでは、問題の定義を書いたツイートを載せておきます。
SATySFiでドドスコしてみた話
というわけで、「ドドスコ問題」を実行するためのSATySFiパッケージ「ddsk」をつくりました。
- SATySFiでドドスコ(ラブ注入♡)(Gist)
ddsk
パッケージの実装コードは以下の通りです。
let_=`888888888888888888888888888888888888888888888888888888888888888888888
~#;}-\$"@`let([(-*);(-/)],nj,(^/)::(&/+-'+.>.*:/),(&-),(!))=((*)::[(/)],(!)
,[`@.]='}#*?;@=#\:<\=$<"|&^?"}~{?;ve;;`;`).':_,,`],[],8)let(*)o(*/)=((o))::
(*/)let([(//);(/-)],[_;(^-);(&/.''<);rec-;(^--)],(/<+->),(/),_::(^*-)::_)=(
[(!)-(!);(!)-/(!)],(^/)*`ドド`*`スコ`*`スコ`*`スコ`*(&-),(!)-*8,(let-rec(>)
`@`i=i|(-)r=(-)^(r)in(>)),(^/)*`ラブ注入♡`*[`\-,::]${'<@,_>:~}"#_#"(`])let
(-:)(*<*+-)(*>-)=(*<*+-)-((*<*+-)-/(*>-)-*(*>-))let-rec(!->)|8=(^-)|_=(^--)
let((/--)::[(/->);(/.>);(/.-)],ov)=([(/-)+(/-);(!)>>(/-);(!)-(/-);(/<+->)-*
(/<+->)],{,'=~[__]:?(})let((!),(/.--)::[(/.*-);(/.->)],_)=(nj,[(/.>)-*(/.>)
-*(/.>)-*(/.>)-*(/.>);((/-)<<((/->)-*(!)-(/-)))-(/-);(!)-*((/--)-*8+(/-))<<
(/->)],`,);[,=$!{vi}{_}/?@~(`)let-rec(&--)|j(*/)8=(*/)^(^*-)|(*-)(*--)(**-)
=let(*/)=((*-)>>((/.>)+(/.>)))-:((/--))in(&--)((*-)-*(/.--)-:(/.*-))((*--)/
!->((*/)-*8))((((**-)+(/.->))-*(/--)+(*/))-:(/.-)-(/.->))let(&*-)(*-)%__._~
=(&--)((*-)-*(/.--)-:(/.*-)-*(/.--)-:(/.*-))`@`((//)-(/.->))let((*),(%./|_>
((/))),(&/'~-:'?.-**>+!<),([love-injector]),_)=((-*),(-/),(),[(&*-)],%/_|.\
.8888888888888888888888888888888888888888888888888888888888888888888888888)
……やっぱり
エッ、もしかしたら「TeX言語のドドスコ実装に比べると全然フツーに読めるじゃん」ですか? そうですね……。思い切り努力はしたのですが、これが限界でした……やっぱりSATySFiムズカシイ(えっ)
英文字を全く使わないのは無理なので「love-injector
に含まれる文字だけを使う」という制限規則にしています。SATySFiの英文字名の予約語・プリミティヴのうち実際に使っているのはin
とlet
とlet-rec
の3つだけです(それ以外は実質的に有意義に使えない)。数字も完全に除くのは無理なので8
だけ使っています。
このddskパッケージを読み込むと、次の函数が(トップレベルに)定義されます。
-
love-injector
: int → string
love-injector
seed は、乱数種1を seed としたときの「ドドスコ問題」の出力の文字列。
love-injector
函数の値は文字列(string型)なので、テキスト出力モードでも利用できます。例として「乱数種を80000としてドドスコ問題を実行」するテキスト出力のSATySFI文書を作ってみましょう。
@import: ddsk
love-injector 80000
このsample.satyとddsk.satygの2つのファイルを同一のディレクトリに置いた上で、そこで次のコマンドを実行します。
satysfi --text-mode plain -o out.txt sample.saty
出力されたout.txtを見ると……2。
ドドドドドドドドドドスコドドスコスコスコドドドドドドスコドド
ドドドドスコスコドドスコスコスコドドスコスコスコスコドドドド
スコスコドドスコスコドドドドドドドドドドドドスコスコスコドド
ドドスコドドスコスコスコドドドドドドドドスコドドドドドドドド
スコスコドドスコスコスコドドドドスコスコスコスコスコスコドド
スコドドドドスコスコスコドドドドスコドドドドスコドドドドスコ
ドドドドスコドドドドスコスコスコスコスコドドスコスコスコドド
ドドドドスコドドスコドドスコスコドドドドドドスコスコドドスコ
スコドドスコドドスコスコスコスコスコドドスコスコスコドドスコ
スコスコドドスコスコスコラブ注入♡
ちゃんとドドスコできてますね!
まとめ
「SATySFi Advent Calendar 2022」ではまだまだ参加者を募集しています! SATySFiに関するくだらないネタを思いついたら、カレンダーに登録してどんどん披露していきましょう!
アッ、くだらなくない記事ももちろん大歓迎です