数学ゴルフ

締め切りになったらしいので適当に貼っておきます。ルールとか知らない人は適当に。15両の人はまあ同じはずですが、まあネタバレなので続きを読むで。

xt yz y( xz 0s t( st +s yz ) )

コード13両に s t の2変数が破壊されて2両。全部で15両。
Ruby擬似コード書くとこんな感じです。

t = x
z = y
y.times{
  z = x
  t.times{
    z = y
  }
  t--
}

結局、デクリメントの実装が肝になってくるわけですが、結局のところ 0 を N-1 回インクリメントすればいいわけです。
まず思いつくのは、最初の一回だけ足し算をしないパターン。これを素直に実装するとこのようにかけます。

// 1 以上の x に x - 1 を代入するコード
0f // flag はじめは off
xt // temp
x(
  f[ // on ならインクリメント
    +t
    0f
  ]
  +f // flag on に
)
tx

他にも「最初の一回だけインクリメント後に 0 を代入する」とか色々ありますが、やってること一緒なわけでまあ普通に長いです。
そこで「最後の一回だけ足し算をしない」パターンを考えると、15両のコードのようになるわけですね。ループ一個で書けるとはなーという。


さてここまではまあ他にも書く人いると思うのでどうでもいいです。もっと詳細な解説と18両のコードは偉い人に任せるとして…
この名も無い言語ちゃんですが、少し拡張した処理系作って anarchy golf に入れてもらおうかなあと思ってます。
考えている拡張を入れたい順に並べるとこんな感じ。

  • 入出力のための命令を追加。「>x」で入力(getchar)、「<x」で出力(putchar)
  • 変数の初期値をランダムな非負数から変数の文字コードに。a なら 97 とか。
  • 変数を a-z から a-zA-Z に。
  • 変数を a-z から 任意のアルファベットと記号に。数字は除く(0で困る)
  • 0-9 の定数を追加。1x とかできるように。

他にも色々考えてたんですが忘れてしまいました。何か面白いアイデアとかあったら教えて下さい。
まあ実装は多分忙しいとか忙しくないとかで来週になるとかならないとかです、ていうかお前インタプリタ作ってなかったのかよという感じですね。いや作ったんですが何処か行きました。