■■C++で大きな数を作るスレ■■
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2009/03/24(火) 20:27:50以下のプロトタイプの関数の戻り値で出来るだけ大きな数を返すものを作りましょう。
int main();
●ルール
最大でも1スレに収まる範囲とし、
1スレで完結したプログラムとしてください。
文字数も書いてください
●言語仕様
言語は C++ 2003 準拠とします
int と float は十分な精度があるとします
メモリは十分にあるとします
実行時間は問わないこととします
機種依存、コンパイラ依存の値が返るプログラムは不可
プリプロセッサ、ライブラリの使用は不可
●文字数カウントルール
動作上不要なコメント、スペース、タブ、改行は文字数に含めない
言語上必要なスペース、タブ、改行はカウントする(改行は1文字とする)
0113デフォルトの名無しさん
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を強化してったほうがでかいだろうけどね
■ このスレッドは過去ログ倉庫に格納されています