無駄と文化

実用的ブログ

Lazy_K で九九表のすべてのマスの和

前回の記事で 九九表のすべてのマスの和を求める問題 をいろいろな言語で書きました。
記事の最後でそのうち Lazy_K でも書きます的な事を宣言しておいたんですが、この度そのコードが完成しましたのでご報告します。


Lazy_K って何?

純粋関数型言語の1つです、位置づけとしては ジョーク言語, 難解言語, ホビー言語 などに分類されるんじゃないでしょうか。

特徴としては言語に組み込まれたシンボルの少なさです。
Unlambda記法であれば、s, k, i, ` の4つのシンボルだけでチューリング完全な表現力を持っています。
Lazy_K の言語的なおもしろさは以下の記事を読んでいただければ(分かる人には)分かると思います。


マイナーな言語ですのでやってみようと思うと実行環境の準備からしなければいけないんですが、幸いなことにブラウザで実行できる REPL がありました。
上の窓に「プログラムの本体」、下の窓に「プログラムへの入力」を入力して実行することができます。


コードを書く

九九表のすべてのマスの和を求めるにあたってアルゴリズムの大筋は前回 JavaScript で書いたものと同じです。
引用します。

// range(1, 9) の代わり
const ns = [...Array(9).keys()].map(i => i+1);

// flatten() の代わり
const flatten = arr => [].concat(...arr);

// sum() の代わり
const sum = ns => ns.reduce((i, j) => i+j, 0);

let result = sum(flatten(ns.map((i, _, ms) => ms.map(j => i*j))));
console.log(result);
// => 2025

数列を組み立てて、直積を求め、flatten して、sum を取る。これです。


ちなみに前回、こんなことを愚痴っていましたが、

Array.range()Array.flatten()Set.product()Math.sum() も無いとかさすがにツラいです。

はい、実は Lazy_K にもこれらの関数はありません。
それどころか自然数も積も和も if then else などの制御構文も一切ありません。唯一あるのは関数適用だけです。

なので何もかも自分で作らないといけませんね。まいったまいった。


下準備

いくら Lazy_K がチューリング完全とはいえ、そのままでは人間がプログラムを書くのはツラすぎます。せめて λ抽象 があれば、という感じです。
なので Lazy_K に λ抽象 のシンタックスを追加して、それを Lazy_K のコードに変換するトランスレータを書きました。

github.com

これです。

このツールの使い方については Qiita に記事を上げておきました。

qiita.com


正直、このツールを作るのにもガッツリ Haskell 書いてるので下準備どころではないですが。


今度こそコードを書く

さて必要なパーツを淡々と作っていきます。
基本的には λ抽象 を含むコードを書いていきますが、純粋な Lazy_K のコードも適宜 見せていきます。

真理値

TRUE  = ^xy.x
# => k

FALSE = ^xy.y
# => `ki

IF    = ^BOOL THEN ELSE.``BOOL THEN ELSE
# => i


NOT = ^x.``xFALSE TRUE
# => ``s``si`k`ki`kk

AND = ^xy.``xyFALSE
# => ``ss`k`k`ki

OR  = ^xy.``xTRUEy
# => ``si`kk

ペア・リスト

複数のデータを保持するのには連鎖リストを使います。

CONS = ^xyf.``fxy
# => ``s``s`ks``s`kk``s`ks``s`k`sik`kk

CAR  = ^x.`xTRUE
# => ``si`kk

CDR  = ^x.`xFALSE
# => ``si`k`ki


NULL   = FALSE
# => `ki

ISNULL = ^x.``x^_ _ _.FALSE TRUE
# => ``s``si`k`k`k`k`ki`kk

不動点コンビネータ

再帰的関数を定義するために無名再帰が必要です。無名再帰のためには不動点コンビネータですよね。
今回はハスケル・カリー先生のYコンビネータを使います。

Y = ^f.`^x.`f`xx^x.`f`xx
# => ``s``s``s`ksk`k``sii``s``s`ksk`k``sii

自然数

自然数はチャーチ数として表現します。

0   = ^fx.x
# => `ki

1   = ^fx.`fx
# => i

2   = ^fx.`f`fx
# => ``s``s`kski

3   = ^fx.`f`f`fx
# => ``s``s`ksk``s``s`kski

4   = ```sii2
# => ```sii``s``s`kski

256 = ```sii4
# => ```sii```sii``s``s`kski

各種演算も定義しておかなければいけません。
DIV と余剰 MOD の定義には再帰を使います。先ほどのYコンビネータの出番です。

