兼雑記

なにやら先生と紛らわしいそうで生まれてきてすいません。あばうと
<< 2012/04 >>
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30

| サイト本体 | 昔の更新履歴兼雑記 | タイトル一覧 |

分類は アーカイブ任せにした方がいいのかも。


 | 

2012-04-10

変数無しで 1 から n までの合計を求める 01:14

という問題を id:ranha さんに教えてもらいました。色々考えてて、標準ライブラリ使っちゃうと errno 使うとか、状態持つ関数 (strtok とか sbrk とか、あげくの果てには getenv/setenv) 使うとかで、割と簡単にできてしまうように思ったので、出力以外の関数は封印しないといけないな…と思いました。

あとはスタックへの代入の書き込みも割と自明になっちゃうんで当然禁止。

で、あれこれとややこしいことを考えてたんですが、これでできることに気付いて拍子抜けしました…

http://ideone.com/9uE9H

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;
}

これはどうも引数を渡すのも禁止する必要がありそうですね。そのしばりを入れてもできるような気がしてるのですが、これはなかなか難しい…

ちなみに元ネタは変数をひとつしか使わない、というものだったそうです。

http://togetter.com/li/278731

引数無し 03:42

もできた。スタックの伸びる量に依存しててひどいのと、この方針じゃ途中で 1+2+3+ とか表示できないのがまだ難点。

http://ideone.com/iIjR9

で、途中で 1 から 100 まで表示できるのも作れる気がしてるんですけど、しかしそれは真剣に難しいと思うんだよな…

http://d.hatena.ne.jp/ranha/20120410/1333990707

ああやっぱり途中経過も出力しないとダメですよね…もうちょっと頑張るか。

 | 
1970 | 01 |
2003 | 12 |
2004 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2005 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 10 | 12 |
2011 | 01 | 02 | 03 | 04 | 06 | 08 | 09 | 10 | 11 | 12 |
2012 | 01 | 02 | 03 | 04 | 07 | 08 | 09 | 10 | 12 |
2013 | 01 | 02 | 03 | 04 |
(1886182 since 04.04.21)
なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h