変数無しで 1 から n までの合計を求める
という問題を id:ranha さんに教えてもらいました。色々考えてて、標準ライブラリ使っちゃうと errno 使うとか、状態持つ関数 (strtok とか sbrk とか、あげくの果てには getenv/setenv) 使うとかで、割と簡単にできてしまうように思ったので、出力以外の関数は封印しないといけないな…と思いました。
あとはスタックへの代入の書き込みも割と自明になっちゃうんで当然禁止。
で、あれこれとややこしいことを考えてたんですが、これでできることに気付いて拍子抜けしました…
x86-64 でも7個目の引数から stack に置かれるのを知っていれば別に難しくない。
#include <stdio.h> int f() { if (4[(int*)__builtin_frame_address(0)]) return (f(0,0,0,0,0,0,4[(int*)__builtin_frame_address(0)] - 1) + 4[(int*)__builtin_frame_address(0)]); return 0; } int main() { printf("%d\n", f(0,0,0,0,0,0,100)); return 0; }
これはどうも引数を渡すのも禁止する必要がありそうですね。そのしばりを入れてもできるような気がしてるのですが、これはなかなか難しい…
ちなみに元ネタは変数をひとつしか使わない、というものだったそうです。