ISZERO = ^n.``n^_.FALSE TRUE
# => ``s``si`k`k`ki`kk


GTE = ^mn.`ISZERO``SUBnm           # 大なりイコール
# => ``s`k`s`k``s``si`k`k`ki`kk``s`k`s``s`k`s``si`k``s``s`ks``s`k`s`ks``s``s`ks`
     `s`k`s`ks``s`k`s`kk``s``s`ksk`k``s`k`s`k`si``s`k`s`kk``s`k`sik`k`kk`k`k`kikk

GT  = ^mn.``AND `ISZERO``SUBnm `NOT `ISZERO``SUBmn
                                   # 大なり
# => ``s``s`ks``s`k`s`k``ss`k`k`ki``s`k`s`k``s``si`k`k`ki`kk``s`k`s``s`k`s``si`k
     ``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s``s`ksk`k``s`k`s`k`si``s
     `k`s`kk``s`k`sik`k`kk`k`k`kikk``s`k`s`k``s``si`k`ki`kk``s`k`s`k``s``si`k`k`
     ki`kk``s`k`s``si`k``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s``s`ks
     k`k``s`k`s`k`si``s`k`s`kk``s`k`sik`k`kk`k`k`kik

LTE = ^mn.`ISZERO``SUBmn           # 小なりイコール
# => ``s`k`s`k``s``si`k`k`ki`kk``s`k`s``si`k``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`
     ks``s`k`s`kk``s``s`ksk`k``s`k`s`k`si``s`k`s`kk``s`k`sik`k`kk`k`k`kik

LT  = ^mn.``AND `ISZERO``SUBmn `NOT `ISZERO``SUBnm
                                   # 小なり
# => ``s``s`ks``s`k`s`k``ss`k`k`ki``s`k`s`k``s``si`k`k`ki`kk``s`k`s``si`k``s``s`
     ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s``s`ksk`k``s`k`s`k`si``s`k`s`kk
     ``s`k`sik`k`kk`k`k`kik``s`k`s`k``s``si`k`ki`kk``s`k`s`k``s``si`k`k`ki`kk``s
     `k`s``s`k`s``si`k``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s``s`ksk
     `k``s`k`s`k`si``s`k`s`kk``s`k`sik`k`kk`k`k`kikk

EQ = ^mn.``AND``GTEmn``LTEmn
                                   # イコール
# => ``s``s`ks``s`k`s`k``ss`k`k`ki``s`k`s`k``s``si`k`k`ki`kk``s`k`s``s`k`s``si`k
     ``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s``s`ksk`k``s`k`s`k`si``s
     `k`s`kk``s`k`sik`k`kk`k`k`kikk``s`k`s`k``s``si`k`k`ki`kk``s`k`s``si`k``s``s
     `ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s``s`ksk`k``s`k`s`k`si``s`k`s`k
     k``s`k`sik`k`kk`k`k`kik


SUCC = ^n.^fx.`f``nfx             # 後者関数
# => `s``s`ksk


PLUS = ^mn.^fx.``mf``nfx          # 和
# => ``s`ks``s`k`s`ks`s`kk

MULT = ^mn.^f.`m`nf               # 積
# => ``s`ksk

POW  = ^mn.`nm                    # 累乗
# => ``s`k`sik


PRED = ^nfx.```n^gh.`h`gf^u.x^u.u # 前者関数
# => ``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s``s`ksk`k``s`k`s`k`si``s
     `k`s`kk``s`k`sik`k`kk`k`k`ki

SUB  = ^mn.``nPREDm               # 差
# => ``s`k`s``si`k``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s``s`ksk`k``
     s`k`s`k`si``s`k`s`kk``s`k`sik`k`kk`k`k`kik

