■■C++で大きな数を作るスレ■■
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2009/03/24(火) 20:27:50以下のプロトタイプの関数の戻り値で出来るだけ大きな数を返すものを作りましょう。
int main();
●ルール
最大でも1スレに収まる範囲とし、
1スレで完結したプログラムとしてください。
文字数も書いてください
●言語仕様
言語は C++ 2003 準拠とします
int と float は十分な精度があるとします
メモリは十分にあるとします
実行時間は問わないこととします
機種依存、コンパイラ依存の値が返るプログラムは不可
プリプロセッサ、ライブラリの使用は不可
●文字数カウントルール
動作上不要なコメント、スペース、タブ、改行は文字数に含めない
言語上必要なスペース、タブ、改行はカウントする(改行は1文字とする)
0002デフォルトの名無しさん
2009/03/24(火) 20:29:33int main(){ return sizeof(int); } // 環境依存
int main(){ return (unsigned int)-1/2; } // 環境依存
int main(){ return 'z'; } // 環境依存
int main(){ return 1.0/0.0; } // 環境依存
int main(){ int a = 9; return a <<= a <<= a; } // 未定義動作
int main(){ int a = 9; return ++a * ++a; } // 未定義動作
int main(){ quit(9) } // main の戻り値じゃない、ライブラリ使用不可
int main(){ while(1) printf("9"); } // main の戻り値じゃない、ライブラリ使用不可
int main(){ return 1.0/【>>1の知能指数】; } // ネタとしてもいまいち
int main(){ return 【このスレでの最大値】+1 ; } // ネタとしてもいまいち
小さいものの例
int main(){return 9;} // 21文字
int main(){return 99;} // 22文字
int main(){return 999;} // 23文字
int main(){return 9999;} // 24文字
int main(){return 9<<99;} // 25文字
ちょっと大きい数の例 (50文字)
int main()
{
int n=99,m=n;
while(m--)
n<<=n;
return n;
}
0003デフォルトの名無しさん
2009/03/24(火) 21:01:23その自信は何処から?
何で、言語は C++ 2003 準拠とします ?
環境依存不可としながら、糞スレ立てるな
0004デフォルトの名無しさん
2009/03/24(火) 21:15:03もしかして Visual C++ 2003 のことだと思ったのかな?
ISO/IEC 14882:2003 のことだよ。
0005デフォルトの名無しさん
2009/03/24(火) 21:23:320006デフォルトの名無しさん
2009/03/24(火) 21:26:46最大でも1レスに収まる範囲とし、
1レスで完結したプログラムとしてください。
0007デフォルトの名無しさん
2009/03/24(火) 22:55:480008デフォルトの名無しさん
2009/03/24(火) 23:05:080009デフォルトの名無しさん
2009/03/24(火) 23:33:37int a(int m,int n){return (m)?(n)?a(m-1,a(m,n-1)):a(m-1,1):n+1;}
int main(){return a(9,9);}
0010デフォルトの名無しさん
2009/03/25(水) 01:33:4848文字。常にint型で表現可能な最大値を返す。
0011デフォルトの名無しさん
2009/03/25(水) 02:05:07>10 をショートコーディング 46文字
0012デフォルトの名無しさん
2009/03/25(水) 02:13:11普通にやったら、11より短くなった。
44文字 ついでにsageわすれる
0013デフォルトの名無しさん
2009/03/25(水) 02:21:1143文字。アイディアは>>10と同じ。
0014デフォルトの名無しさん
2009/03/25(水) 02:34:2343文字。無理やり再起を使ってみた。
0015デフォルトの名無しさん
2009/03/25(水) 02:42:58>13
をヒントにしたが、既に原型をとどめていない。
しかも、コンパイラ依存かな。
42文字
main()再帰もやりたかったけどプロトタイプ宣言されてたからなぁ。
0016デフォルトの名無しさん
2009/03/25(水) 03:06:07>15作った後に>12を見直したら
これでいいことがわかった。
42文字
0017デフォルトの名無しさん
2009/03/25(水) 03:35:071Byteが、8bitじゃないですよね。41文字。
「char型は、1である」だっけ、これ名言だもんな。
0018デフォルトの名無しさん
2009/03/25(水) 04:50:070019デフォルトの名無しさん
2009/03/25(水) 08:08:44いきなりそんなとてつもなく大きな数が出てくるとは....
>>10-13 >>15-17
C++規格上はオーバーフロー、アンダーフロー時の値は不定で、
特殊なマシンだとintの値の1個が無効値を表すものがあるので上手く動かない場合がある
多くのコンパイラの場合に動作すれば良いなら、>>2 のダメな例の2個目の方が短くて同じ値を返す
>>14
プロトタイプが
int main();
だからmainの引数は使っちゃダメだよ
0020デフォルトの名無しさん
2009/03/25(水) 08:10:280021デフォルトの名無しさん
2009/03/25(水) 14:33:42intに上限が無いと聞きまして、64文字。
いくらになるかは知らない。シフトしたらぐはっ。
0022デフォルトの名無しさん
2009/03/25(水) 18:24:08int main(){return 1e+99;} // 25文字
0023デフォルトの名無しさん
2009/03/25(水) 18:33:36eまたはE表現は、double型なので、int型にキャストしてやる必要があるのではないかしらん。
C言語なら暗黙でやってくれると思うけど、C++ですから。static_cast<int>()
0024デフォルトの名無しさん
2009/03/25(水) 19:15:340025デフォルトの名無しさん
2009/03/25(水) 20:12:20i=8 より i=9 の方が大きくないか?
0026デフォルトの名無しさん
2009/03/25(水) 20:37:40>48
もちろん9の方が、大きくなると思うけど、
あそこまでいくと些細なことなので、最適化されるように2の乗数にしておいただけ。
i*=i -> i<<=i
乗算を左シフト演算にするとA[1] = 8, A[n+1] = An*2^A[n]ほえ〜
0027デフォルトの名無しさん
2009/03/25(水) 20:49:590028デフォルトの名無しさん
2009/03/25(水) 20:56:11int main(){int i=8;float f=9e+9;for(;f>0;f-=1e-9)i<<=i;return i;}
int main(){int i=8;float f=9e+18;for(;f>0;f-=1)i<<=i;return i;}
int main(){int i=8,f=9e+18;while(f--)i<<=i;return i;}
int main(){int i=9e+99,f=i;while(f--)i<<=i;return i;} // 53文字
最適化したら >>2 とそっくりだよ〜
0029デフォルトの名無しさん
2009/03/25(水) 20:58:33よくわからんが、sizeof(int)が一定のある値だったとして、i <<= i が未定義でないとしても
1ビットづつうごかさなければ最大値は取れんよね。
いまいちルールが分からん。
0030デフォルトの名無しさん
2009/03/25(水) 21:21:59int で表せる範囲は十分大きいということしか決まっていない。
決まってないにも関わらずmain関数が同じ値を返すようなプログラムに
しなくてはいけないというのがルール。
十分大きいとはどういうことかというと、
>>1 のルールでいくら大きな数を作っていったとしても、
1レスではオーバーフローさせることが出来ないほど大きいということ。
ISO/IEC 14882:2003 では int の最小範囲は決まってるが、
最大範囲は決まっていないので、
int の範囲がいくら広くても
ISO/IEC 14882:2003 に反しない。
charがintと同じサイズでsizeof(int)は1という可能性もあるし、
sizeof(int)はとてつもなく大きな値である可能性もある。
0031デフォルトの名無しさん
2009/03/25(水) 21:30:58int の大きさに依存した値が返るから。
(厳密に言うとISO/IEC 14882:2003のルールでは無限ループの可能性もある)
int や float の大きさに依存しないプログラムであれば、
1レスで作れる最大の数があるはずで、
それよりも int は大きな数を保持できますよ
ということ。
0032デフォルトの名無しさん
2009/03/25(水) 21:38:10さっぱり分からんのだが、
int main() { return 1e99999999999999999999;}
じゃだめなのか?
0033デフォルトの名無しさん
2009/03/25(水) 21:41:310034デフォルトの名無しさん
2009/03/25(水) 21:41:56たとえば内部的には整数÷整数の有理数の形で保持されていて
誤差がまったく無いようなものを想定している。
有限文字の浮動小数点定数と四則演算では
有理数しか作れないので。
0035デフォルトの名無しさん
2009/03/25(水) 21:46:3842文字使えばもっとずっと大きな数が作れる。
たとえば、
int main(){return 9<<(9<<(9<<(9<<9999)));} // 42文字
0036デフォルトの名無しさん
2009/03/25(水) 22:13:25というか>>9のプログラムが何であるか知らずに>>9を超えるプログラムを自力で組んだらほとんど天才だが。
0037デフォルトの名無しさん
2009/03/25(水) 22:24:39ルール違反だし(m)の括弧とか不要だし、プログラマとしては三流だな。
0038デフォルトの名無しさん
2009/03/25(水) 22:28:26どの辺がルール違反?
括弧はおれもすごく気になってた。
0039デフォルトの名無しさん
2009/03/25(水) 22:34:41int factorial(int n){ return n ? n*factorial(n-1) : 1; }
int main(){ return factorial(99); }
こんなのもOK。
0040デフォルトの名無しさん
2009/03/25(水) 22:37:13int main(){char a=1,b=0;for(;a==b+1;a++,b++);return a;}
0041デフォルトの名無しさん
2009/03/25(水) 22:38:090042デフォルトの名無しさん
2009/03/25(水) 22:41:56それ許すならmain()の引数許した方がよっぽどスマート。
0043デフォルトの名無しさん
2009/03/25(水) 22:45:58最初に呼ばれるmainの引数は何になるの?
不定?
0044デフォルトの名無しさん
2009/03/25(水) 22:47:19int argc, char argv[]に決まってる。
別に不定でもなんでもいいだろ。
0045デフォルトの名無しさん
2009/03/25(水) 22:53:59不定の引数なんて意味が無いと思って
int main();
に限定したんだけど、
その引数で大きな数が作れるなら是非作ってみて!
ただし、引数に依存しない数を返してね。
00469=36
2009/03/25(水) 22:55:50結果がmainの引数に依存したら評価しにくいだろ。
括弧は三項演算子書くときの癖だ。
つい、いつものように書いちまった。
0047デフォルトの名無しさん
2009/03/25(水) 22:58:19// 86文字
int a(int m,int n){return m?n?a(m-1,a(m,n-1)):a(m-1,1):n+1;}
int main(){return a(9,9);}
たぶん下の方が大きいよね。
// 80文字
int a(int m,int n){return m?n?a(m-1,a(m,n-1)):m:n*9;}
int main(){return a(99,9);}
0048デフォルトの名無しさん
2009/03/25(水) 23:02:400049デフォルトの名無しさん
2009/03/25(水) 23:08:19・charのサイズに依存した値が返る
・オーバーフローした場合の値は ISO/IEC 14882:2003 では未定義であり
環境によっては無効値を表す値をとる場合がある
無効値での == の結果も ISO/IEC 14882:2003 では未定義
0050デフォルトの名無しさん
2009/03/25(水) 23:16:32それ以前に、ほとんどの環境で無限ループだった。
インクリメントでオーバーフローしたときの値と
+1 でオーバーフローした時の値は
普通は同じだよ。
0051デフォルトの名無しさん
2009/03/25(水) 23:23:090052デフォルトの名無しさん
2009/03/25(水) 23:23:30int main(){return 9;} // 21文字
int main(){return 99;} // 22文字
int main(){return 999;} // 23文字
int main(){return 1e+9;} // 24文字
int main(){return 1e+99;} // 25文字
int main(){return 9<<(9<<(9<<(9<<9999)));} // 42文字
int main(){int n=99,m=n;while(m--)n<<=n;return n;} // 50文字
int main(){int i=9e+99,f=i;while(f--)i<<=i;return i;} // 53文字
// 80文字
int a(int m,int n){return m?n?a(m-1,a(m,n-1)):m:n*9;}
int main(){return a(99,9);}
0053デフォルトの名無しさん
2009/03/25(水) 23:30:32無限ループじゃねーよ。+1と++の違いには依存してねーよ。
0054デフォルトの名無しさん
2009/03/25(水) 23:33:541e+9なら9e99の方がでかい。
0055デフォルトの名無しさん
2009/03/25(水) 23:54:18b+1 の型は int になるんだったね。
うっかりしてた。
>>40 は
char の範囲よりも int の範囲が広い場合には、
char の最大値をインクリメントした値が返る。
(多くの場合 -128)
char の範囲と int の範囲が同じ場合には、
無限ループ。
0056デフォルトの名無しさん
2009/03/26(木) 00:00:36たしかに。
int main(){return 9e99;} // 24文字
int main(){int i=9e99,f=i;while(f--)i<<=i;return i;} // 52文字
0057デフォルトの名無しさん
2009/03/26(木) 00:02:22int main(){return 9e9;} // 23文字
0058デフォルトの名無しさん
2009/03/26(木) 02:00:38>ISO/IEC 14882:2003 では int の最小範囲は決まってるが、
が結論で、その最小範囲内における最大値が唯一の答えだと思うんだが。
それ以上は環境によってオーバーフローする可能性がある。
0059デフォルトの名無しさん
2009/03/26(木) 11:52:16C++の規約(ISO/IEC 14882:2003)を理解しているかどうか試したいんだろ。
0060デフォルトの名無しさん
2009/03/26(木) 21:01:53標準規格で定義してない部分を追加で定義してるんで。
int のサイズが制限されてたら大きな数を作れないでしょ。
自力で巨大な整数を保持出来るクラスを作るにも、
組み込み整数型のサイズ制限があったら、
メモリ確保時のサイズが制限を超えちゃうんで作れないし。
>>59
当方、標準規格に詳しいわけでもないし、
C++のテクニックをたくさん知っているわけでもない。
むしろ教えてもらいたい方ですよ。
単純に、C++という言語を使って限られた文字数で
どのくらい大きな数が定義できるのか知りたいのよ。
たとえば私の能力では50文字で >>2 が精一杯だけど、
C++に詳しい人やいろんな人の頭脳を使えば
もっと大きく出来たり文字数を減らせたりするんじゃないかと。
>>21 のような、浮動小数点定数を用いる発想は私には無かったわけだし。
0061デフォルトの名無しさん
2009/03/26(木) 23:14:42int a(int z){ return z?z<<a(z-1):9 }
int b(int z){ return z?a(b(z-1)):9 }
int c(int z){ return z?b(c(z-1)):9 }
int d(int z){ return z?c(d(z-1)):9 }
int e(int z){ return z?d(e(z-1)):9 }
int f(int z){ return z?e(f(z-1)):9 }
int g(int z){ return z?f(g(z-1)):9 }
int h(int z){ return z?g(h(z-1)):9 }
int i(int z){ return z?h(i(z-1)):9 }
int j(int z){ return z?i(j(z-1)):9 }
int k(int z){ return z?j(k(z-1)):9 }
int l(int z){ return z?k(l(z-1)):9 }
int m(int z){ return z?l(m(z-1)):9 }
int n(int z){ return z?m(n(z-1)):9 }
int o(int z){ return z?n(o(z-1)):9 }
int p(int z){ return z?o(p(z-1)):9 }
int q(int z){ return z?p(q(z-1)):9 }
int r(int z){ return z?q(r(z-1)):9 }
int s(int z){ return z?r(s(z-1)):9 }
int t(int z){ return z?s(t(z-1)):9 }
int u(int z){ return z?t(u(z-1)):9 }
int v(int z){ return z?u(v(z-1)):9 }
int w(int z){ return z?v(w(z-1)):9 }
int x(int z){ return z?w(x(z-1)):9 }
int y(int z){ return z?x(y(z-1)):9 }
int main(){ return y(9e9999999999); }
0062デフォルトの名無しさん
2009/03/26(木) 23:30:34あっさり抜かれてるじゃん。
0063デフォルトの名無しさん
2009/03/26(木) 23:41:48それa〜yを一つの関数にできるな
第一引数が0ならa, 1ならbとして振舞うって具合に
で、そのように書き換えると>>9とほぼ同じコードになる
0064デフォルトの名無しさん
2009/03/27(金) 08:07:10終了。
0065デフォルトの名無しさん
2009/03/27(金) 10:47:200066デフォルトの名無しさん
2009/03/27(金) 18:31:070067デフォルトの名無しさん
2009/03/27(金) 18:41:15int main(){return 9;} // 21文字
int main(){return 99;} // 22文字
int main(){return 9e9;} // 23文字
int main(){return 9e99;} // 24文字
int main(){return 9<<(9<<(9<<(9<<9999)));} // 42文字
int main(){int n=99,m=n;while(m--)n<<=n;return n;} // 50文字
int main(){int i=9e99,f=i;while(f--)i<<=i;return i;} // 52文字
// 80文字
int a(int m,int n){return m?n?a(m-1,a(m,n-1)):m:n*9;}
int main(){return a(99,9);}
// 883文字
>>61
0068デフォルトの名無しさん
2009/03/27(金) 18:43:330069デフォルトの名無しさん
2009/03/27(金) 19:05:020070デフォルトの名無しさん
2009/03/27(金) 19:12:220071デフォルトの名無しさん
2009/03/27(金) 19:26:170072デフォルトの名無しさん
2009/03/27(金) 19:32:33ぽいですね。
int main(int argc, char **argv) {
if (argc < 2) return -1;
int i = atoi(argv[1]);
printf("%d\n", i);
return i;
}
$ ./a.exe 256; echo $?
256
0
$ ./a.exe 255; echo $?
255
255
0073デフォルトの名無しさん
2009/03/28(土) 06:19:22浮動小数点の指数表現にしても 9<<(9<<99999) の時点で無理。
0074デフォルトの名無しさん
2009/03/29(日) 02:19:30a(9,9)->a(a(9,9),a(9,9))->a(a(a(9,9),a(9,9)),a(a(9,9),a(9,9)))
と重ねたほうがでかくなるよな。
0075デフォルトの名無しさん
2009/03/29(日) 03:33:00int k(int x,int y,int n){return n-1?y?k(x,k(x,y-1,n),n-1):1:p(x,y);}
int g(int z){return k(3,3,z);}
int G(int w){return w-1?g(G(w-1)):g(4);}
int main(){return G(64);}
205文字。
0076デフォルトの名無しさん
2009/03/29(日) 08:46:01C++だからって特別に何かあるわけじゃなし、何がおもしろいんだか。
0077デフォルトの名無しさん
2009/03/29(日) 09:33:16同じ値で文字を減らせる
int k(int x,int y,int n){return n?y?k(x,k(x,y-1,n),n-1):1:x*y;}
int main(){int n=4,m=64;while(m--)n=k(3,3,n);return n;}
118文字
>>74
こんな感じかな?
// 113文字
int a(int m,int n){return m?n?a(m-1,a(m,n-1)):a(m-1,1):n+1;}
int main(){int n=9,m=99;while(m--)n=a(n,n);return n;}
これで >>75 よりは大きくなったかな?
0078デフォルトの名無しさん
2009/03/29(日) 10:19:230079デフォルトの名無しさん
2009/03/29(日) 10:59:170080デフォルトの名無しさん
2009/03/30(月) 09:30:55多ビットのそこそこ速い計算が必要で自分でJAVAのヒッグデシマルみたいなクラス作るのマンドクセとおもったから覗いてみたけど
ネタスレだったか
0081デフォルトの名無しさん
2009/03/31(火) 01:12:04うん、バイバイ。
0082デフォルトの名無しさん
2009/03/31(火) 06:26:400083デフォルトの名無しさん
2009/03/31(火) 21:29:1048文字で書ける最高の数って何だろう?
あと2重の再帰定義を77文字にすることは出来たんだけど、
76文字の場合の最高は何だろう?
>>2 みたいな普通のループ+シフトかな?
// 77文字
int a(int b,int c){return b*c?a(b-1,a(b,c-1)):c+9;}
int main(){return a(9,9);}
2重再帰定義と >>2 のループを合わせると、
103文字で、大きな数で有名な >>75 を超えることが出来るけど、
100文字以下だと最大はどんな数だろう?
// 103文字
int a(int b,int c){return b*c?a(b-1,a(b,c-1)):c+9;}
int main(){
int n=99,m=n;
while(m--)
n=a(n,n);
return n;
}
0084デフォルトの名無しさん
2009/03/31(火) 23:04:31int main(){
int n(0)
while( rand()%2 == 0 ){
n++;
}
return n;
}
0085デフォルトの名無しさん
2009/04/01(水) 15:20:27おしい つ >>1
0086デフォルトの名無しさん
2009/04/01(水) 18:38:18まあいずれにしろ >>1
int main(){
int n(0);
while( rand() ){
n++;
}
return n;
}
0087デフォルトの名無しさん
2009/04/01(水) 18:39:29>>84 みたいにスペースを付けるのはどうやんの?
0088デフォルトの名無しさん
2009/04/01(水) 21:20:18int main() {
return 9;
}
0089デフォルトの名無しさん
2009/04/01(水) 21:42:58int main(){
int n(0);
while( rand() ){
n++;
}
return n;
}
0090デフォルトの名無しさん
2009/04/03(金) 00:07:42100文字の制限がなくても今までで最大。
// 100文字
int a(int b,int c,int d){
return b+c&&d?a(c?b:0,c?c-1:d,a(b,c,d-1)):d+9;
}
int main(){return a(1,9,9);}
0091デフォルトの名無しさん
2009/04/03(金) 01:47:44とりあえずテトレーションを書いて見たかった。
0092デフォルトの名無しさん
2009/04/03(金) 08:31:01お〜〜〜、目から鱗。
引数無しでも再帰が書けるのか。
0093デフォルトの名無しさん
2009/04/03(金) 11:16:47その1は9にした方がいいんジャマイカ?
つーか、それぞれいくつになるのかと1文字あたりいくつになるかくらい書いとけ。
0094デフォルトの名無しさん
2009/04/03(金) 13:15:58>>92のままだと要するに2↑↑9だから簡単な数式であらわせるから、
大きさの見積もり楽だなぁという理由であえて1にしてました。
このスレは出来る限り大きな数を目標にしてるから9のほうがいいんだろうけどねぇ。
0095デフォルトの名無しさん
2009/04/03(金) 19:29:35もっとも使ったところで役に立つかどうかはまだわからないけど。
0096デフォルトの名無しさん
2009/04/03(金) 22:49:26もちろんOK.
C言語ではなくC++にした一番の理由が、
言語上でメモリ確保が出来ること。
メモリは十分にあるのでメモリ確保は失敗しない。
mainリターン時に解放していなくてもOK.
ということで。
>>94
このスレ的には
値の綺麗さや実行時間やメモリ使用量やバイナリサイズは一切問わず、
同じ文字数なら1でも大きい数を返す、
同じ大きさを返すなら1文字でも短くする、
のが目的。
ということで、
1を9に変えさせていただきます。
int a=9;int main(){return a--?9<<main():9;} // 43文字
きれいな数値でなくても、>>1 が責任を持って大きさを比較します。
>>93
mainの戻り値は簡単に書けないくらいの大きさになるので、
いくつになるか書くのは難しいかと。
0097デフォルトの名無しさん
2009/04/03(金) 22:57:20int main(){return 9;} // 21文字
int main(){return 99;} // 22文字
int main(){return 9e9;} // 23文字
int main(){return 9e99;} // 24文字
int main(){return 9<<(9<<(9<<(9<<9999)));} // 42文字
int a=9;int main(){return a--?9<<main():9;} // 43文字
// 77文字
int a(int b,int c){return b*c?a(b-1,a(b,c-1)):c+9;}
int main(){return a(9,9);}
// 100文字
int a(int b,int c,int d){
return b+c&&d?a(c?b:0,c?c-1:d,a(b,c,d-1)):d+9;
}
int main(){return a(1,9,9);}
大きく空いている44文字〜76文字の作品と、
文字数無制限(ただし1レス以内)の作品を特に募集中。
0098デフォルトの名無しさん
2009/04/03(金) 23:33:41int main(){int i;return (int)&i;}//33文字?
思ったより短くないなぁ。。。
0099デフォルトの名無しさん
2009/04/04(土) 01:29:05int main(){return (int)main;}
010098
2009/04/04(土) 04:02:33俺よりは環境依存っぽくない。
0101デフォルトの名無しさん
2009/04/04(土) 13:48:17ロードアドレスもそうだね。少なくとも、24文字の9e99に勝てそうにないし。
ってことで、24と42の間を無駄に埋めてみる。
int main(){return 9e99*9e99;} // 29文字
0102デフォルトの名無しさん
2009/04/04(土) 21:36:26たぶん42文字まではこんな感じじゃないかと思うんだけど、
もっと大きいのあるかなあ?
int main(){return 9;} // 21文字
int main(){return 99;} // 22文字
int main(){return 9e9;} // 23文字
int main(){return 9e99;} // 24文字
int main(){return 9e999;} // 25文字
int main(){return 9e9999;} // 26文字
int main(){return 9e99999;} // 27文字
int main(){return 9e999999;} // 28文字
int main(){return 9e9999999;} // 29文字
int main(){return 9<<(9<<99);} // 30文字
int main(){return 9<<(9<<999);} // 31文字
int main(){return 9<<(9<<9999);} // 32文字
int main(){return 9<<(9<<99999);} // 33文字
int main(){return 9<<(9<<999999);} // 34文字
int main(){return 9<<(9<<(9<<99));} // 35文字
int main(){return 9<<(9<<(9<<999));} // 36文字
int main(){return 9<<(9<<(9<<9999));} // 37文字
int main(){return 9<<(9<<(9<<99999));} // 38文字
int main(){return 9<<(9<<(9<<999999));} // 39文字
int main(){return 9<<(9<<(9<<(9<<99)));} // 40文字
int main(){return 9<<(9<<(9<<(9<<999)));} // 41文字
int main(){return 9<<(9<<(9<<(9<<9999)));} // 42文字
0103デフォルトの名無しさん
2009/04/04(土) 22:02:53cl t.c /link /merge:.text=.data
char main[]={184,-1,-1,-1,15,195}; //34字
_int64 main=0xc30fffffffb8; //27字
今思った。VC++と縛りを入れた以上、INT_MAXの0x7ffffffffのほうがいいのではないかと。
いずれにせよ>>102には遙か及ばない。
0104デフォルトの名無しさん
2009/04/04(土) 22:04:06数学ネタのスレは良く分からん。
0105デフォルトの名無しさん
2009/04/05(日) 11:56:06「int と float は十分な精度があるとします 」
これの意味と
どうやって大きい数と判定しているかを教えてくれ
(ちゃんと勉強している者が)普通に考えたら >>36 がいってることが正しい
0106デフォルトの名無しさん
2009/04/05(日) 19:59:50> 「int と float は十分な精度があるとします 」
> これの意味と
int に関しては、
>>1 のルールを守ったプログラムの中で、
最大の数を返すプログラムでもオーバーフローしない程大きいと思ってください。
(int のサイズに依存したプログラムで無ければ、1レスで作れる最大の数が定義出来るはず)
これで意味がわからなければ、
どんな整数もあらわせる多倍長の整数クラスみたいなものと思って頂いてもいいです。
(ただし、シフトやビット演算は普通の int のふるまいと同じです。)
float に関しては、
十分大きな数も保持出来るのに加えて、
演算に誤差がないもとのします。
内部的には上のint型2個による有理数みたいなものと思ってください。
C++の言語上はfloatの演算は +-*/ しかないので
有理数の範囲で誤差がない演算ができます。
double 型の定数からも誤差なくfloatに変換できるとします。
----
多倍長整数クラスや多倍長有理数クラスでも結局
普通の環境を想定すると new int[size] のsize が大きくなりすぎるし、
ポインタ型も大きくなりすぎるんだよね。
0107デフォルトの名無しさん
2009/04/05(日) 20:21:38> どうやって大きい数と判定しているかを教えてくれ
>>1 が責任を持って比較、判定します。
答えになってないか。
1レスで書ける程度のプログラムで、
ただひたすら大きな数を作るようなプログラムなら、
>>1 は大きさを見積もれるのではと思っています。(自信過剰?)
また、逆に >>1 が大きさを見積もれないほど大きな数が作れるならそれも見てみたい。
現代数学では大きさが見積もれないようなプログラムだったとしたら、
(たとえば存在が証明されてないような数を返すプログラム)
比較が出来ないかも知れないけど、
その場合も大きさ判定不能な作品として残したいと思います。
判定不能でも文字を極限まで減らすような努力もできるし。
0108デフォルトの名無しさん
2009/04/05(日) 20:23:04> (ちゃんと勉強している者が)普通に考えたら >>36 がいってることが正しい
>>9 より力技の >>61 の方が大きいし、
たくさんの人がいろんな発想で挑戦すれば超えられるかも知れない。
文字数が少ないものは数学の知識よりもC++の知識の方が重要だし。
だれかが作ったものに文字を追加してさらに大きな数を作るようなこともできる。
数学がぜんぜんダメな人でも
C++に詳しければ同じ値で文字数を減らすことが出来るかも知れないし。
とにかくいろんな発想で大きな数を作ったり文字を減らすのが見たい。
大きさの比較は >>1 が責任を持って行います。
0109デフォルトの名無しさん
2009/04/05(日) 21:05:54比較の内容と結果をちゃんと書けよ。
0110105
2009/04/05(日) 22:11:37/*
File : test.cpp
Compile : g++ test.cpp -lgmpxx -lgmp
*/
#include <iostream>
#include <gmpxx.h>
typedef mpz_class BigInteger;
BigInteger fact(int n){
BigInteger ans = 1;
do { ans *= n; } while( --n );
return ans;
}
BigInteger f(){
return fact(100);
}
int main(){
std::cout << f() << std::endl;
return 0;
}
「ライブラリ使用不可」ってのを破ってるけど
「int と float は十分な精度があるとします 」
を守るためだけに使いました
この例では単純な factorial(100) を出力するやつを書いてみた
要は上の f() を main() に変えて大きな数を作るってことでOK?
0111105
2009/04/05(日) 22:12:31>>108
> >>1 が責任を持って比較、判定します。
> 答えになってないか。
はい、答えになっていません
> >>1 は大きさを見積もれるのではと思っています。(自信過剰?)
> 大きさの比較は >>1 が責任を持って行います。
たとえば
>>9 と >>61 の桁数を教えてください
本当に >>61 のほうが大きいのですか?
私にはわかりません
(両方とも)とても計算できそうにないので
> C++に詳しければ同じ値で文字数を減らすことが出来るかも知れないし。
きっとそうですが、
「数値の大きさ」と「コードサイズ」を比べるのは
アンマッチな感じがします
0112デフォルトの名無しさん
2009/04/05(日) 22:52:170113デフォルトの名無しさん
2009/04/05(日) 23:08:24そりゃそうですね。書きます。
その文字数以内で最大の物はそれより小さい文字での最大のものより大きい説明を、
最大でないものはより文字数が小さいものorより値が大きいものとの比較を
書いていきます。
■ >>10-17,40,64,84,86,89,98,99,103
ルール違反
■ >>2
50文字
初期値 n=99 に対して、n<<=n を 100 回行っている。
>>96 の 初期値 x=9 に対し、x=9<<x を9回行ったものより明らかに大きい。
【50文字以下最大】
■ >>9
>>47で同じ数字を86文字で表現
■ >>21
>>28の3行目で同じ数字を53文字で表現している
■ >>22
>>102の方が明らかに大きい
■ >>28
>>56で同じ値を52文字で表現している
0114デフォルトの名無しさん
2009/04/05(日) 23:09:06>>102の方が明らかに大きい
■ >>35
>>102にまとめて記述
41文字以下のどの作品よりも明らかに大きい
【42文字以下現在最大】
■ >>39
これは99の階乗。
99の階乗 < 99の99乗 < 128の99乗 = 2の693乗 < 2の(9<<99)乗 < 9<<(9<<99)
■ >>56
24文字
>>102にまとめて記述
【24文字以下現在最大】
52文字
初期値 i=9e99 に対して、i<<=i を 9e99+1 回行っている。
>>2 の50文字の作品よりも明らかに大きい
【52文字以下現在最大】
■ >>57
>>102にまとめて記述
【23文字以下現在最大】
0115デフォルトの名無しさん
2009/04/05(日) 23:10:14>>77 で同じ値を118文字で表現している
>>77 の k(x,y,1) も xのy乗となる為、
『 >>75 の k(x,y,n) 』= 『 >>77 の k(x,y,n) 』
>>75 の G(w) は 初期値 z=4 に対し z=k(3,3,z) をw回繰り返したものであり、
>>75 と >>77 の118文字は同じ値を返す。
■ >>88
>>102にまとめて記述
【21文字以下現在最大】
■ >>91
96の43文字の方が明らかに大きい
■ >>96
返る値は
9<<(9<<(9<<(9<<(9<<(9<<(9<<(9<<(9<<9))))))))
であり、
42文字以下の >>102 のいずれよりも明らかに大きい
【43文字以下現在最大】
■ >>101
>>102の29文字の方が明らかに大きい
0116デフォルトの名無しさん
2009/04/05(日) 23:11:240117デフォルトの名無しさん
2009/04/05(日) 23:12:06そんな感じです。
0118デフォルトの名無しさん
2009/04/05(日) 23:18:54ttp://en.wikipedia.org/wiki/Conway_chained_arrow_notation
int p(int x,int y){return y?x*p(x,y-1):1;}
int e(int*a,int n){
if(n==1)return a[0];
if(n==2)return p(a[1],a[0]);
if(a[0]==1)return e(a+1,n-1);
if(a[1]==1)return e(a+2,n-2);
int x,y;
a[0]--;x=a[1]--;a[1]=e(a,n);y=e(a,n);a[0]++;a[1]=x;return y;}
int main(){int a[]={9,9,9,9,9,9,9,9,9};return e(a,9);}
0119デフォルトの名無しさん
2009/04/05(日) 23:58:31int main(){return (unsigned)~0;}
01201
2009/04/06(月) 00:00:26>>61 の883文字は、
int A(int y, int z){y?z?a(y-1,a(y-1,a(y,z-1)):9:9<<z;}
とすると、
A(1,z) = a(z)
A(2,z) = b(z)
A(3,z) = c(z)
...
A(25,z) = y(z)
となります。
>>77 の118文字は、
int k(int x,int y,int n){return n?y?k(x,k(x,y-1,n),n-1):1:x*y;}
これのxを3に固定し、yとnを入れ替えると
int K(int n,int y){return y?n?k(n-1,k(n,y-1)):1:3*n;}
となります。
>>90 の100文字は、
int a(int b,int c,int d){
return b+c&&d?a(c?b:0,c?c-1:d,a(b,c,d-1)):d+9;
}
これのbを0に固定すると、
int A(int c,int d){return c&&d?a(c-1,a(c,d-1)):d+9;}
となります。
01211
2009/04/06(月) 00:02:01いずれかの引数が0の場合の定義のみ異なり、
どちらも0でない場合の定義はまったく同じであることが分かります。
47-86,77-113
int a(int m,int n){return m?n?a(m-1,a(m,n-1)):a(m-1,1):n+1;}
47-80
int a(int m,int n){return m?n?a(m-1,a(m,n-1)):m:n*9;}
61-883
int A(int y, int z){y?z?a(y-1,a(y-1,a(y,z-1)):9:9<<z;}
77-118
int K(int n,int y){return y?n?k(n-1,k(n,y-1)):1:3*n;}
83-77, 83-103
int a(int b,int c){return b*c?a(b-1,a(b,c-1)):c+9;}
90-100
int A(int c,int d){return c&&d?a(c-1,a(c,d-1)):d+9;}
01221
2009/04/06(月) 00:03:3947-86 の n+1 と 61-883 の 9<<z で大きく異なるようにみえるが、
実は左の引数を数個増やすだけでこの程度の差は吸収してしまう。
たとえば、
47-86 の場合、
a(0,n) = n+1
a(1,n) = n+2
a(2,n) = n*2+3
a(3,n) = 2の(n+3)乗 -3
となる。
同様に、右の引数が0の時の定義も、
右の引数を数個増やすだけで吸収してしまう。
つまり、>>121 の関数は、引数を数個変えると追いつく程度の差しかなく、
左の引数が9と99では、初期値が上のいずれであっても
左の引数が99である方が大きくなる。
01231
2009/04/06(月) 00:06:29a(1,0,d) ≧ a(0,d,d) であり、
a(1,1,d) は、初期値x=9 に対し、x=a(1,0,x) を d 回行ったものである。
つまり、
a(1,1,d) は、初期値x=9 に対し、x=A(x,x) を d回行ったものより大きいので、
a(1,1,64) で、77-118 とだいたい同じ数となって、
a(1,1,99) で、77-113 や 83-103 とだいたい同じ数となる。
a(1,2,2) = a(1,1,a(1,1,a(1,2,0))) = a(1,1,a(1,1,9)) >> a(1,1,999)
であるので、
それより大きい a(1,9,9) は 77-118,77-113,83-103 より大きい。
01241
2009/04/06(月) 00:07:3986文字
同じレスの80文字の方が大きい
80文字
【80文字以下現在最大】
■ >>61
>>47 の80文字の方が大きい
■ >>77
118文字、113文字とも >>90 の100文字に負けている
■ >>83
77文字
【77文字以下現在最大】
103文字 >>90 の100文字に負けてる
■ >>90
100文字
【100文字以下現在最大】
01251
2009/04/06(月) 00:11:3842文字以下
>>102
int a=9;int main(){return a--?9<<main():9;} // 43文字
int main(){int n=99,m=n;while(m--)n<<=n;return n;} // 50文字
int main(){int i=9e99,f=i;while(f--)i<<=i;return i;} // 52文字
// 77文字
int a(int b,int c){return b*c?a(b-1,a(b,c-1)):c+9;}
int main(){return a(9,9);}
// 80文字
int a(int m,int n){return m?n?a(m-1,a(m,n-1)):m:n*9;}
int main(){return a(99,9);}
// 100文字
int a(int b,int c,int d){
return b+c&&d?a(c?b:0,c?c-1:d,a(b,c,d-1)):d+9;
}
int main(){return a(1,9,9);}
※ >>118 はこれから評価します。
0126デフォルトの名無しさん
2009/04/06(月) 16:09:42環境依存かなぁ。
0127デフォルトの名無しさん
2009/04/06(月) 18:55:22このままだとあまり大きくなく、
>>125 の80文字 のより小さい。
× a[0]--;x=a[1]--;a[1]=e(a,n);y=e(a,n);a[0]++;a[1]=x;return y;}
○ x=a[1]--;a[1]=e(a,n);a[0]--;y=e(a,n);a[0]++;a[1]=x;return y;}
このように直すと今のところ最大。(290文字)
※この数が290文字で記述できるとは思わなかった
0128デフォルトの名無しさん
2009/04/07(火) 01:40:070129デフォルトの名無しさん
2009/04/07(火) 19:25:180130デフォルトの名無しさん
2009/04/07(火) 22:42:14>>2 のダメな例の2個目と同じ発想。
int のサイズや負の数の表現方法に依存する。
激しく既出なルール違反。
ちなみに、
負の数に1の補数表現や2の補数表現を使った処理系の多くは 『{2の(intのビット数-1)乗} -2』 が返り、
負の数に符号ビット+絶対値を使った処理系の多くは 『2の(intのビット数-2)乗』 が返る。
トラップ表現のある実装の場合はトラップ表現が返る場合もあるかも知れないし、
飽和演算の処理系では 0 が返ることがあるかも知れない。
C++の規格上は不定である。
0131デフォルトの名無しさん
2009/04/07(火) 23:02:49// 191文字
int e(int*a,int n){
int x,y,&z=a[1],t[]={*a-1,z};
return n<3?*a?e(t,2)*z:1:z<2||*a<2?e(a+1,n-1):(x=z--,z=e(a,n),--*a,y=e(a,n),++*a,z=x,y);
}
int main(){int a[]={9,9,9,9,9,9,9,9,9};return e(a,9);}
0132デフォルトの名無しさん
2009/04/07(火) 23:12:39書いてあったのね。これは不覚。。。
あと負の表現については勉強になった。色々あるんだね。
0133デフォルトの名無しさん
2009/04/07(火) 23:44:45負の数の表現とか、わりとどうでもいいことを書いちゃったけど、
要はこのスレの目的は、
「int の最大値を返すプログラムを作るスレ」じゃなくて、
「C++という言語を使って、出来るだけ短く出来るだけ大きな数を定義するスレ」
なのでよろしく。
>>102 のような表を作っていくのが目的です。
0134デフォルトの名無しさん
2009/04/07(火) 23:54:340135デフォルトの名無しさん
2009/04/08(水) 00:02:47つってもそれを生かすアイディアが無いけど。
0136デフォルトの名無しさん
2009/04/08(水) 00:30:43int r(int v,int N){
if(N==0) return v<<9;
return r(v<<9,N-1)*r(v<<9,N-1);
}
int main(){
return r(9,9);
}
0137デフォルトの名無しさん
2009/04/08(水) 00:31:56もちろんありです。
構造体の struct は class より1文字多いですが、
public: の記述が不要なので、
クラスよりも使えるかもしれません。
new もメモリ確保するには必須ですが、
メモリは無尽蔵にあるので
delete は使う機会が無いかもしれません。
0138デフォルトの名無しさん
2009/04/08(水) 01:00:42r(9,9) = (2の46080乗) * (3の1024乗) ≒ 1.08234329*10^14360
だから、
int main(){return 9e99999;} // 27文字
の方が大きいかも。
0139デフォルトの名無しさん
2009/04/08(水) 01:21:04ハードル高いね。
浮動少数リテラルが強すぎる。。。難しいなぁ。
0140デフォルトの名無しさん
2009/04/13(月) 14:24:18スレの発展には関係なくて申し訳ないのですが、やたらと大きな整数とか
を計算できる電卓を作ってみました(win32 console アプリケーション)
もし良ければ使ってみてください
2^1000 とか 1000! みたいなのが問題なく計算できます
0141デフォルトの名無しさん
2009/04/13(月) 17:14:18ヘルプがないからコマンドがわからんなぁ。-hで反応しないし。
0142デフォルトの名無しさん
2009/04/13(月) 17:20:15ヘルプついてなくて大変もうしわけありません。
優先順位が同じになる二項演算を()でくくっていただければ、
整数と実数の加減乗除とか初等関数を使った普通に書いた数式を
受け付けるはずで
リターンしていただければ普通に値を計算するはずなのです・・
要は関数電卓もどきかと
0143デフォルトの名無しさん
2009/04/13(月) 17:44:39あぁ〜!俺勘違いしてたよ。
コマンドラインツールだと思って引数で計算させようとしてた。何か無限ループしてるみたいになったような??
0144デフォルトの名無しさん
2009/04/13(月) 20:05:51バグ報告
演算子の計算の順番がおかしい
a/b/c = a/(b/c)
a-b-c = a-(b-c)
となっている
2/3のような1未満になる分数を含んだ結果がおかしい
1+2/3 が D9 と表示される
質問
型は整数型と有理数型と小数型の3種類ですか?
sin や cos や exp はどのように計算してますか?
割り算やルートはどのように計算してますか?
0145デフォルトの名無しさん
2009/04/13(月) 20:11:030146デフォルトの名無しさん
2009/04/13(月) 20:18:090147デフォルトの名無しさん
2009/04/13(月) 20:27:43ttp://www.moris-shop.net/item/18921.html
0148デフォルトの名無しさん
2009/04/13(月) 20:44:350149デフォルトの名無しさん
2009/04/13(月) 22:14:11int main()
{
return pow(9,pow(9,pow(9,pow(9,(pow(9,9))))));
}
文字数がある程度増えてくれば指数表現よりもこちらの方が大きい
ような気がしますがどうでしょうか?
ということで、>>144 さん バグ報告をありがとうございました
スレ違いなので、改定版はどこかにまた出しますが今回だけお返事を
>>演算子の計算の順番がおかしい
式表現のBNFの書き方がまずかったようです parser に手を入れます
>>1+2/3 が D9 と表示される
単純なバグでした(他にも負数負数の計算後の表示が変でした)手元では直しました
>>型は整数型と有理数型と小数型の3種類ですか?
整数型と有理数型で最後の表現のときに小数表示に直しています
sin や cos や exp はどのように計算してますか?
>> exp log sin cos asin, atan はテーラー展開で計算して
pai, tan, acos はそれらを使っての計算です
>>割り算やルートはどのように計算してますか?
割り算はそのまま、ルートは a^2 = x -> a = (x/a + a)/2
の関係式を使って計算しています
0150デフォルトの名無しさん
2009/04/13(月) 22:28:28前のレスは無効ということでお忘れください。大変失礼しました
0151デフォルトの名無しさん
2009/04/13(月) 23:13:330152デフォルトの名無しさん
2009/04/14(火) 08:49:27int main()
{
return m--?n<<=main():n;
}
何の意義もないけど、一文字縮むような感じ? 49文字
0153デフォルトの名無しさん
2009/04/14(火) 09:11:39n<<=main()が不定。
main()を先に評価するかnを先に評価するかで結果が変わる
0154デフォルトの名無しさん
2009/04/14(火) 22:31:1643文字で再帰コールでシフトをしてる作品があるからね。
これの再帰回数を単純に増やせばある程度は大きくなる。
下の45文字ので >>125 の50文字を超え、
下の47文字ので >>125 の52文字を超えるはず。
int a=9;int main(){return a--?9<<main():9;} // 43文字
int a=99;int main(){return a--?9<<main():9;} // 44文字
int a=9e9;int main(){return a--?9<<main():9;} // 45文字
int a=9e99;int main(){return a--?9<<main():9;} // 46文字
int a=9e999;int main(){return a--?9<<main():9;} // 47文字
でも77文字まではずいぶんと文字数があるから、
それまでには上のような単純にaの値を増やす以外の別の方法で
もっと効率よく大きな数を作る方法があると思う。
0155デフォルトの名無しさん
2009/04/14(火) 23:18:570156デフォルトの名無しさん
2009/04/14(火) 23:56:020157デフォルトの名無しさん
2009/04/15(水) 00:03:34大きくなるのはtan(π/2(1-1/x))だっけ?
でも、この式もあんまり増加率高くなかったはず。
0158デフォルトの名無しさん
2009/04/15(水) 04:01:25で、閃いた。これ究極じゃね?
23文字位。
int main(){
return 1/0;
}
確か±無限だよね。いっちばーん。
0159デフォルトの名無しさん
2009/04/15(水) 06:57:19つまり、-∞でいちばん小さいんですね。
0160デフォルトの名無しさん
2009/04/15(水) 07:35:26マジレスするとゼロ除算で動作未定義。
>>2 のダメな例4個目の整数版。
0161デフォルトの名無しさん
2009/04/15(水) 07:48:27tan(1e-9999999) ≒ 1e-9999999 だから
戻り値0
>>157
tan(π/2-x) = 1/tan(x)
だから、
xが大きい時は、
tan(π/2(1-1/x)) = 1/tan(π/(2x)) ≒ 2x/π
0162デフォルトの名無しさん
2009/04/15(水) 10:07:41#define A 9e9999999
int main(){return A^A^A^A^A^A;}
みたいなのがAの定義とmain内の個数で調整すると、最終的に大きくなんないかな?
0164デフォルトの名無しさん
2009/04/15(水) 19:03:40たぶん短くなるとは思うけど、
一応ルール上はプリプロセッサ使用不可なので #define や #include などは禁止です。
typedef は使えるので、
長いプログラムではintやfloatやboolを1文字にtypedefすれば短くなるかも。
0165デフォルトの名無しさん
2009/04/15(水) 19:18:18float a = 9e999999;でいいだろう。
0166デフォルトの名無しさん
2009/04/15(水) 23:17:45#define だともっといろんなことが出来る。
#define A(x) (x<<x)
#define B(x) for(int i=0;i<x;i++){
#define C(x) struct x{
#define D(x) return x;}
#define E(x) (*x)->f()
固定辞書の圧縮みたいな感じ。
0167デフォルトの名無しさん
2009/04/16(木) 05:32:09int a=9e9;class A{public:int b;A operator*(A c){for(b=a;b--;)a<<=a;return c;}};
int main(){******************************************************A();return a;}
0168デフォルトの名無しさん
2009/04/16(木) 06:15:250169デフォルトの名無しさん
2009/04/16(木) 06:54:160170デフォルトの名無しさん
2009/04/16(木) 07:09:01int a=9e9;class A{public:int b;A operator*(){for(b=a;b--;)a<<=a;return *this;}};
int main(){******************************************************A();return a;}
0171デフォルトの名無しさん
2009/04/16(木) 07:24:29class{public:をstructに置きかえれる。
int b;int a=9e9,b;にしたほうが短い。
致命的なのは
**..**A()はfor(int i=99;i--;)*A();のほうが短い。
ここまでいくと*A()とか書く暇があったら処理の中身をinlineしたほうが短い。
結論としてはclassいらない
0172デフォルトの名無しさん
2009/04/16(木) 07:48:51ループにして縮めてみた。
たぶん同じ値が返る。
int main(){
int a=9e9,b,c=54;
for(;c--;)
for(b=a;b--;)
a<<=a;
return a;
}
もちろんこうした方が大きい。
int a=9e9,b,c=a;
0173デフォルトの名無しさん
2009/04/16(木) 07:52:210174デフォルトの名無しさん
2009/04/16(木) 08:51:03int a=9e9,b,c=a;int main(){while(b?b--:b=a*c--)a<<=a;return a;}
63B
0175デフォルトの名無しさん
2009/04/16(木) 12:57:22懲りずにまた携帯からw
int a=9;int f(){for(int b=a;b--;)a<<=f(f(f(f(f()))));return a};int main(){retern a;}
0176デフォルトの名無しさん
2009/04/16(木) 13:01:380177デフォルトの名無しさん
2009/04/16(木) 13:08:070178デフォルトの名無しさん
2009/04/16(木) 13:25:41これでループとまるかな。
0179デフォルトの名無しさん
2009/04/16(木) 13:30:440180デフォルトの名無しさん
2009/04/16(木) 16:04:20int a=9e9;int f(int c){for(;c--;)for(b=a;b--;)a<<=a;return a;}int main(){return f(f(f(f(f(a)))));}
0181デフォルトの名無しさん
2009/04/16(木) 20:36:13ver 0.2 を作ってみました。今度は任意の小数点精度の計算が設定可能です
http://pc12.2ch.net/test/read.cgi/software/1238682994/
スレ違いなので、過疎ってるソフト板のスレにの方にリンクをはっおきました。
とりあえず一応努力してみたご報告ということで失礼いたしました
0182デフォルトの名無しさん
2009/04/16(木) 21:15:27int main(){enum{s=9e9};int a=s,b[s],*c=b+s;for(;c---b;)*c=a;for(c=b;c<b+s;){a<<=a;--*c;if(!*c){*c++=a;continue;}c=b;}return a;}//128文字
0183デフォルトの名無しさん
2009/04/16(木) 23:09:090184デフォルトの名無しさん
2009/04/17(金) 01:02:38こんな技があったとは。
>>91 以来の衝撃。
3文字縮めた上に微妙に大きくなってる。
さらにループにして、同じ技を使って3重ループ相当を1重ループにしてみた。
int a=9,b,c,d=a;int main(){for(;b?b--:c?b=a*c--:c=a*d--;)a<<=a;return a;} // 73文字
0185デフォルトの名無しさん
2009/04/17(金) 01:09:58これは上のループを9e9重にした感じですか。
enum{s=9e9}; がうちの環境(VC 2005)だとエラーになってしまうのですが、
仮に s の所をそのまま9に置き換えたとしても9重ループ相当。
0186デフォルトの名無しさん
2009/04/17(金) 01:17:03はなんとなく暗黙の型変換が行われそうだけど、
C++の規格的にはどうなんだろう?
ダメなら const int s=9e9; だね。
9<<9e9 も VC2005 ではエラーになるけど、
もしかして規格的にはグレーだったりするのか?
0187デフォルトの名無しさん
2009/04/17(金) 01:24:02以下のように値が小さくてもVC2005だとエラーになる。
enum{s=1.0};
9<<1.0
0188デフォルトの名無しさん
2009/04/17(金) 02:39:470189デフォルトの名無しさん
2009/04/17(金) 07:56:44enum{s=9e9};int a=s,b[s],*c=b;int main(){for(b[s-1]=s;c<b+s;--*c<0?*c++=a:*(c=b))a<<=a;return a;} //97文字
>>188
9<<9 = 4608 だから 9999の方が大きい
0190デフォルトの名無しさん
2009/04/17(金) 08:11:34enum{s=9e9};int a=s,b[s],*c=b+s;int main(){for(*b=s;c>b;--*--c<0?*c=a:*(c=b+s))a<<=a;return a;} // 95文字
0191デフォルトの名無しさん
2009/04/17(金) 08:15:23// 80文字
int a(int b,int c){return b*c?a(b-1,a(b,c-1)):c+9;}
int main(){return a(9e99,9);}
0192デフォルトの名無しさん
2009/04/17(金) 21:03:24このままだと >>191 にかなわないので、
enum をやめて極限まで小さくしてみました。
int a,b[9]={9},*c=b+9;int main(){for(;c>b;--*--c<0?*c=++a:*(c=b+9));return a;} // 78文字
値的には >>125 の77文字よりすこし小さいくらいなので、
多少小さくなってもあと2文字縮められれば76文字以下で最大になります。
(でも個人的にはもう限界)
0193デフォルトの名無しさん
2009/04/17(金) 21:15:35>>42文字以下
>>102
int a=9;int main(){return a--?9<<main():9;} // 43文字
int a=99;int main(){return a--?9<<main():9;} // 44文字
int a=9e9;int main(){return a--?9<<main():9;} // 45文字
int a=9e99;int main(){return a--?9<<main():9;} // 46文字
int a=9e999;int main(){return a--?9<<main():9;} // 47文字
int a=9e9,b,c=a;int main(){while(b?b--:b=a*c--)a<<=a;return a;} // 63文字
int a=9,b,c,d=a;int main(){for(;b?b--:c?b=a*c--:c=a*d--;)a<<=a;return a;} // 73文字
// 77文字
int a(int b,int c){return b*c?a(b-1,a(b,c-1)):c+9;}
int main(){return a(9,9);}
// 80文字
int a(int b,int c){return b*c?a(b-1,a(b,c-1)):c+9;}
int main(){return a(9e99,9);}
// 100文字
int a(int b,int c,int d){return b+c&&d?a(c?b:0,c?c-1:d,a(b,c,d-1)):d+9;}
int main(){return a(1,9,9);}
// 191文字
int e(int*a,int n){
int x,y,&z=a[1],t[]={*a-1,z};
return n<3?*a?e(t,2)*z:1:z<2||*a<2?e(a+1,n-1):(x=z--,z=e(a,n),--*a,y=e(a,n),++*a,z=x,y);
}
int main(){int a[]={9,9,9,9,9,9,9,9,9};return e(a,9);}
0194デフォルトの名無しさん
2009/04/17(金) 21:36:11●43文字〜47文字
>>91 の数字を大きくしたもの
>>91 は 2^2^2^2^2^2^2^2^2 になる
引数を使わないで再帰コールを行っている
●63文字
a に対し a<<=a を繰り返すという操作を2重ループ相当のループで行い大きくしていく
>>170 の ***の繰り返しを >>172 が2重ループにし、
>>174 が2重ループを1重のループで記述するという技で短くした。
●73文字
上の >>63 文字の2重ループのものを3重ループ相当にし、
同じテクニックを用いて1重ループで表現した。
●77文字〜80文字
アッカーマン関数と呼ばれる関数を
>>9 がプログラムにした。
これを、値を多少変えて文字数を減らしたもの
●100文字
上のアッカーマン関数を中途半端に変数を一個追加して大きくしたもの
●191文字
>>118 が Conwayのチェーン表記 をプログラムにした。
これを >>131 が 191 文字に縮めた。
0195デフォルトの名無しさん
2009/04/17(金) 21:41:57int a,b[9]={9},*c=b+9;int main(){for(;c>b;--*--c<0?*c=++a:*(c=b+9));return a;} // 78文字
>>182 が、63文字の2重ループ相当や73文字の3重ループ相当のものを
配列を用いて9e9重ループ相当に
これを >>190 が95文字に縮める。
(ただし、enum{s=小数} の表現が微妙)
9重ループ相当に縮小してさらに短くして
>>77文字の作品より1文字長いところまでくる。
大きさ的には >>77文字の作品より若干小さい程度。
0196デフォルトの名無しさん
2009/04/18(土) 00:01:07>>102と>>193の記録は、文字数が大きいほど返る数も大きいって認識で良い?
0197デフォルトの名無しさん
2009/04/18(土) 01:13:49// 80文字
int a(int b,int c=9){return b*c?a(b-1,a(b,c-1)):c+9;}
int main(){return a(a(9));}
0198デフォルトの名無しさん
2009/04/18(土) 02:36:49int a(int b,int c){return b*c?a(b-1,a(b,c-1)):c+9;}
int x,y[9]={9},*z=y+9;
int main(){for(;z>y;--*--z<0?*z=x=a(x,9):*(z=y+9));return x;}
//135B
0199デフォルトの名無しさん
2009/04/18(土) 12:43:43そうですよ。
同じ数をより少ない文字で表現しているものがあったり、
同じ文字数以下でより大きな値を返すものがあれば
記録に掲載はされません。
同じ文字数、同じ大きさなら原則先に掲載された方としますが、
考え方が大きく異なるなら両方載せるかもしれません。
>>197
その手があったか。
現状80文字以下最大。
0200デフォルトの名無しさん
2009/04/18(土) 13:02:28残念ながら、
>>195より
>>193の77文字の方が1文字少ないので、
>>197 と >>193の77文字を合わせるより、
>>193の77文字を2個合わせた方が微妙に文字数が少なく作れてしまう。
// 131文字
int a(int b,int c){return b*c?a(b-1,a(b,c-1)):c+9;}
int A(int b,int c){return b*c?A(b-1,A(b,c-1)):a(c,c);}
int main(){return A(9,9);}
aとAはほとんど表現が似てるので、
引数を追加してくっつけると、
// 100文字
int a(int n,int b,int c){return b*c?a(n,b-1,a(n,b,c-1)):n?a(0,c,c):c+9;}
int main(){return a(1,9,9);}
これを同じ文字数で微妙に値を大きくしたのが、
>>193 の 100文字
0201デフォルトの名無しさん
2009/04/18(土) 20:14:279をxに修正。8重ループ相当。
int a(int b,int c){return b*c?a(b-1,a(b,c-1)):c+9;}
int x,y[9]={9},*z=y+9;
int main(){for(;z>y;--*--z<0?*z=x=a(x,x):*(z=y+9));return x;}
//135B
ちなみにこれはa(a(a(…の個数どころかa(が増殖していく速度がアッカーマン級
という感じなので、>>193の100文字なんかよりはるかに大きいはず。
たとえば>>200の式でA(3,3)を定義したとすると
aと(と)と,の4つの記号と数字があれば表記できてしまう程度だろうけど、
上の式の9を3に変えても別の記号を使わなければ表記不可能な程度には
大きいと思う。
0202デフォルトの名無しさん
2009/04/19(日) 01:53:15aへの代入が消えてるからグローバル変数の初期値に依存するってことで>>1を満たしてないことない?
0203デフォルトの名無しさん
2009/04/19(日) 08:07:11> たとえば>>200の式でA(3,3)を定義したとすると
> aと(と)と,の4つの記号と数字があれば表記できてしまう程度だろうけど、
>>201 のと同程度に表記不可能
(もし可能だと言うなら A(2,2) でも良いのでやってみてください)
A(n,x) でn重ループ相当ですよ
>>202
それは大丈夫。
初期値無しのグローバル変数は必ず0に初期化される。
0204デフォルトの名無しさん
2009/04/19(日) 14:22:12thx。やっと理解したw。A(n,x)はn重ループと本質的には変わらないのか。
なんだアッカーマン最強じゃないか。
0205204
2009/04/19(日) 14:54:11アッカーマン最強なら、こんな感じでどうよ
// 102文字
int a(int n,int b,int c){return b*c?a(n,b-1,a(n,b,c-1)):n?a(n-1,c,c):c+9;}
int main(){return a(9,9,9);}
0206204
2009/04/19(日) 15:10:28// 100文字
int a(int b,int c,int d){return b*c*d?a(b-1,c,a(b,c-1,a(b,c,d-1))):d+9;}
int main(){return a(9,9,9);}
0207デフォルトの名無しさん
2009/04/19(日) 19:45:28>>206 は77文字のと同じくらいじゃいか?
0208デフォルトの名無しさん
2009/04/19(日) 21:57:59でも206より↓のがずっと大きいことに気づく。
// 84文字
int a(int b,int c){for(c*b)c=a(b-1,a(b,c-1));return c+9;}int main(){return a(9,9);}
0209デフォルトの名無しさん
2009/04/19(日) 22:01:00// 86文字
int a(int b,int c){for(c*b--)c=a(b,a(b+1,c-1));return c+9;}int main(){return a(9,9);}
0210デフォルトの名無しさん
2009/04/19(日) 22:19:440211デフォルトの名無しさん
2009/04/19(日) 22:36:35グッドスタイン数列をググってみたけどちっちゃいな
0212デフォルトの名無しさん
2009/04/19(日) 22:47:49文字数を考えるとAckを強化してったほうがでかいだろうけどね
0213デフォルトの名無しさん
2009/04/20(月) 22:16:21上のほうは大きいけど、下の方a(9,0)=9だし、a(99,9)は9の(99の9乗)乗とかそのくらいにしかみえない。
誰か数学詳しい人どのくらいの値なのか教えてくれ。
// 89文字
int a(int b,int c){for(;b--;)c=a(b,c?a(b+1,c-1):9);return c+9;}int main(){return a(9,9);}
0214デフォルトの名無しさん
2009/04/20(月) 22:35:269の(99の9乗)乗程度の小さな数だったら確実にA(5,3)よりは小さい
ここを見たらA(99,9)がどれだけとんでもないかわかると思う
ttp://en.wikipedia.org/wiki/Ackermann_function
0215デフォルトの名無しさん
2009/04/21(火) 00:09:01上の方は、a(99,2)=a(98,a(99,1))=a(98,a(98,2))=a(98,…,a(5,a(4,a(3,2))))…)
下の方は、a(99,2)=a(98,a(99,1))=a(98,a(98,a(99,0)))=a(98,a(98,99))
同じように見えて、展開と評価を繰り返していくとありえないくらいの
2が沸いてくるわけで全然違うようにみえませんか
一見、下の方が大きく見えるのは錯覚じゃないと
1以外の数字の扱いが同じだからいいじゃないかとか、
文字数が短くなった分、引数に大きな値を入れればいいとか、
そんな次元ではなくて、アッカーマンさんの発明自体が失われていないかな
// 79文字
int a(int b,int c){return b?a(b-1,c?a(b,c-1):9):c+9;}int main(){return a(9,9);}
のほうが実は
// 79文字
int a(int b,int c){return b*c?a(b-1,a(b,c-1)):c+9;}int main(){return a(999,9);}
より大きいんじゃないの?
0216デフォルトの名無しさん
2009/04/21(火) 00:11:380217デフォルトの名無しさん
2009/04/21(火) 01:41:48たぶんあまり大きくない。
少なくともこれよりは小さい。
int a(int b,int c){return b*c?a(b-1,a(b,c-1)):c+9;}
int main(){return A(18,9);}
>>209 のbを1個増やす力は、
上のbを2個増やす力よりも小さい。
0218デフォルトの名無しさん
2009/04/21(火) 01:52:14int a(int b,int c){return b*c?a(b-1,a(b,c-1)):c+9;}
a(m,0) = 9
a(0,n) = n+9
a(1,n) は 初期値9 に対し a(0,x) を n 回行った数、9nより大きい数
a(2,n) は 初期値9 に対し a(1,x) を n 回行った数、9のn乗より大きい数
a(3,n) は 初期値9 に対し a(2,x) を n 回行った数、つまり9^9^9^9^...^9 (9がn個) より大きい数
.....
0219デフォルトの名無しさん
2009/04/21(火) 02:00:56a(m,0) = m
a(0,n) = n*9
a(1,n) は 初期値1 に対し a(0,x) を n 回行った数、9のn乗より大きい数
a(2,n) は 初期値2 に対し a(1,x) を n 回行った数、9^9^9^9^...^9 (9がn個) より大きい数
.....
0220デフォルトの名無しさん
2009/04/21(火) 02:13:34少なくともこれよりは小さい。
int a(int b,int c){return b*c?a(b-1,a(b,c-1)):c+9;}
int main(){return a(18,9);}
0221デフォルトの名無しさん
2009/04/21(火) 02:22:17int a(int b,int c,int d=9){return c*d?a(b,c-1,a(b,c,d-1)):b?a(0,d):d+9;}int main(){return a(1,9);} // 98文字
>>205 の102文字を3文字縮められました。
int a(int b,int c,int d){return b+c&&d?a(b-!c,c?c-1:d,a(b,c,d-1)):d+9;}int main(){return a(9,9,9);} // 99文字
0222デフォルトの名無しさん
2009/04/21(火) 12:50:09わかりやすい説明ありがと。もう工夫する余地はないのか。
>>221
100文字以下になるとは思わなかった。すごい。
0223デフォルトの名無しさん
2009/04/21(火) 18:55:52int a(int b,int c){return b*c?a(b-1,a(b,c-1)):c+9;}int b=9;int main(){return a(b--?main():9,9);} //96文字
0224デフォルトの名無しさん
2009/04/21(火) 20:42:049の9の9乗乗=つまり右肩にどんどん小さく乗ってくやつのこと?
それとも9の9乗の9乗=(9^9)^9のこと?
0225デフォルトの名無しさん
2009/04/21(火) 20:49:390226デフォルトの名無しさん
2009/04/21(火) 22:19:44pow(9,pow(9,pow(9,......pow(9,pow(9,9)))))...) (9がn個)
C++言語のスレなので、今後べき乗の意味で ^ は使わないようにします。
0227デフォルトの名無しさん
2009/04/22(水) 07:44:42int a=99;int main(){return a--?9<<main():9;} // 44
int a=9e9;int main(){return a--?9<<main():9;} // 45
int a=9e99;int main(){return a--?9<<main():9;} // 46
int a=9e999;int main(){return a--?9<<main():9;} // 47
int a=9e9999;int main(){return a--?9<<main():9;} // 48
int a=9e99999;int main(){return a--?9<<main():9;} // 49
int a=9e999999;int main(){return a--?9<<main():9;} // 50
int a=9e9999999;int main(){return a--?9<<main():9;} // 51
int a=9<<(9<<99);int main(){return a--?9<<main():9;} // 52
int a=9<<(9<<999);int main(){return a--?9<<main():9;} // 53
int a=9<<(9<<9999);int main(){return a--?9<<main():9;} // 54
int a=9<<(9<<99999);int main(){return a--?9<<main():9;} // 55
int a=9<<(9<<999999);int main(){return a--?9<<main():9;} // 56
int a=9<<(9<<(9<<99));int main(){return a--?9<<main():9;} // 57
int a=9<<(9<<(9<<999));int main(){return a--?9<<main():9;} // 58
int a=9<<(9<<(9<<9999));int main(){return a--?9<<main():9;} // 59
int a=9<<(9<<(9<<99999));int main(){return a--?9<<main():9;} // 60
0228デフォルトの名無しさん
2009/04/22(水) 07:45:23int a=99,b,c=a;int main(){for(;b?b--:b=a*c--;)a<<=a;return a;} // 62
int a=9e9,b,c=a;int main(){for(;b?b--:b=a*c--;)a<<=a;return a;} // 63
int a=9e99,b,c=a;int main(){for(;b?b--:b=a*c--;)a<<=a;return a;} // 64
int a=9e999,b,c=a;int main(){for(;b?b--:b=a*c--;)a<<=a;return a;} // 65
int a=9e9,b,c=a<<a;int main(){for(;b?b--:b=a*c--;)a<<=a;return a;} // 66
int a=9e99,b,c=a<<a;int main(){for(;b?b--:b=a*c--;)a<<=a;return a;} // 67
int a=9e999,b,c=a<<a;int main(){for(;b?b--:b=a*c--;)a<<=a;return a;} // 68
int a=9e9999,b,c=a<<a;int main(){for(;b?b--:b=a*c--;)a<<=a;return a;} // 69
int a=9e99999,b,c=a<<a;int main(){for(;b?b--:b=a*c--;)a<<=a;return a;} // 70
int a=9e9,b,c=a<<(a<<a);int main(){for(;b?b--:b=a*c--;)a<<=a;return a;} // 71
int a=9e99,b,c=a<<(a<<a);int main(){for(;b?b--:b=a*c--;)a<<=a;return a;} // 72
int a=9,b,c,d=a;int main(){for(;b?b--:c?b=a*c--:c=a*d--;)a<<=a;return a;} // 73
int a=99,b,c,d=a;int main(){for(;b?b--:c?b=a*c--:c=a*d--;)a<<=a;return a;} // 74
int a=9e9,b,c,d=a;int main(){for(;b?b--:c?b=a*c--:c=a*d--;)a<<=a;return a;} // 75
int a=9e99,b,c,d=a;int main(){for(;b?b--:c?b=a*c--:c=a*d--;)a<<=a;return a;} // 76
0229デフォルトの名無しさん
2009/04/22(水) 07:46:56int a(int b,int c=9){return b*c?a(b-1,a(b,c-1)):c+9;}int main(){return a(99);} // 78
int a(int b,int c=9){return b*c?a(b-1,a(b,c-1)):c+9;}int main(){return a(9e9);} // 79
int a(int b,int c=9){return b*c?a(b-1,a(b,c-1)):c+9;}int main(){return a(a(9));} // 80
int a(int b,int c=9){return b*c?a(b-1,a(b,c-1)):c+9;}int main(){return a(a(99));} // 81
int a(int b,int c=9){return b*c?a(b-1,a(b,c-1)):c+9;}int main(){return a(a(9e9));} // 82
int a(int b,int c=9){return b*c?a(b-1,a(b,c-1)):c+9;}int main(){return a(a(a(9)));} // 83
int a(int b,int c=9){return b*c?a(b-1,a(b,c-1)):c+9;}int main(){return a(a(a(99)));} // 84
int a(int b,int c=9){return b*c?a(b-1,a(b,c-1)):c+9;}int main(){return a(a(a(9e9)));} // 85
int a(int b,int c=9){return b*c?a(b-1,a(b,c-1)):c+9;}int main(){return a(a(a(a(9))));} // 86
int a(int b,int c=9){return b*c?a(b-1,a(b,c-1)):c+9;}int main(){return a(a(a(a(99))));} // 87
int a(int b,int c=9){return b*c?a(b-1,a(b,c-1)):c+9;}int main(){return a(a(a(a(9e9))));} // 88
int a(int b,int c=9){return b*c?a(b-1,a(b,c-1)):c+9;}int main(){return a(a(a(a(a(9)))));} // 89
int a(int b,int c=9){return b*c?a(b-1,a(b,c-1)):c+9;}int main(){return a(a(a(a(a(99)))));} // 90
int a(int b,int c=9){return b*c?a(b-1,a(b,c-1)):c+9;}int main(){return a(a(a(a(a(9e9)))));} // 91
int a(int b,int c=9){return b*c?a(b-1,a(b,c-1)):c+9;}int main(){return a(a(a(a(a(a(9))))));} // 92
int a(int b,int c=9){return b*c?a(b-1,a(b,c-1)):c+9;}int main(){return a(a(a(a(a(a(99))))));} // 93
int a(int b,int c=9){return b*c?a(b-1,a(b,c-1)):c+9;}int main(){return a(a(a(a(a(a(9e9))))));} // 94
int a(int b,int c=9){return b*c?a(b-1,a(b,c-1)):c+9;}int main(){return a(a(a(a(a(a(a(9)))))));} // 95
0230デフォルトの名無しさん
2009/04/22(水) 07:47:39int a(int b,int c=9){return b*c?a(b-1,a(b,c-1)):c+9;}int b=99;int main(){return a(b--?main():9);} // 97
int a(int b,int c=9,int d=9){return c*d?a(b,c-1,a(b,c,d-1)):b?a(0,d):d+9;}int main(){return a(1);} // 98
int a(int b,int c=9,int d=9){return b+c&&d?a(b-!c,c?c-1:d,a(b,c,d-1)):d+9;}int main(){return a(9);} // 99
int a(int b,int c=9,int d=9){return b+c&&d?a(b-!c,c?c-1:d,a(b,c,d-1)):d+9;}int main(){return a(99);} // 100
0231デフォルトの名無しさん
2009/04/25(土) 17:22:170232デフォルトの名無しさん
2009/04/26(日) 00:41:14計算量がどのくらいになるかを考えてみたけど、
大きく見積もっても指数関数くらい。
0233デフォルトの名無しさん
2009/04/28(火) 04:19:51いろいろこねくり回した結果こうなりますた。
ちゃんと停止するかどうかも含めて評価よろしこ。
ところでint型関数がreturn文を持たないのはありなんだっけ?
gccではコンパイル通ったけど。
347文字
typedef int I;
I a=9e99,s=9,*x,*p,*q;
I A(){a<<=(a<<a);}
I B(I (*f)()){I b,c,d;for(d=c=b=a;d;(b--)?0:(c--)?(b=a):(d--)?(c=b=a):0)f();return a;}
I C(){s<<=B(A);x=new I[s+1];for(p=x;p<x+s;p++)*p=B(A);*p=-1;}
I D(){for(;;){for(p=x;!*p;p++);if(*p==-1)return B(A);for(q=x;q<p;q++)*q=B(A);B(A);(*p)--;}}
I E(){C();D();}
I main(){B(E);return a;}
0234デフォルトの名無しさん
2009/04/28(火) 19:13:07関数Aを3重ループを使って大きい関数Bを作り、
関数Bをn重ループを使ってさらに大きい関数Dを作り、
関数Dを3重ループを使ってさらに大きい関数を作るという感じですか
大きさ的には >>230 の97文字より大きく、98文字より小さい
戻り値のある関数をreturnを省略して抜けると動作不定である為、
A C D E と Bの引数の関数の戻り値はvoidにする必要あり
3重ループのBよりもn重ループのDの方が強いので
Bは無くしてDに引数fを付けた方が良いと思う。こんな感じで。
void D(void f()){......}
void F(){D(A);}
int main(){D(F);return a;}
0235233
2009/04/28(火) 20:07:4198文字に負けてるってところを詳しく解説してホシス。
0236233
2009/04/29(水) 10:12:52まず、次のような関数loopとaddを用意する。
int loop(int a,int b,int ((*f)(int,int))){
int result=a;
for(int i=1;i<b;i++) result=f(a,result);
return result;
}
int add(int a,int b){return a+b;}
そうすると掛け算,指数関数は次のように実装できる。
int mul(int a,int b){loop(a,b,add);}
int pow(int a,int b){loop(a,b,mul);}
ここで、掛け算はloopを1回、指数関数はloopを2回,
関数の定義で使用していることがわかる。
そこで、その関数を定義するのに必要なloopの回数を返す関数loop_rankを考える。
loop_rank(add)==0;
loop_rank(mul)==1;
loop_rank(pow)==2;
etc.
0237233
2009/04/29(水) 10:23:57C言語だと関数と関数を合成して新しい関数を返す関数がかけねぇ?
関数ポインタを使えば何とかなるかなぁ…
0238233
2009/04/29(水) 10:43:35template<int N>
int f(int a,int b)
{
return loop(a,b,f<N-1>);
}
template<>
int f<0>(int a,int b)
{
return add(a,b);
}
だな。
これで大体アッカーマン相当とおもわれ。
0239デフォルトの名無しさん
2009/04/29(水) 10:48:13コンパイル通るかそれ?
0240233
2009/04/29(水) 10:51:47要するに生の整数を比べずにループが何重になってるかってことを比べる、
というのをみんなやってたわけだが、loop_rankを厳密に定義しておけば議論がしやすいかなと。
0241233
2009/04/29(水) 10:54:14ほかはしらね。
0242デフォルトの名無しさん
2009/04/29(水) 11:01:02「どれが大きいか」を判定することのほうがよっぽど難しいな
0243233
2009/04/29(水) 11:10:09なんてのは計算不能だろな。
与えられたプログラムが停止することが保障されてたとしても、
最終的な値を2進の整数に展開せずににメモリ使用量に制限かけて判定する
なんてことが可能なのかどうか…
0244233
2009/04/29(水) 11:27:13loop_rankじゃ結果が大きくなりすぎてだめだな。
もうすこし上の概念を導入しないと。
0246233
2009/04/29(水) 11:59:45今、自分が考えてるのが整数なのか関数なのかテンプレートなのか
わけが解らなくなってきたw
0248233
2009/04/30(木) 20:41:57最底辺IT奴隷orひきニートたるべきム板民にあるまじきブルジョアっぷりだな。
まったくもってけしからん。
俺もGWあけたら奴隷生活に戻るんだからはやめに返事クレ。
0249233
2009/05/01(金) 20:39:27Aをアッカーマン関数とするとおおむね、
A(1,9,9)=A(A(9,9),A(9,9))
でいいんかな?
02501
2009/05/02(土) 16:16:35クラスや構造体を使えば実装可能です。
struct OPERATOR{
virtual int operator()(int x,int y) = 0;
};
struct OPERATOR_ADD:OPERATOR{
virtual int operator()(int x,int y){
return x+y;
}
};
struct OPERATOR_LOOP:OPERATOR{
OPERATOR*a;
OPERATOR_LOOP(OPERATOR*a_):a(a_){}
virtual int operator()(int x,int y){
int r=x;
for(;--y;)
r=(*a)(x,r);
return r;
}
};
OPERATOR* mul = new OPERATOR_LOOP(new OPERATOR_ADD);
OPERATOR* power = new OPERATOR_LOOP(mul);
OPERATOR* tetration = new OPERATOR_LOOP(power);
02511
2009/05/02(土) 16:25:48loop_rank がnの関数を f[n](x) とした時、
関数 f[x](x) を考えてみる。
この関数は、f[大きな整数](x) よりも増大度が大きく、
x=大きな整数を超える場合は
f[x](x) の方が大きい。
f[x](x) はloop_rank で言うと無限みたいなもの。
0252デフォルトの名無しさん
2009/05/02(土) 16:33:39引数が1個の関数を考えてみる。
struct function{
virtual int operator()(int x) = 0;
};
struct function_successor:function{
virtual int operator()(int x){ return x+1; }
}
struct function_loop:function{
function*a;
function_loop(function*a_):a(a_){}
virtual int operator()(int x){
int r=x;
for(;x--;)
r=(*a)(r);
return r;
}
};
struct function_loop2:function{
function*a;
function_loop2(function*a_):a(a_){}
virtual int operator()(int x){
int r=x;
for(;x--;)
r=(*a)(r);
return r;
}
};
02531
2009/05/02(土) 16:39:45function_loopは function_loop(ある関数) とすることで
loop_rank を1個増やすことができる。
function_loop2 は引数の数字分function_loopを付け足すものである。
function*a=new function_loop2(new function_successor)
とした時、
(*a)(10) はfunction_successor に対してfunction_loop を10個追加した関数に10を入れたもの
(*a)(100) はfunction_successor に対してfunction_loop を100個追加した関数に10を入れたもの
である。
この時のaのloop_rankを考えると、
function_successor に function_loop を整数個つけたいかなる関数よりも
早く増大することが分かる。
たとえばfunction_loop を100個つけた関数と比べると、
引数が101以上の場合はa の方が値が大きくなる。
02541
2009/05/02(土) 16:48:24>>233 の場合、
関数B(A)はloop_rankが5と6の間くらいの関数。
関数EはB(A)に対し、loop_rankがωのループを行うので、
loop_rankが6+ωくらい。
ここで、253のaを考えてみると、
(*a)(10) に対して(*a)(20) は10 loop_rank が増えた関数に20を代入している。
>>233 の関数Eも
B(A)のloop_rankが小さくても引数をちょっと大きくするだけで追い抜いてしまう。
つまり、関数Eはloop_rankがωである (*a) などとほとんど同じ増大度であるといえる。
最終の関数 B(E) はEにloop_rankを3増加したものとなるので、
loop_rank はω+3くらいである。
つまり、 >>233 は loop_rank が ω+3 程度の関数に 9e99 を入れたものとなる。
02551
2009/05/02(土) 16:56:08再帰定義をよく見てみると、
関数 a(b,c,x) に対して、関数 a(b,c+1,x) はloop_rankが1個増えた関数だということがわかる。
a(0,0,x) はx+9 でloop_rankは0なので、
a(0,c,x) のloop_rank はcになる。
a(1,0,x) = a(0,x,9) なので、
a(1,0,x) はloop_rankが整数であるどんな関数よりも増大度が大きく、
loop_rank は >>253 の(*a) と同じωとなる。
さらに、2番目の引数を9にした a(1,9,x) は
loop_rankがω+9
関数 a(1,x,x) を考えてみると、
loop_rankがω+整数であるどんな関数よりも増大度が大きく、
loop_rankはω+ωになる。
0256デフォルトの名無しさん
2009/05/02(土) 16:58:3599文字のbを1増やすのは
loop_rankをω増やす操作となる。
98文字のものは、99文字のものから1文字減らす為に、
bを0と1に制限したもの。
0257デフォルトの名無しさん
2009/05/02(土) 17:09:06function_loop2 が間違ってました。
こうですね。
virtual int operator()(int x){
function*f=a;
for(int i=x;i--;)
f=new function_loop(f);
return (*f)(x);
}
0258233
2009/05/04(月) 07:36:40了解。
丁寧な解説ありがとう。
大きな関数を繰り返すことでさらに大きな関数を作る、そしてそれをまた繰り返して…
というのは>>1はもうやり尽くしていて結論が出ている。それを超えるには全く別の発想が必要になる。
ということでよろしいか?
02591
2009/05/04(月) 11:41:45とてもやり尽くせないと思うけど。
とりあえず >>252 の loop, loop2, loop3 を一般化したloop_n 相当を作ってみました。
最適化して解読しにくいと思うので多少説明。
{b,c,d} は関数bにloop_cを(d+1)回行ったもの
{0,0,0} は特別扱いで f(x) = x+9
変数 d は無くても作れるけど、ループより再帰の方が短かったので足しました。
関数は1文字で右から計算を行う operator = で作るのが一番短かったので
みにくいけど = で実装
// 138文字
struct a{
a*b;
int c,d;
int operator=(int f){
a g={b,c-!d,d?d-1:f},h={&g,c};
return c+d?*b=(c*d?h:g)=f:f+9;
}
}b,c={&b,9};
int main(){return c=9;}
0260デフォルトの名無しさん
2009/05/31(日) 14:54:05反復対数関数lg* n
lg^i n =def
n (i=1の時)
lg(lg^(i-1) n) (i>0,lg^(i-1) n>0の時)
未定義 (i>0,lg^(i-1) n<=0またはlg^(i-1) nが未定義の時)
lg* 2 = 1
lg* 4 = 2
lg* 16= 3
lg* 65536=4
lg* 2^65536=5
と思って調べていたら
逆アッカーマン関数(α)ってのもあるのか
α(m,n)=min{i>=1 : Ack(i,floor(m/n)) >= log2 n}
α(2^(2^(2^65536)) - 3) = 4
0261デフォルトの名無しさん
2009/06/04(木) 00:00:36>>91 が43文字で作ってる。
アッカーマンは >>9 が最初で
現在は77文字まで縮まってる。
0262デフォルトの名無しさん
2009/07/02(木) 00:25:460263デフォルトの名無しさん
2009/07/06(月) 01:25:30{
return 1.0/【>>1の人間としての存在価値】;
}
0264デフォルトの名無しさん
2009/07/08(水) 20:23:17// 149文字
struct a{
int b;
a*c,*d;
a*e(int f){
a*g=f?e(f-1):d,h={b-!c,c?c->e(f):g,g};
return b||c?new a(h):d;
}
}b,*c=&b;
int main(){
for(;c=c->e(b.b+=9););
return b.b;
}
0265デフォルトの名無しさん
2009/07/22(水) 19:03:44B(2,5)=2048
B(2,6)=67108864
B(2,7)=144115188075855872
0266デフォルトの名無しさん
2009/07/23(木) 21:55:04定義が良くわからないけど、
B(2,n) = 1<<(1<<n-1)-n
なので、
int main(){return 2;} // B(2,3) 21文字
int main(){return 16;} // B(2,4) 22文字
int main(){return 2048;} // B(2,5) 24文字
int main(){return 1<<57;} // B(2,7) 25文字
int main(){return 1<<502;} // B(2,10) 26文字
int main(){return 1<<8178;} // B(2,14) 27文字
int main(){return 1<<65519;} // B(2,17) 28文字
int main(){return 1<<524268;} // B(2,20) 29文字
int main(){return 1<<8388584;} // B(2,24) 30文字
int main(){return 1<<67108837;} // B(2,27) 31文字
int main(){return 1<<536870882;} // B(2,30) 32文字
int main(){return 1<<(1<<98)-99;} // B(2,99) 33文字
int main(){return 1<<(1<<998)-999;} // B(2,999) 35文字
0267デフォルトの名無しさん
2009/08/22(土) 08:00:350268デフォルトの名無しさん
2009/08/22(土) 08:27:25へんなC++の整数型もどきを使わずに済んでルールが簡明になったな
0269デフォルトの名無しさん
2009/08/28(金) 00:45:33長い文字列を印字する為に、事実上無制限の状態数が必要。
事実上無制限の状態数を表す為に、事実上無制限のメモリが必要。
事実上無制限のメモリを実装する為に、事実上無制限のポインタサイズが必要。
ということで、
どうせポインタサイズが事実上無制限なら
int のサイズも事実上無制限にしてしまえ!
というのがintサイズ無制限のルールにした理由。
>>267 のルールだと、
void pchar(void);
を1文字印刷する関数として、
プログラム終了までにこの関数を何回コール出来るか競う感じか。
単純にステップ数を競うのでも良い。(ステップの定義が必要だが)
0270デフォルトの名無しさん
2009/08/28(金) 00:51:00多倍長整数の実装を普通の方法で行うことは出来ない。
整数型のサイズに依存しない符号なし無制限整数型の実装を考えてみた。
struct UINT {
UINT*next;
}
UINT*inc(UINT*a){
return new UINT(a);
}
UINT*dec(UINT*a){
return a->next;
}
UINT*add(UINT*a,UINT*b){
while(a){
a=dec(a);
b=inc(b);
}
return b;
}
UINT*mul(UINT*a,UINT*b){
UINT*c=0;
while(a){
a=dec(a);
c=add(b,c);
}
return c;
}
....
0271名無しさん@そうだ選挙に行こう
2009/08/30(日) 08:16:27http://pc12.2ch.net/test/read.cgi/tech/1231384158/
0272デフォルトの名無しさん
2009/09/24(木) 02:19:57main(){for(;;)std::cout<<"9";}
0274デフォルトの名無しさん
2009/09/26(土) 02:50:03int main(){return numeric_limits<int>::max();}
//63文字
0276デフォルトの名無しさん
2009/09/26(土) 13:27:03int main(){int a=1,b=0;for(;a>b;a++,b++);return b;}
こうすれば無限にならないのでは?
0277デフォルトの名無しさん
2009/09/26(土) 19:15:26だから何?
0279デフォルトの名無しさん
2009/09/26(土) 23:04:53>int の最大値は環境依存なのでルール違反。
はぁ?
intの最大値は環境依存だが、>>274のコードは環境依存ではない。
0280デフォルトの名無しさん
2009/09/27(日) 02:56:37それはないだろ
規約上はオーバーフローした場合の挙動は未定義なんだから
aがオーバーフローしたとき0にするのではなく
非数字やエラーとして扱う処理系を作っても一向にかまわない
a>bが真になったり、システム自体がダウンすることもありうる
結局オーバーフロー依存は環境依存だから禁止なの
0281デフォルトの名無しさん
2009/09/27(日) 02:59:49>>279の方はよくわかんね
0282デフォルトの名無しさん
2009/09/27(日) 03:09:01なにが、はぁ?だよ
0283デフォルトの名無しさん
2009/09/27(日) 03:16:30//25文字
//環境依存がダメなら、intが32768以上の値をとることを期待するのは機種依存だからダメ。
0284デフォルトの名無しさん
2009/09/27(日) 07:30:06環境によって main が返す値が変わるのだから環境依存。
>>283
「int と float は十分な精度があるとします」
このスレのルールです
意味は >>30-31
0285デフォルトの名無しさん
2009/09/27(日) 11:57:39int main(){return f(9);}
//59文字
0286デフォルトの名無しさん
2009/09/27(日) 11:58:37int main(){return f(9);}
//63文字
0287デフォルトの名無しさん
2009/09/27(日) 14:50:34int main(){return h(9);}
//85文字
//結局アッカーマン
0288デフォルトの名無しさん
2009/09/27(日) 16:03:36int main(){return h(9,9);}
//87文字
//結局アッカーマン
// >>285, >>287 取り消し
0289デフォルトの名無しさん
2009/09/27(日) 18:38:14int main(){return h(9,9);}
//87文字
//結局アッカーマン
// >>288 取り消し
0290デフォルトの名無しさん
2009/09/27(日) 23:49:12main関数だけで再帰呼び出すを行うというスゴイ技を
>>91 さんが見せてくれました。
それを微妙に修正したのが >>96 の 43文字の作品。
>>286 とまったく同じ値となります。
>>289
アッカーマン(相当の)関数は >>9 さんが始めに書いていて、
>>83 で 77文字まで縮まっています。
現状の記録は >>227-230 にあります。
詳しそうなので、ぜひ記録更新に挑戦してみてください。
1レス内文字数無制限での記録もお待ちしております。
0291デフォルトの名無しさん
2009/09/28(月) 00:08:240292デフォルトの名無しさん
2009/09/28(月) 01:09:31未定義動作はないぞ。(unsignedな型の計算はオーバーフローにはならないと書いてある)
0293デフォルトの名無しさん
2009/09/28(月) 01:10:390294デフォルトの名無しさん
2009/09/28(月) 16:01:090295デフォルトの名無しさん
2009/09/28(月) 16:19:420296デフォルトの名無しさん
2009/09/28(月) 21:23:04r が初回不定
i を int にキャストした時点でオーバーフローする
環境依存な値が返る
上2個が解決したとしても
環境依存な値が返るのはこの方法では不可避
ところで、
このスレのルールを守って
(int が十分な精度という条件を除いて)
確実にintの最大値を返すものはいままで上がって無かったと思うけど、
出来るのかな?
>>294 >>295
簡単なインタープリタなら1レスで作れるかも。
でも大きな数を返すプログラムをプログラムで作れるかどうか。
0297デフォルトの名無しさん
2009/09/29(火) 01:03:47unsignedからintへのキャストで元の値がintで表現できない場合の変換後の値はimplementation definedですがそれはオーバーフローではないのでは?
環境依存なのはその通り。
0298デフォルトの名無しさん
2009/09/29(火) 01:09:380299デフォルトの名無しさん
2009/09/29(火) 01:12:000300デフォルトの名無しさん
2009/09/29(火) 01:20:380301デフォルトの名無しさん
2009/09/29(火) 01:23:26もダメってこと?
論理演算は全部禁止?
0302デフォルトの名無しさん
2009/09/29(火) 01:25:090303デフォルトの名無しさん
2009/09/29(火) 01:29:51シフト使ってる例は沢山あるし。
0304デフォルトの名無しさん
2009/09/29(火) 01:34:31寂しい人向け
混む時間帯は人気ありすぎて定員オーバーで入れん
24時間荒れ放題の超カオスな絵チャット
本当の本当に完全無法地帯の絵チャット
(2ちゃんとは比較にならない)
荒しとプログラマーと防衛プログラマーの攻防戦
防衛側が強し、求む強力荒しプログラマー
しかも外国サーバー(イギリス)で管理人は荒し容認
殺人予告すらOKっぽい。ログなんて当然取ってないし
0305デフォルトの名無しさん
2009/09/29(火) 01:44:12内部での二進表現に依存してるから。
0306デフォルトの名無しさん
2009/09/29(火) 02:41:330307デフォルトの名無しさん
2009/09/29(火) 13:41:510309デフォルトの名無しさん
2009/09/29(火) 23:36:22ごめんなさい。その通りでした。
----
外部参照無しに、(インクルード、ライブラリ、外部入力など)
確実にintの最大値を返すC++のプログラムは存在しない
という証明が私の中では出来たつもり。
●証明
2つの環境AとBがあって、
int の内部表現や動作は下記「異なる点」を除いて全く同じであるとする。
この時、環境AとBではintの最大値は異なるが、
環境AとBで動作の異なるプログラムを作ることは出来ない。
よって、AとB両方の環境でintの最大値を返すプログラムは存在しない。
----異なる点----
環境Aのintの最大値はaであり、
環境Bのintの最大値はa-1である。
環境Bでは環境Aのaと同じ内部表現でNaNを表すが、
NaNの場合の動作は環境Aのaの時と全く同じである。
(つまり、動作は全く同じで意味付けのみ異なる)
..................................................................................................■
0310デフォルトの名無しさん
2009/09/29(火) 23:41:480311デフォルトの名無しさん
2009/09/29(火) 23:50:29「動作」とか「意味付け」とか俺用語が多すぎて意味不明
0312デフォルトの名無しさん
2009/09/30(水) 05:09:29implementation-defined valueはunspecified valueのうち処理系がドキュメントすべきもので、
unspecified valueはtrap representationにならないとC++03が参照するC99に書いてあるのですが。
0313デフォルトの名無しさん
2009/09/30(水) 12:59:53struct T {
enum { A = N + 1U };
static int f() { regturn g(+A); }
static int g(int x) { return T<A>::f(); }
static int g(unsigned x) { return N; }
static int g(long x) { return N; }
static int g(unsigned long x) { return N; }
};
int main() { return T<0>::f(); }
オーバーロードの解決のとこまだ読めてないから長いけど、implementation-definedなものに依存しないんのができた。
0314デフォルトの名無しさん
2009/09/30(水) 22:44:19たしかにそう書いてありますね。
(範囲外の値から型変換してトラップ表現にならないのならトラップ表現の意味が無い気がする)
int r;
unsigned i;
int main(){ while(--i)r=r<(int)i?i:r;return r; }
これで int の最大値が返るかな?
まあいずれにしろ環境依存な値が返るので
ルール違反ですが。
0315デフォルトの名無しさん
2009/09/30(水) 23:33:13結局は >>9 で終わってるスレ。
0316デフォルトの名無しさん
2009/09/30(水) 23:47:350317デフォルトの名無しさん
2009/10/01(木) 00:41:54>>316
過去ログ嫁。
0318デフォルトの名無しさん
2009/10/01(木) 00:44:48?
>>314の酷さに過去ログ関係ないだろ
0319デフォルトの名無しさん
2009/10/01(木) 01:02:18何がどう酷いのかさっぱり。
やっぱり過去ログを読んだ方が良い気がする。
0320デフォルトの名無しさん
2009/10/02(金) 04:21:430321デフォルトの名無しさん
2009/10/02(金) 22:40:05(3 & -1) == 1 なら 符号+絶対値表現
(3 & -1) == 2 なら 1の補数表現
(3 & -1) == 3 なら 2 の補数表現
負の数が、
1の補数表現の場合と、符号+絶対値表現の場合は、
int の最小値は -[int の最大値]
2の補数表現の場合は
int の最小値は -[int の最大値] または -[int の最大値]-1
2の補数表現の場合に、
このどちらになるかが調べられれば
int の最小値が得られる。
0322デフォルトの名無しさん
2009/10/02(金) 23:11:590323デフォルトの名無しさん
2009/10/02(金) 23:49:56符号+絶対値表現 1000...000 はトラップ表現
符号+絶対値表現 1000...000 はマイナスゼロ
1の補数表現 1111...111 はトラップ表現
1の補数表現 1111...111 はマイナスゼロ
2の補数表現 1000...000 はトラップ表現
2の補数表現 1000...000 は1000...001より1小さい数
規格書によるとこの6種類しか許されていないとある。
0324デフォルトの名無しさん
2009/10/02(金) 23:53:51????
0325デフォルトの名無しさん
2009/10/07(水) 00:33:35for (int n = 2 ; ; n++)
for ( int a = n ; a = a%2 ? 3*a+1 : a/2, a != 1 ; )
if (a == n)
return n;
}
0326デフォルトの名無しさん
2009/10/07(水) 22:57:33あえて断言しよう。
それは無限ループであると。
0327デフォルトの名無しさん
2009/11/05(木) 06:02:2594文字
0328デフォルトの名無しさん
2009/11/05(木) 22:41:532↑↑22300745198530623141535718272648361505980418
よりちょっと小さいくらい。
(↑↑ はパワータワー(テトレーション)の記号)
int a=9e99;int main(){return a--?9<<main():9;} // 46文字
こっちのが大きくて、
2↑↑9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003
よりちょっと小さいくらい。
0329デフォルトの名無しさん
2009/11/06(金) 02:51:2959文字
0330デフォルトの名無しさん
2009/11/06(金) 03:08:2557文字にしとく
0331デフォルトの名無しさん
2009/11/06(金) 21:21:41よりちょっと大きくて
2↑↑9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004
よりは小さい。
ちなみに、標準ライブラリなどの外部ライブラリや
外部ファイルのインクルードは禁止ですので、
powを使う場合はその定義も文字数に含めてください。
int pow(int a,int b){return b?a*pow(a,b-1):1;}
0332233
2009/12/19(土) 11:29:441のレスを参考に233を書き直してみた。これだとどれぐらいの大きさ?
struct Object {
Object *next;
virtual void f() {}
virtual Object *dup() { return this; }
Object **last_next(){if(next)return next->last_next();return &next;}
Object(){ next=(Object *)0;}
};
Object *o;
int a;
void IntegerGrow() { a<<=a<<a;}
struct ObjectGrow : Object { void f(){ Object *t=o->dup(); *(o->last_next())=t;} };
struct Loop : Object
{
void f(){ int *e,*p,*q,*x;
x=new int[a+1];e=x+a;
for(p=x;p<e;p++)*p=a;*p=-1;
for(;;){for(p=x;!*p;p++){
if(*p==-1)return;
for(q=x;q<p;q++){IntegerGrow();*q=a;}
(*p)--;next->f();}}}
Object *dup() { Loop *l=new Loop(); if(next)l->next=next->dup(); return l;}
};
int main()
{
Object *loop;o=new Loop();a=99;
for(int i=a;i--;){loop=o->dup();*(loop->last_next())=new ObjectGrow();loop->f();}
}
0333233
2009/12/19(土) 16:54:39struct Object {
Object *next;
virtual void f() {}
virtual Object *dup() { return this; }
Object **last_next(){if(next)return next->last_next();return &next;}
Object(){ next=(Object *)0;}
};
Object *o;
int a;
struct ObjectAndIntegerGrow : Object { void f(){ Object *t=o->dup(); *(o->last_next())=t; a=a<<a;} };
struct Loop : Object
{
void f(){ int *e,*p,*q,*x;
x=new int[a+1];e=x+a;
for(p=x;p<e;p++)*p=a;*p=-1;
for(;;){for(p=x;!*p;p++){
if(*p==-1)return;
for(q=x;q<p;q++)*q=a;
(*p)--;next->f();}}}
Object *dup() { Loop *l=new Loop(); if(next)l->next=next->dup(); return l;}
};
int main()
{
Object *loop;o=new Loop();a=99;
for(int i=a;i--;){loop=o->dup();*(loop->last_next())=new ObjectAndIntegerGrow();loop->f();}
return a;
}
0334デフォルトの名無しさん
2009/12/19(土) 22:02:58Loop :: f() の二重ループの中身って合ってます?
!*p の部分が1回も false にならずに
右端の -1 までたどりついて return しちゃうような気がするのですが。
0335デフォルトの名無しさん
2009/12/19(土) 22:26:34!*p の部分が1回も true にならないで無限ループ
の間違いでした。
>>233 のようにしたければ、
for(;;){
for(p=x;!*p;p++);
if(*p==-1)return;
for(q=x;q<p;q++)*q=a;
(*p)--;
next->f();
}
こうじゃないかと。
0337デフォルトの名無しさん
2009/12/19(土) 23:12:05o のチェーンの長さより a の方が大きく、
o のチェーンの長さ分 f を再帰コールしてるだけなので、
以下で良い気がする。
----------------
int a;
void f(int o){int *e,*p,*q,*x;
x=new int[a+1];e=x+a;
for(p=x;p<e;p++)*p=a;*p=-1;
for(;;){for(p=x;!*p;p++);
if(*p==-1)return;
for(q=x;q<p;q++)*q=a;
(*p)--;a<<=a;if(o)f(o-1);}}
int main()
{
a=99;
for(int i=a;i--;)f(a);
return a;
}
0338333
2009/12/19(土) 23:37:33メモリの大きさが実感しやすい形にしました。
0339333
2009/12/19(土) 23:41:150340デフォルトの名無しさん
2009/12/19(土) 23:59:34>>337 のメモリの大きさが見えにくく、
>>333 のメモリの大きさが見えにくく無い
というのが良く分からない。
どちらもとてつもなくたくさんのメモリを使うし、
使うメモリの量を調べることは、
ほとんど main() の戻り値を調べることに等しい。
というか、
チェーンが1個伸びることで、
f の再帰を意図的に1回増やすように作った訳では無いの?
loop->f() のコール前後で loop のチェーンの長さは不変なので、
f() の再帰数は loop のチェーンの長さになることは簡単にわかるのだけど。
0341333
2009/12/20(日) 00:08:54なんだか無い物のように感じてしまいます。
リストの形にすると実体が実感しやすいという、その程度のことです。
この場合、どちらも本質的に同じものであることは一応理解できます。
0342デフォルトの名無しさん
2009/12/20(日) 08:40:36>>333 に >>335 の修正を加えると、
>>233 よりはずいぶんと大きくなって、
>>233 の、n重ループ相当の巨大化操作をn回繰り返して出来た関数を
さらにループさせた感じでしょうか。
0343333
2009/12/21(月) 22:05:460344333
2009/12/22(火) 21:32:37>>335の修正を入れたプログラムがアッカーマン換算でどれくらいの大きさか教えてくらさい。
0345デフォルトの名無しさん
2009/12/22(火) 23:10:26この中に出てくる3変数アッカーマンもどきを
ループで回したくらいで,
下のより微妙に小さい位ではないかと。
int a(int b,int c=9,int d=9){return b+c&&d?a(b-!c,c?c-1:d,a(b,c,d-1)):d+9;}int b=99;int main(){return a(b--?main():9);} // 119
たぶんこの2つの数の間だと思う。
int a(int b,int c=9,int d=9){return b+c&&d?a(b-!c,c?c-1:d,a(b,c,d-1)):d+9;}int b=97;int main(){return a(b--?main():9);} // 119
int a(int b,int c=9,int d=9){return b+c&&d?a(b-!c,c?c-1:d,a(b,c,d-1)):d+9;}int b=98;int main(){return a(b--?main():9);} // 119
>>333 + >>335 で、o のLoopのチェーンが1個伸びるのと、
上の3変数アッカーマンもどきの一番左の引数b が1個増えるのが大体同じ位の効果。
0346333
2009/12/23(水) 09:05:08簡単なところから確認していっていいですか。
テーマはループと再帰、定数と自己複製ってところで。
0347デフォルトの名無しさん
2009/12/23(水) 09:09:21void f(int a) { if(a) { g() ; f(a-1) ; }}
void f(int a) { while(a--) g() ; }
0348デフォルトの名無しさん
2009/12/23(水) 09:15:48int add(a,b) { if(a) { return 1+add(a-1,b);} return b;}
int add(a,b) { while(a--) b++ ; return b; }
0349デフォルトの名無しさん
2009/12/23(水) 09:41:04勢いで書き始めちゃったけど、ちょっとまとめなおします。
しばしおまちを。
0350333
2009/12/23(水) 22:43:02ざっくりと疑問のポイントだけ書くと
(1)Loop :: f()の中の配列の長さがNならLoop :: f()の大きさは2変数アッカーマンA(N,x)と同じくらいの大きさになるんじゃないか?
(2)もしそうなら>>233の配列の大きさはN重ループと4重ループを使って、繰り返し大きくしているので
>>233自体の大きさは3変数アッカーマンのA(4,a,b)くらいになるんじゃないか?
の2点です。
どうでもいいけど、>>346で自己複製とか書いたけどただのコピーと自己複製の区別がついてませんでした。
すんませんw。
0351デフォルトの名無しさん
2009/12/23(水) 23:37:35(1) は YES.
(2) は NO.
fを関数,b,cをある定数とし、
f(x) ≒ a(b,c,x) である場合、
f をループさせた関数 f' は f'(x) ≒ a(b,c+1,x)
f を3重ループさせた関数 f''' は f'''(x) ≒ a(b,c+3,x)
>>233 の関数D は大まかには
D(x) ≒ a(x ,x) ≒ a(1,0,x) となり、
D(x) を3重ループさせて出来た関数は大まかに a(1,3,x) 位、
これをループさせで出来る a(1,4,x) よりは小さい。
0352333
2009/12/24(木) 20:26:36普通の数式ならごりごりっと展開していけば何とかなることが多いんですが、
3変数アッカーマンを展開しようとするとえらいことにw
なかなか手強いっす。
0353デフォルトの名無しさん
2009/12/24(木) 21:20:00int a(int b,int c=9,int d=9){return b+c&&d?a(b-!c,c?c-1:d,a(b,c,d-1)):d+9;}
a(b,c,0) = 9
a(0,0,D) = d+9
a(B,0,D) = a(b-1,d,a(b,0,d-1))
a(b,C,D) = a(b,c-1,a(b,c,d-1))
大文字の引数は1以上、小文字の引数は0以上の値とすると、
引数は上の4パターンのどれかになる。
4つめがアッカーマンの心臓部となる式である。
cを1以上の数の場合、f(x) = a(b,c-1,x) とおく。
a(b,c,0) = 9
a(b,c,1) = a(b,c-1,a(b,c,0)) = a(b,c-1,9) = f(9)
a(b,c,2) = a(b,c-1,a(b,c,1)) = a(b,c-1,f(9)) = f(f(9))
a(b,c,3) = f(f(f(9)))
a(b,c,4) = f(f(f(f(9))))
となる。
つまり、a(b,c,x) は a(b,c-1,x) をループさせて出来る関数になる。
0354デフォルトの名無しさん
2009/12/24(木) 21:42:34では次に1個目の引数bについて考えてみる。(とりあえずbを固定して考える)
3つ目の式の出番である。
a(3,c,x) を考える。
a(3,c,x) はcが大きくなればどんどん増大度が増えていく。
ところが、いくらcが大きくても、a(3,x,x) にはいずれ抜かれることになる。
(実際、xがc を超えれば、a(3,c,x) < a(3,x,x) となることがわかる)
a(3,x,x) でなくて、たとえば a(3,x,1) でも大した差はなく、
a(3,c,x) をいずれ抜くことになる。
つまり、a(3,x,1) は a(3,0,x) を固定回ループさせて作ったどんな関数よりも増大度が大きい。
a(4,0,x) を考えてみる。
式3によると、xが1以上の時、
a(4,0,x) = a(3,x,a(4,0,x-1)) ≧ a(3,x,9)
となるので、a(3,0,x) を固定回ループさせて作った関数よりも増大度が大きい。
0355デフォルトの名無しさん
2009/12/24(木) 21:44:56a(B,0,D) = a(b-1,d,1)
や
a(B,0,D) = a(b-1,d,d)
で十分なのだが、
4つ目の式となるべく共通化した方が文字数が減らせるので
a(B,0,D) = a(b-1,d,a(b,0,d-1))
となっている。
0356333
2009/12/25(金) 22:28:184変数はこれで良いですか?
A(0,0,0,d)=d+9
A(a,b,c,0)=A(a,b,c-1,1)
A(a,b,0,d)=A(a,b-1,d,d)
A(a,0,0,d)=A(a-1,d,d,d)
A(a,b,c,d)=A(a,b,c-1,A(a,b,c,d-1))
0357デフォルトの名無しさん
2009/12/26(土) 08:57:32良いと思います。
0358333
2009/12/27(日) 00:20:39ありがとうです。
>>353の展開の仕方がわかりやすかったです。
きれいな構造ですね。
a(b,x,y)=f(x,y)とおいてf(N,1)を展開すると
f(N,1)=f(N-1,f(N-2,f(N-3,f(N-4,...f(0,1)))...)
となるようでこれもまたきれいな構造です。
この構造をどう解釈すればいいのかはよくわからないですが…
0359333
2010/01/14(木) 20:08:38int *dup(int *x){
int *p,*q;
p=x;while(*p++!=-1);
q=new int[p-x];p=q;while(*x!=-1)*p++=*x++;*p=*x;
return q;
}
void f(int *x){
int *y;
a<<=a<<a;
if(*x==0){
y=x;while(!*y)*y++=a;if(*y==-1)return;
(*y)--;f(x);
}
else{
for(int i=a;i--;){
*y=dup(x);y[0]--;f(y);
}
}
}
int main()
{
int *x;
for(int i=a;i--;)
{
x=new int[a+1];
for(int j=0;j<a;j++)x[i]=a;x[a]=-1;
f(x);
}
return a;
}
0360デフォルトの名無しさん
2010/01/14(木) 21:35:17おっと、一気に大きくなりましたね。
>>259 の 138文字のよりも大きくて、
138文字のを 9e99 回ループさせたくらいでしょうか。
--------
ちなみに、138文字のはもうちょっと縮んで131文字になりました。
int a=9;struct b{int c,d;b*e;void operator*(){b f={c-!d,d?d-1:++a,e},g=f;g.e=&f;if(e)**e;if(c+d)*g;}}c={a};int main(){*c;return a;} // 131文字
0361デフォルトの名無しさん
2010/01/17(日) 02:09:19がんばって >>359 を極限まで縮めてみました。
>>360 とほとんど同じ値になるのですが、
3文字届きませんでした。
( >>360 も限界と思ったところから 7文字縮めたので、さらに縮められるかもしれません)
>>192 もそうですが、
だいたい同じ値をまったく異なる発想で作って、
だいたい同じ文字数になっているのがおもしろいです。
// 134
int a;
struct b{
int c[9],*d;
void operator*(){
b e=*this;
d=e.c+9;
for(;--*--d<0?*d=++a,d!=e.c:(*e,*e,0););
}
}c={9};
int main(){
*c;
return a;
}
0362デフォルトの名無しさん
2010/01/17(日) 02:18:30int c[9],*d;
じゃなくて
int*d,c[9];
にしたら1文字縮まりました。
あと2文字。
0363デフォルトの名無しさん
2010/01/17(日) 02:25:55取り消します。
>>362 だと
}c={9};
のところを
}c={0,9};
にする必要があるので、逆に長くなっちゃいますね。
0364デフォルトの名無しさん
2010/01/18(月) 00:38:048文字縮めました。
これで >>360 を抜いてこのクラス最短に。
// 126文字
int a;
struct b{
int c[9],*d;
void operator*(){
b e=*this;
for(d=e.c+9;d>e.c;--*--d>0?*e,0:*d=++a);
}
}c={9};
int main(){
*c;
return a;
}
0365デフォルトの名無しさん
2010/01/18(月) 21:16:57int a;struct b{int c[9],*d;void e(){b f=*this;for(d=f.c+9;d>f.c;--*--d>0?f.e(),0:*d=++a);}}c={9};int main(){c.e();return a;} // 124
>>192 を2文字縮めて76文字
>>83 の77文字を抜いてこのクラス最短に
int a,b[9]={9},*c=b;int main(){for(;c>=b;--*c>0?c=b+8,0:*c--=++a);return a;} // 76
0366デフォルトの名無しさん
2010/02/25(木) 07:34:47>>83 の77文字のが縮まって64文字に
なりました。
0367デフォルトの名無しさん
2010/06/05(土) 11:34:17短い順にすべての文字列の組み合わせを順番に全部インタプリタで食わせてみて
同じ文字数で最も大きい値を返すプログラムになってるものを採用すればいいんじゃね?
と思ったが停止判定ができないから不可能なのか。
0368デフォルトの名無しさん
2010/06/08(火) 19:34:56ステップ数====>戻り値
はそれほど大きな関数には成り得ないから
ステップ数で制限しちゃうと全然大きくならないし。
■ このスレッドは過去ログ倉庫に格納されています