DIV = `Y^DIV.^mn.```IF``LTmn 0 `SUCC ``DIV ``SUBmn n
                                  # 商
# => ```s``s``s`ksk`k``sii``s``s`ksk`k``sii``s`k`s``s`ks``s``s`ks``s`k`s`ki``s``
     s`ks``s`k`s`k``ss`k`k`ki``s`k`s`k``s``si`k`k`ki`kk``s`k`s``si`k``s``s`ks``s
     `k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s``s`ksk`k``s`k`s`k`si``s`k`s`kk``s`k
     `sik`k`kk`k`k`kik``s`k`s`k``s``si`k`ki`kk``s`k`s`k``s``si`k`k`ki`kk``s`k`s`
     `s`k`s``si`k``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s``s`ksk`k``s
     `k`s`k`si``s`k`s`kk``s`k`sik`k`kk`k`k`kikk`k`k`ki``s`k`s`k`s`k`s``s`ksk``s`
     `s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`k``s`k`s``si`k``s``s`ks``s`k`s`ks``s`
     `s`ks``s`k`s`ks``s`k`s`kk``s``s`ksk`k``s`k`s`k`si``s`k`s`kk``s`k`sik`k`kk`k
     `k`kik`k`ki

MOD = `Y^MOD.^mn.```IF``LTmn m ``MOD ``SUBmn n
                                  # 余剰
# => ```s``s``s`ksk`k``sii``s``s`ksk`k``sii``s`k`s``s`ks``s``s`ks``s`k`s`ki``s``
     s`ks``s`k`s`k``ss`k`k`ki``s`k`s`k``s``si`k`k`ki`kk``s`k`s``si`k``s``s`ks``s
     `k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s``s`ksk`k``s`k`s`k`si``s`k`s`kk``s`k
     `sik`k`kk`k`k`kik``s`k`s`k``s``si`k`ki`kk``s`k`s`k``s``si`k`k`ki`kk``s`k`s`
     `s`k`s``si`k``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s``s`ksk`k``s
     `k`s`k`si``s`k`s`kk``s`k`sik`k`kk`k`k`kikkk``s``s`ks``s`k`s`ks``s``s`ks``s`
     kk``s`ksk`k``s`k`s``si`k``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s
     ``s`ksk`k``s`k`s`k`si``s`k`s`kk``s`k`sik`k`kk`k`k`kik`k`ki

自然数の表示

自然数を扱えるようになりましたが、文字列に変換しなければ表示ができません。
自然数を文字列に変換する TOSTRING 関数を定義します。
出力ストリームの終端を表す EOF という値も定義しておきます。

TOSTRING_ = `Y^TOSTRING_.^n.``CONS ``PLUS 48 ``MODn10 ```IF ``LTEn9 NULL `TOSTRING_``DIVn10
# => ```s``s``s`ksk`k``sii``s``s`ksk`k``sii``s`k`s``s`k``s``s`ks``s`kk``s`ks``s`
     k`sik`kk``s`k```s`ks``s`k`s`ks`s`kk````s`ks``s`k`s`ks`s`kk````s`ksk```sii``
     s``s`kski````s`ksk``s``s`kski``s``s`ksk``s``s`ksk``s``s`ksk``s``s`kski```s`
     `s`ksk``s``s`kski``s``s`kski``s```s``s``s`ksk`k``sii``s``s`ksk`k``sii``s`k`
     s``s`ks``s``s`ks``s`k`s`ki``s``s`ks``s`k`s`k``ss`k`k`ki``s`k`s`k``s``si`k`k
     `ki`kk``s`k`s``si`k``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s``s`k
     sk`k``s`k`s`k`si``s`k`s`kk``s`k`sik`k`kk`k`k`kik``s`k`s`k``s``si`k`ki`kk``s
     `k`s`k``s``si`k`k`ki`kk``s`k`s``s`k`s``si`k``s``s`ks``s`k`s`ks``s``s`ks``s`
     k`s`ks``s`k`s`kk``s``s`ksk`k``s`k`s`k`si``s`k`s`kk``s`k`sik`k`kk`k`k`kikkk`
     `s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`k``s`k`s``si`k``s``s`ks``s`k`s`ks`
     `s``s`ks``s`k`s`ks``s`k`s`kk``s``s`ksk`k``s`k`s`k`si``s`k`s`kk``s`k`sik`k`k
     k`k`k`kik`k`ki`k````s`ksk``s``s`kski``s``s`ksk``s``s`ksk``s``s`ksk``s``s`ks
     ki``s`k`s``s``s`ki``s``s`k`s`k``s``si`k`k`ki`kk``s`k`s``si`k``s``s`ks``s`k`
     s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s``s`ksk`k``s`k`s`k`si``s`k`s`kk``s`k`si
     k`k`kk`k`k`kik`k```s``s`kski``s``s`ksk``s``s`kski`k`ki``s``s`ksk`k``s```s``
     s``s`ksk`k``sii``s``s`ksk`k``sii``s`k`s``s`ks``s``s`ks``s`k`s`ki``s``s`ks``
     s`k`s`k``ss`k`k`ki``s`k`s`k``s``si`k`k`ki`kk``s`k`s``si`k``s``s`ks``s`k`s`k
     s``s``s`ks``s`k`s`ks``s`k`s`kk``s``s`ksk`k``s`k`s`k`si``s`k`s`kk``s`k`sik`k
     `kk`k`k`kik``s`k`s`k``s``si`k`ki`kk``s`k`s`k``s``si`k`k`ki`kk``s`k`s``s`k`s
     ``si`k``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s``s`ksk`k``s`k`s`k
     `si``s`k`s`kk``s`k`sik`k`kk`k`k`kikk`k`k`ki``s`k`s`k`s`k`s``s`ksk``s``s`ks`
     `s`k`s`ks``s``s`ks``s`kk``s`ksk`k``s`k`s``si`k``s``s`ks``s`k`s`ks``s``s`ks`
     `s`k`s`ks``s`k`s`kk``s``s`ksk`k``s`k`s`k`si``s`k`s`kk``s`k`sik`k`kk`k`k`kik
     `k`ki`k````s`ksk``s``s`kski``s``s`ksk``s``s`ksk``s``s`ksk``s``s`kski

TOSTRING = ^n.``REVERSE_ EOF `TOSTRING_ n
# => ``s`k````s``s``s`ksk`k``sii``s``s`ksk`k``sii``s`k`s``s`ks``s`k`s``s`ki``s``
     si`k`k`k`k`ki`kkk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`k``s`k`s``s`k``s
     ``s`ks``s`kk``s`ks``s`k`sik`kk``si`kkk`k`k``si`k`ki```sii```sii``s``s`kski`
     ``s``s``s`ksk`k``sii``s``s`ksk`k``sii``s`k`s``s`k``s``s`ks``s`kk``s`ks``s`k
     `sik`kk``s`k```s`ks``s`k`s`ks`s`kk````s`ks``s`k`s`ks`s`kk````s`ksk```sii``s
     ``s`kski````s`ksk``s``s`kski``s``s`ksk``s``s`ksk``s``s`ksk``s``s`kski```s``
     s`ksk``s``s`kski``s``s`kski``s```s``s``s`ksk`k``sii``s``s`ksk`k``sii``s`k`s
     ``s`ks``s``s`ks``s`k`s`ki``s``s`ks``s`k`s`k``ss`k`k`ki``s`k`s`k``s``si`k`k`
     ki`kk``s`k`s``si`k``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s``s`ks
     k`k``s`k`s`k`si``s`k`s`kk``s`k`sik`k`kk`k`k`kik``s`k`s`k``s``si`k`ki`kk``s`
     k`s`k``s``si`k`k`ki`kk``s`k`s``s`k`s``si`k``s``s`ks``s`k`s`ks``s``s`ks``s`k
     `s`ks``s`k`s`kk``s``s`ksk`k``s`k`s`k`si``s`k`s`kk``s`k`sik`k`kk`k`k`kikkk``
     s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`k``s`k`s``si`k``s``s`ks``s`k`s`ks``
     s``s`ks``s`k`s`ks``s`k`s`kk``s``s`ksk`k``s`k`s`k`si``s`k`s`kk``s`k`sik`k`kk
     `k`k`kik`k`ki`k````s`ksk``s``s`kski``s``s`ksk``s``s`ksk``s``s`ksk``s``s`ksk
     i``s`k`s``s``s`ki``s``s`k`s`k``s``si`k`k`ki`kk``s`k`s``si`k``s``s`ks``s`k`s
     `ks``s``s`ks``s`k`s`ks``s`k`s`kk``s``s`ksk`k``s`k`s`k`si``s`k`s`kk``s`k`sik
     `k`kk`k`k`kik`k```s``s`kski``s``s`ksk``s``s`kski`k`ki``s``s`ksk`k``s```s``s
     ``s`ksk`k``sii``s``s`ksk`k``sii``s`k`s``s`ks``s``s`ks``s`k`s`ki``s``s`ks``s
     `k`s`k``ss`k`k`ki``s`k`s`k``s``si`k`k`ki`kk``s`k`s``si`k``s``s`ks``s`k`s`ks
     ``s``s`ks``s`k`s`ks``s`k`s`kk``s``s`ksk`k``s`k`s`k`si``s`k`s`kk``s`k`sik`k`
     kk`k`k`kik``s`k`s`k``s``si`k`ki`kk``s`k`s`k``s``si`k`k`ki`kk``s`k`s``s`k`s`
     `si`k``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s``s`ksk`k``s`k`s`k`
     si``s`k`s`kk``s`k`sik`k`kk`k`k`kikk`k`k`ki``s`k`s`k`s`k`s``s`ksk``s``s`ks``
     s`k`s`ks``s``s`ks``s`kk``s`ksk`k``s`k`s``si`k``s``s`ks``s`k`s`ks``s``s`ks``
     s`k`s`ks``s`k`s`kk``s``s`ksk`k``s`k`s`k`si``s`k`s`kk``s`k`sik`k`kk`k`k`kik`
     k`ki`k````s`ksk``s``s`kski``s``s`ksk``s``s`ksk``s``s`ksk``s``s`kski

EOF = 256
# => ```sii```sii``s``s`kski

ISEOF = ^x.``EQx256
# => ``s``s``s`ks``s`k`s`k``ss`k`k`ki``s`k`s`k``s``si`k`k`ki`kk``s`k`s``s`k`s``s
     i`k``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s``s`ksk`k``s`k`s`k`si
     ``s`k`s`kk``s`k`sik`k`kk`k`k`kikk``s`k`s`k``s``si`k`k`ki`kk``s`k`s``si`k``s
     ``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s``s`ksk`k``s`k`s`k`si``s`k`
     s`kk``s`k`sik`k`kk`k`k`kik`k```sii```sii``s``s`kski

リスト操作の高階関数

お馴染みの map や append, reverse などを定義します。もう少しです。

MAP = `Y^MAP.^f XS.```IF `ISNULL XS NULL ``CONS `f`CAR XS ``MAPf`CDR XS
# => ```s``s``s`ksk`k``sii``s``s`ksk`k``sii``s`k`s`k`s``s``s`ki``s``si`k`k`k`k`k
     i`kk`k`ki``s`k`s``s`ks``s`k`s`k``s``s`ks``s`kk``s`ks``s`k`sik`kk``s``s`ksk`
     k``si`kk``s``s`ks``s`k`s`ks`s`kk`k`k``si`k`ki

APPEND = `Y^APPEND.^XS YS.```IF `ISNULL XS YS ``CONS `CAR XS ``APPEND `CDR XS YS
# => ```s``s``s`ksk`k``sii``s``s`ksk`k``sii``s`k`s``s`ks``s`ki``s``si`k`k`k`k`ki
     `kk``s`k`s``s`ks``s`kk``s`k``s``s`ks``s`kk``s`ks``s`k`sik`kk``si`kk``s``s`k
     sk`k``si`k`ki

REVERSE_ = `Y^REVERSE_.^ACC XS.```IF `ISNULL XS ACC ``REVERSE_ ``CONS `CAR XS ACC `CDR XS
# => ```s``s``s`ksk`k``sii``s``s`ksk`k``sii``s`k`s``s`ks``s`k`s``s`ki``s``si`k`k
     `k`k`ki`kkk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`k``s`k`s``s`k``s``s`ks
     ``s`kk``s`ks``s`k`sik`kk``si`kkk`k`k``si`k`ki

REVERSE = `REVERSE_ NULL
# => ````s``s``s`ksk`k``sii``s``s`ksk`k``sii``s`k`s``s`ks``s`k`s``s`ki``s``si`k`
     k`k`k`ki`kkk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`k``s`k`s``s`k``s``s`k
     s``s`kk``s`ks``s`k`sik`kk``si`kkk`k`k``si`k`ki`ki

CONCAT = `Y^CONCAT.^XSS.```IF `ISNULL XSS NULL ``APPEND `CAR XSS `CONCAT `CDR XSS
# => ```s``s``s`ksk`k``sii``s``s`ksk`k``sii``s`k`s``s``s`ki``s``si`k`k`k`k`ki`kk
     `k`ki``s`k`s``s`k```s``s``s`ksk`k``sii``s``s`ksk`k``sii``s`k`s``s`ks``s`ki`
     `s``si`k`k`k`k`ki`kk``s`k`s``s`ks``s`kk``s`k``s``s`ks``s`kk``s`ks``s`k`sik`
     kk``si`kk``s``s`ksk`k``si`k`ki``si`kk``s``s`ksk`k``si`k`ki

RANGE = `Y^RANGE.^n.``CONS n ```IF `ISZEROn NULL `RANGE`PREDn
# => ```s``s``s`ksk`k``sii``s``s`ksk`k``sii``s`k`s``s``s`ks``s`kk``s`ks``s`k`sik
     `kk``s`k`s``s``s`ki``s``si`k`k`ki`kk`k`ki``s``s`ksk`k``s``s`ks``s`k`s`ks``s
     ``s`ks``s`k`s`ks``s`k`s`kk``s``s`ksk`k``s`k`s`k`si``s`k`s`kk``s`k`sik`k`kk`
     k`k`ki

SUM = `Y^SUM.^NS.```IF `ISNULL NS 0 ``PLUS `CAR NS `SUM `CDR NS
# => ```s``s``s`ksk`k``sii``s``s`ksk`k``sii``s`k`s``s``s`ki``s``si`k`k`k`k`ki`kk
     `k`ki``s`k`s``s`k``s`ks``s`k`s`ks`s`kk``si`kk``s``s`ksk`k``si`k`ki

九九表のすべてのマスの和

お待たせしました、やっと本題です。

NUMS = ``MAP SUCC `RANGE 8
# => `````s``s``s`ksk`k``sii``s``s`ksk`k``sii``s`k`s`k`s``s``s`ki``s``si`k`k`k`k
     `ki`kk`k`ki``s`k`s``s`ks``s`k`s`k``s``s`ks``s`kk``s`ks``s`k`sik`kk``s``s`ks
     k`k``si`kk``s``s`ks``s`k`s`ks`s`kk`k`k``si`k`ki`s``s`ksk````s``s``s`ksk`k``
     sii``s``s`ksk`k``sii``s`k`s``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`k`s``s``s`k
     i``s``si`k`k`ki`kk`k`ki``s``s`ksk`k``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``
     s`k`s`kk``s``s`ksk`k``s`k`s`k`si``s`k`s`kk``s`k`sik`k`kk`k`k`ki```s``s`ksk`
     `s``s`kski``s``s`kski

KUKU = `SUM `CONCAT ``MAP ^n.``MAP ^m.``MULT n m NUMS NUMS
# => ````s``s``s`ksk`k``sii``s``s`ksk`k``sii``s`k`s``s``s`ki``s``si`k`k`k`k`ki`k
     k`k`ki``s`k`s``s`k``s`ks``s`k`s`ks`s`kk``si`kk``s``s`ksk`k``si`k`ki````s``s
     ``s`ksk`k``sii``s``s`ksk`k``sii``s`k`s``s``s`ki``s``si`k`k`k`k`ki`kk`k`ki``
     s`k`s``s`k```s``s``s`ksk`k``sii``s``s`ksk`k``sii``s`k`s``s`ks``s`ki``s``si`
     k`k`k`k`ki`kk``s`k`s``s`ks``s`kk``s`k``s``s`ks``s`kk``s`ks``s`k`sik`kk``si`
     kk``s``s`ksk`k``si`k`ki``si`kk``s``s`ksk`k``si`k`ki`````s``s``s`ksk`k``sii`
     `s``s`ksk`k``sii``s`k`s`k`s``s``s`ki``s``si`k`k`k`k`ki`kk`k`ki``s`k`s``s`ks
     ``s`k`s`k``s``s`ks``s`kk``s`ks``s`k`sik`kk``s``s`ksk`k``si`kk``s``s`ks``s`k
     `s`ks`s`kk`k`k``si`k`ki``s``s`k```s``s``s`ksk`k``sii``s``s`ksk`k``sii``s`k`
     s`k`s``s``s`ki``s``si`k`k`k`k`ki`kk`k`ki``s`k`s``s`ks``s`k`s`k``s``s`ks``s`
     kk``s`ks``s`k`sik`kk``s``s`ksk`k``si`kk``s``s`ks``s`k`s`ks`s`kk`k`k``si`k`k
     i``s`ksk`k`````s``s``s`ksk`k``sii``s``s`ksk`k``sii``s`k`s`k`s``s``s`ki``s``
     si`k`k`k`k`ki`kk`k`ki``s`k`s``s`ks``s`k`s`k``s``s`ks``s`kk``s`ks``s`k`sik`k
     k``s``s`ksk`k``si`kk``s``s`ks``s`k`s`ks`s`kk`k`k``si`k`ki`s``s`ksk````s``s`
     `s`ksk`k``sii``s``s`ksk`k``sii``s`k`s``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`k
     `s``s``s`ki``s``si`k`k`ki`kk`k`ki``s``s`ksk`k``s``s`ks``s`k`s`ks``s``s`ks``
     s`k`s`ks``s`k`s`kk``s``s`ksk`k``s`k`s`k`si``s`k`s`kk``s`k`sik`k`kk`k`k`ki``
     `s``s`ksk``s``s`kski``s``s`kski`````s``s``s`ksk`k``sii``s``s`ksk`k``sii``s`
     k`s`k`s``s``s`ki``s``si`k`k`k`k`ki`kk`k`ki``s`k`s``s`ks``s`k`s`k``s``s`ks``
     s`kk``s`ks``s`k`sik`kk``s``s`ksk`k``si`kk``s``s`ks``s`k`s`ks`s`kk`k`k``si`k
     `ki`s``s`ksk````s``s``s`ksk`k``sii``s``s`ksk`k``sii``s`k`s``s``s`ks``s`kk``
     s`ks``s`k`sik`kk``s`k`s``s``s`ki``s``si`k`k`ki`kk`k`ki``s``s`ksk`k``s``s`ks
     ``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s``s`ksk`k``s`k`s`k`si``s`k`s`kk``
     s`k`sik`k`kk`k`k`ki```s``s`ksk``s``s`kski``s``s`kski

MAIN = ^_.``APPEND `TOSTRING KUKU EOF
# => `k`````s``s``s`ksk`k``sii``s``s`ksk`k``sii``s`k`s``s`ks``s`ki``s``si`k`k`k`
     k`ki`kk``s`k`s``s`ks``s`kk``s`k``s``s`ks``s`kk``s`ks``s`k`sik`kk``si`kk``s`
     `s`ksk`k``si`k`ki```s`k````s``s``s`ksk`k``sii``s``s`ksk`k``sii``s`k`s``s`ks
     ``s`k`s``s`ki``s``si`k`k`k`k`ki`kkk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks
     k`k``s`k`s``s`k``s``s`ks``s`kk``s`ks``s`k`sik`kk``si`kkk`k`k``si`k`ki```sii
     ```sii``s``s`kski```s``s``s`ksk`k``sii``s``s`ksk`k``sii``s`k`s``s`k``s``s`k
     s``s`kk``s`ks``s`k`sik`kk``s`k```s`ks``s`k`s`ks`s`kk````s`ks``s`k`s`ks`s`kk
     ````s`ksk```sii``s``s`kski````s`ksk``s``s`kski``s``s`ksk``s``s`ksk``s``s`ks
     k``s``s`kski```s``s`ksk``s``s`kski``s``s`kski``s```s``s``s`ksk`k``sii``s``s
     `ksk`k``sii``s`k`s``s`ks``s``s`ks``s`k`s`ki``s``s`ks``s`k`s`k``ss`k`k`ki``s
     `k`s`k``s``si`k`k`ki`kk``s`k`s``si`k``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks`
     `s`k`s`kk``s``s`ksk`k``s`k`s`k`si``s`k`s`kk``s`k`sik`k`kk`k`k`kik``s`k`s`k`
     `s``si`k`ki`kk``s`k`s`k``s``si`k`k`ki`kk``s`k`s``s`k`s``si`k``s``s`ks``s`k`
     s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s``s`ksk`k``s`k`s`k`si``s`k`s`kk``s`k`si
     k`k`kk`k`k`kikkk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`k``s`k`s``si`k``s
     ``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s``s`ksk`k``s`k`s`k`si``s`k`
     s`kk``s`k`sik`k`kk`k`k`kik`k`ki`k````s`ksk``s``s`kski``s``s`ksk``s``s`ksk``
     s``s`ksk``s``s`kski``s`k`s``s``s`ki``s``s`k`s`k``s``si`k`k`ki`kk``s`k`s``si
     `k``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s``s`ksk`k``s`k`s`k`si`
     `s`k`s`kk``s`k`sik`k`kk`k`k`kik`k```s``s`kski``s``s`ksk``s``s`kski`k`ki``s`
     `s`ksk`k``s```s``s``s`ksk`k``sii``s``s`ksk`k``sii``s`k`s``s`ks``s``s`ks``s`
     k`s`ki``s``s`ks``s`k`s`k``ss`k`k`ki``s`k`s`k``s``si`k`k`ki`kk``s`k`s``si`k`
     `s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s``s`ksk`k``s`k`s`k`si``s`
     k`s`kk``s`k`sik`k`kk`k`k`kik``s`k`s`k``s``si`k`ki`kk``s`k`s`k``s``si`k`k`ki
     `kk``s`k`s``s`k`s``si`k``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s`
     `s`ksk`k``s`k`s`k`si``s`k`s`kk``s`k`sik`k`kk`k`k`kikk`k`k`ki``s`k`s`k`s`k`s
     ``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`k``s`k`s``si`k``s``s`ks``s
     `k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s``s`ksk`k``s`k`s`k`si``s`k`s`kk``s`k
     `sik`k`kk`k`k`kik`k`ki`k````s`ksk``s``s`kski``s``s`ksk``s``s`ksk``s``s`ksk`
     `s``s`kski````s``s``s`ksk`k``sii``s``s`ksk`k``sii``s`k`s``s``s`ki``s``si`k`
     k`k`k`ki`kk`k`ki``s`k`s``s`k``s`ks``s`k`s`ks`s`kk``si`kk``s``s`ksk`k``si`k`
     ki````s``s``s`ksk`k``sii``s``s`ksk`k``sii``s`k`s``s``s`ki``s``si`k`k`k`k`ki
     `kk`k`ki``s`k`s``s`k```s``s``s`ksk`k``sii``s``s`ksk`k``sii``s`k`s``s`ks``s`
     ki``s``si`k`k`k`k`ki`kk``s`k`s``s`ks``s`kk``s`k``s``s`ks``s`kk``s`ks``s`k`s
     ik`kk``si`kk``s``s`ksk`k``si`k`ki``si`kk``s``s`ksk`k``si`k`ki`````s``s``s`k
     sk`k``sii``s``s`ksk`k``sii``s`k`s`k`s``s``s`ki``s``si`k`k`k`k`ki`kk`k`ki``s
     `k`s``s`ks``s`k`s`k``s``s`ks``s`kk``s`ks``s`k`sik`kk``s``s`ksk`k``si`kk``s`
     `s`ks``s`k`s`ks`s`kk`k`k``si`k`ki``s``s`k```s``s``s`ksk`k``sii``s``s`ksk`k`
     `sii``s`k`s`k`s``s``s`ki``s``si`k`k`k`k`ki`kk`k`ki``s`k`s``s`ks``s`k`s`k``s
     ``s`ks``s`kk``s`ks``s`k`sik`kk``s``s`ksk`k``si`kk``s``s`ks``s`k`s`ks`s`kk`k
     `k``si`k`ki``s`ksk`k`````s``s``s`ksk`k``sii``s``s`ksk`k``sii``s`k`s`k`s``s`
     `s`ki``s``si`k`k`k`k`ki`kk`k`ki``s`k`s``s`ks``s`k`s`k``s``s`ks``s`kk``s`ks`
     `s`k`sik`kk``s``s`ksk`k``si`kk``s``s`ks``s`k`s`ks`s`kk`k`k``si`k`ki`s``s`ks
     k````s``s``s`ksk`k``sii``s``s`ksk`k``sii``s`k`s``s``s`ks``s`kk``s`ks``s`k`s
     ik`kk``s`k`s``s``s`ki``s``si`k`k`ki`kk`k`ki``s``s`ksk`k``s``s`ks``s`k`s`ks`
     `s``s`ks``s`k`s`ks``s`k`s`kk``s``s`ksk`k``s`k`s`k`si``s`k`s`kk``s`k`sik`k`k
     k`k`k`ki```s``s`ksk``s``s`kski``s``s`kski`````s``s``s`ksk`k``sii``s``s`ksk`
     k``sii``s`k`s`k`s``s``s`ki``s``si`k`k`k`k`ki`kk`k`ki``s`k`s``s`ks``s`k`s`k`
     `s``s`ks``s`kk``s`ks``s`k`sik`kk``s``s`ksk`k``si`kk``s``s`ks``s`k`s`ks`s`kk
     `k`k``si`k`ki`s``s`ksk````s``s``s`ksk`k``sii``s``s`ksk`k``sii``s`k`s``s``s`
     ks``s`kk``s`ks``s`k`sik`kk``s`k`s``s``s`ki``s``si`k`k`ki`kk`k`ki``s``s`ksk`
     k``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s``s`ksk`k``s`k`s`k`si``
     s`k`s`kk``s`k`sik`k`kk`k`k`ki```s``s`ksk``s``s`kski``s``s`kski```sii```sii`
     `s``s`kski

実行する

この MAIN を変換したものを実行します。結果が表示されるまでに3分くらいかかりますけどね。

f:id:todays_mitsui:20161030123900p:plain

はい。


まとめ

Lazy_K を使うプロジェクトで人が足りなくなったらいつでも呼んでください。


私からは以上です。