5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

七行プログラミング

1 :デフォルトの名無しさん:2001/03/10(土) 09:09
海外のプログラマーが、たったの七行足らずで
DVDのプロテクトを解除するプログラムを作成!
我々も負けてはいられません!

ルール:七行なら言語は問いません。では、どうぞ!

688 :デフォルトの名無しさん:02/03/04 00:41
#include <stdio.h>
#include <string.h>
void puttab(FILE *f,int t){while(t-->0)fputc('\t',f);}void i(char *f){FILE *s,
*o;char *p,of[256];int c,in=0;strcpy(of, f);p=of;while(*(p++)!='.');strcpy(--p,
"_i.c");s=fopen(f,"r");o=fopen(of,"w");if(s==NULL||of==NULL){fprintf(stderr,
"Error:File not found.\n");fclose(s);fclose(o);return;}while((c=fgetc(s))!=EOF)
{switch(c){case'{':fprintf(o,"{\n");puttab(o,++in);break;case'}':fseek(o,-1,
SEEK_CUR);fprintf(o,"}\n");puttab(o,--in);break;case';':fprintf(o,";\n");puttab
(o,in);break;case'\n':case'\t':break;default:fprintf(o,"%c",c);break;}}fclose(s)
;fclose(o);}int main(int a,char *v[]){if(a<=1){
fprintf(stderr,"usage :exec <sorcefile.c>\n");return 0;}i(v[1]);return 0;}

もう出てたッヶ?
自動インデント。改行。
for(;;)の;まで改行しちゃうけど手動でやるよりマシ・・。(caseもね)
7行には遠いけどまぁ、役立つかもしれないってことで。
(エラー出力とか#include消せばいけるか)

689 :38:02/03/04 20:28
>>688
一応、出来はアレだけど俺が作った126を>>138氏が改造してくれた版が。

あと1週間でこのスレ一周年か。懐かしいなぁ。

690 :デフォルトの名無しさん:02/03/04 21:32
>>2
はどういう意味ですか?
java.io.BufferedInputStream@2a9835
と出るだけですが

691 :デフォルトの名無しさん:02/03/05 19:22
>>690
その場の思いつきで書いてるんだろうから突っ込むな(笑)

7行テトリス希望

692 :bakache:02/03/07 00:44
#include <winsock2.h>
#include <io.h>
void main(){WSADATA w;WSAStartup(257,&w);{SOCKADDR_IN a={2,20480};SOCKADDR*q=(
SOCKADDR*)&a;SOCKET l=socket(2,1,0),s;bind(l,q,16);listen(l,5);for(;;){char b[
4096],*p=b,*t="HTTP/1.0 200\r\n\r\n";int n=16;int r=recv((s=accept(l,q,&n)),b,
4096,0),i=0,f;while(i++<r)if(*p++<=' '){char*u=p;while(i++<r)if(*p++<=' '){*--p
=0;send(s,t,16,0);*--u=':';*--u='C';f=open(u,32768);while((r=read(f,b,4096))>0)
send(s,b,r,0);close(f);}break;}closesocket(s);}closesocket(l);}WSACleanup();}

VC+Windows専用超簡易HTTP鯖...後1行けずれないっす。


693 :デフォルトの名無しさん:02/03/07 17:32
27行で良ければぷよぷよがあるよ。

694 :デフォルトの名無しさん:02/03/07 20:07
>>693
自慢したいなら別スレへ。
ココは7行スレなので、7行へ到達する意思がないならスレ違いです。

695 :*nix厨房:02/03/08 16:12
>>692
ちょっとだけ短く
f=open(u,32768);while((r=read(f,b,4096))>0)send(s,b,r,0);

for(f=open(u,32768);read(f,b,1)>0;send(s,b,1,0));
Winはよくワカンナイっす

696 :comp:02/03/08 19:42
Range Encoder と適応的モデル
g++ 2.95.3 で動作確認。16MB近くのファイルまで圧縮可能。
(Borland C++ ではコンパイル不可)
圧縮データはエンディアンの異なるシステムでは非互換。
符号化: exec E infile outfile 復号: exec D infile outfile

モデル部と符号化部に分かれている上に、8行もあるのが・・・

// main.cpp (モデル部)
#include "range.h"
L u,i;main(int,char **V){L b=256,a[b],l,z=ios::binary;fstream g(V[2],ios::in|z)
,o(V[3],ios::out|z);g.seekg(0,ios::end);C s[l=g.tellg()];g.seekg(0,ios::beg);
g.read(s,l);g.close();R r,x;while(u<b)a[u++]=1;if(*V[1]-68){C t[l*2];r.p=t;
while(i<l){for(x.w=b=0;b<s[i];)x.w+=a[b++];x.r=a[s[i++]]++;x.e=u++;r.T(x);}
r.F();o.write(&l,4);o.write(t,r.o);}else{C t[l=*(L *)s];r.D(s);while(i<l){x.e=
u++;L v=r.V(x),w=b=0;for(;v>=w;w+=a[b++]);t[i++]=--b;x.w=w-(x.r=a[b]++);r.S(x);
}o.write(t,l);}}

// range.h (符号化部)
#include <fstream>
typedef unsigned long L;typedef unsigned char C;class R{public:L w,r,e,i,o;C
*g,*p;R(){r=-1;w=o=0;};L D(C *n){g=n+(i=4);w=g[0]<<24|g[1]<<16|g[2]<<8|g[3];};
L V(R s){while(r<1<<24)w=w<<8|g[i++],r<<=8;return w/(r/=s.e);};L S(R s){w-=r
*s.w;r*=s.r;};L F(){p[o++]=w>>24;p[o++]=w>>16;p[o++]=w>>8;p[o++]=w;};L T(R s){
L t=r/s.e,l=w;w+=s.w*t;r=s.r*t;if(l>w){for(t=o-1;t>0,p[t]==255;p[t--]++);
p[t]++;}while(r<1<<24)p[o++]=w>>24,w<<=8,r<<=8;};};


697 :tara:02/03/09 04:23
>>692
どのみち実行されないことを考えると
closesocket(l);とWSACleanup();
は削除してしまっても良いかも。


698 :デフォルトの名無しさん:02/03/09 12:48
気体上げ
>>696
圧縮と展開にわけると、7行になりそうか?


699 :comp:02/03/09 14:49
=696
class を使うのをやめて、一本にしてみた。使い方は同じ。
現在11行。10行にはなりそうだが・・・。

#include <fstream>
typedef unsigned long L;typedef unsigned char C;L W=0,A=-1,E,O=0,u,i,b=256,a[b]
,l=ios::binary,X,Y,T,K;main(int,char **V){fstream g(V[2],ios::in|l),o(V[3],
ios::out|l);g.seekg(0,ios::end);C s[l=g.tellg()];g.seekg(0,ios::beg);g.read(s,l
);g.close();while(u<b)a[u++]=1;if(*V[1]-68){C t[l*2];while(i<l){for(X=b=0;b<s[i
];)X+=a[b++];Y=a[s[i++]]++;T=A/u++;K=W;W+=X*T;A=Y*T;if(K>W){for(T=O-1;T>0,t[O]
==255;t[T--]++);t[T]++;}while(A<1<<24)t[O++]=W>>24,W<<=8,A<<=8;}t[O++]=W>>24;t[
O++]=W>>16;t[O++]=W>>8;t[O++]=W;o.write(&l,4);o.write(t,O);}else{C t[l=*(L *)s]
;O=8;W=s[4]<<24|s[5]<<16|s[6]<<8|s[7];while(i<l){while(A<1<<24)W=W<<8|s[O++],A
<<=8;for(T=W/(A/=u++),K=b=0;T>=K;K+=a[b++]);t[i++]=--b;X=K-(Y=a[b]++);W-=A*X;A
*=Y;}o.write(t,l);}}


700 :デフォルトの名無しさん:02/03/09 14:57
昔雑誌で「1行プログラミング」ってあったよね。
なんかなつかし

701 :comp:02/03/09 14:59
>>698

サンクス。
今の時点なら、符号化と復号ルーチンを分けると、7行以内になる。
でも、ここまで来たからには、両方で7行におさめたい。
符号化が復号の2倍長いのがイタイ・・・。



702 :デフォルトの名無しさん:02/03/09 15:26
>>699
gcc拡張つかいまくり?

703 :comp:02/03/09 15:32
>>702
使いまくりです。
言語は何でもありってことなので、g++言語仕様でもよいのでは?ということでお願いします。
今、10行になりました。


704 :comp:02/03/09 15:40
うわー、失礼!
コンパイルエラーのまま上げてました。直してます。
鬱だ。


705 :comp:02/03/09 16:14
修正版。
今日はここまでにします。

#include <fstream>
typedef unsigned long L;typedef unsigned char C;L W,A=-1,E,O,u,i,l=ios::binary,
X,Y,T,K;main(int,char **V){fstream g(V[2],ios::in|l),o(V[3],ios::out|l);L b=256
,a[b];g.seekg(0,ios::end);C s[l=g.tellg()];g.seekg(0,ios::beg);for(g.read(s,l);
u<b;)a[u++]=1;if(*V[1]-68){C t[l*2];while(i<l){for(X=b=0;b<s[i];)X+=a[b++];Y=a[
s[i++]]++;T=A/u++;K=W;W+=X*T;if(K>W){for(K=O-1;K,t[K]==255;t[K--]++);t[K]++;}
for(A=Y*T;A<1<<24;A<<=8)t[O++]=W>>24,W<<=8;}t[O++]=W>>24;t[O++]=W>>16;t[O++]=W
>>8;t[O++]=W;o.write(&l,4);o.write(t,O);}else{C t[l=*(L *)s];W=s[4]<<24|s[5]<<
16|s[6]<<8|s[7];for(O=8;i<l;A*=Y){for(K=b=0;A<1<<24;A<<=8)W=W<<8|s[O++];for(T=W
/(A/=u++);T>=K;K+=a[b++]);t[i++]=--b;X=K-(Y=a[b]++);W-=A*X;}o.write(t,l);}}


706 :tara:02/03/09 17:49
>>692

POSTリクエストには応えられないけど、GETリクエストのみ対応で良いなら
これで動く……はず、です。

#include <winsock2.h>
#include <io.h>
void main(){WSADATA w;WSAStartup(257,&w);{SOCKADDR_IN a={2,20480};SOCKADDR*q=(
SOCKADDR*)&a;SOCKET l=socket(2,1,0),s;bind(l,q,16);listen(l,5);for(;;){char b[
4096],*p=b,*t="HTTP/1.0 200\r\n\r\n",*u;int n=16;int r=recv((s=accept(l,q,&n)),
b,4096,0),i=0,f;u=(p+=5);while(i++<r)if(*p++<=' '){*--p=0;send(s,t,16,0);f=open
(u,32768);while((r=read(f,b,4096))>0)send(s,b,r,0);close(f);}closesocket(s);}}}

ちなみに、HTTPサーバー上のルートディレクトリは、実行ファイルのあるディレクトリになります。


707 :デフォルトの名無しさん:02/03/09 18:48
>705
面白そうだがgcc専用じゃコンパイルすら出来ないんだろうな

708 :デフォルトの名無しさん:02/03/09 19:27
mingwで簡単にコンパイルできるからそれでいいじゃん

709 :673:02/03/09 20:31
>>705
スゲェ。そこまで縮むとは。
参考資料:http://www.tomozo.ne.jp/yamazaki/download/doc_basic_compression.htm

繰上げのところが長くて困ってると思うんだけど
0xFFの数を数えて繰り上げるようにすれば
ちょっと縮むかもしれない。
あと、出力を4バイトためてDWORD出力するようにすれば
ロードの部分の無駄なシフトが要らなくなると思う。

710 :デフォルトの名無しさん:02/03/09 21:38
>705
せっかく凄いんだから、標準C++で挑戦すればいいのに。
新しい環境用意してまでコンパイルする奴はあまりいないしね。俺みたいに(笑
まぁでもそこらへんは前に話し尽くされているとおり705さんの自由っすね

711 :デフォルトの名無しさん:02/03/09 21:59
>>710
それは7行達成してからでもいいんじゃないか?

712 :comp:02/03/10 00:26
アルゴリズムを変えないと、これ以上は難しいです。
それでも、先のバージョンから40文字ほど縮めました。
673 さんに触発されて、自分のコードを書き直して始めたのですが、随分勉強になりました。


#include <fstream>
typedef unsigned long L;typedef unsigned char C;L b=256,a[256],W,A=-1,O,u,i,T,
K,l=ios::binary;main(int,char**V){fstream g(V[2],ios::in|l),o(V[3],ios::out|l)
;g.seekg(0,ios::end);C s[l=g.tellg()],c;g.seekg(0,ios::beg);for(g.read(s,l);u<
b;)a[u++]=1;if(*V[1]-68){C t[l*2];for(o.write(&l,4);i<l;K=W){for(T=b=0;b<s[i];
)T+=a[b++];W+=A/u*T;if(K>W)for(K=O;--K,!++t[K];);for(A=A/u++*a[s[i++]]++;A<1<<
24;A<<=8)t[O++]=W>>24,W<<=8;}o.write(t,O);o<<(c=W>>24)<<(c=W>>16)<<(c=W>>8)<<(
c=W);}else{C t[l=*(L*)s];W=s[4]<<24|s[5]<<16|s[6]<<8|s[7];for(O=8;i<l;A*=a[b]
++){for(K=b=0;A<1<<24;A<<=8)W=W<<8|s[O++];for(T=W/(A/=u++);T>=K;K+=a[b++]);t[i
++]=--b;W-=A*(K-a[b]);}o.write(t,l);}}


713 :デフォルトの名無しさん:02/03/10 01:03
>>712
unsigned long の long と ios::binary はなくても動いた。
cygwin + gcc 2.95.3_5

714 :comp:02/03/10 22:32
>>713
32bit 環境ですから long はいらないようですね。
ios::binary はどうなんでしょうか? とりあえず外してみました。

さらに、無理だと思われたそれ以外の個所も縮みました。
そのため、とうとう9行達成ができました。
そして、それによってさらにもう少し減るかもしれません。


#include <fstream>
typedef unsigned L;typedef unsigned char C;L W,O,u,i,l,T,K;main(int,char**V){L
b=256,a[b],A=-1;fstream g(V[2],ios::in),o(V[3],ios::out);g.seekg(0,ios::end);C
s[l=g.tellg()],t[l*2];g.seekg(0,ios::beg);for(g.read(s,l);u<b;)a[u++]=1;if(*V[
1]-68){for(o.write(&l,4);i<l;K=W){for(b=0;b<s[i];W+=A/u*a[b++]);if(K>W)for(K=O
;--K,!++t[K];);for(A=A/u++*a[s[i++]]++;A<1<<24;A<<=8)t[O++]=W>>24,W<<=8;}o.
write(t,O);o<<C(W>>24)<<C(W>>16)<<C(W>>8)<<C(W);}else{C t[l=*(L*)s];for(W=s[4]
<<24|s[5]<<16|s[6]<<8|s[O=7];i<l;A*=a[b]++){for(K=b=0;A<1<<24;A<<=8)W=W<<8|s[
++O];for(T=W/(A/=u++);T>=K;K+=a[b++]);W-=A*(K-a[t[i++]=--b]);}o.write(t,l);}}


715 :デフォルトの名無しさん:02/03/10 23:10
>>714
うはぁ、コリャ気味悪い

716 :comp:02/03/10 23:17
変数Tを消すことができました。
iも消せそうですが、うーん、無理かな。


717 :comp:02/03/11 00:36
>>715
まったくです。自分でも理解不能になってきました。
fstream を ifstream と ofstream に分けました。


#include <fstream>
typedef unsigned L;typedef unsigned char C;L W,O,u,i,l,A=-1;main(int,char**V){
L b=256,a[b],K;ifstream g(V[2]);g.seekg(0,ios::end);C s[l=g.tellg()],t[l*2];g.
seekg(0,ios::beg);for(g.read(s,l);u<b;)a[u++]=1;ofstream o(V[3]);if(*V[1]-68){
for(o.write(&l,4);i<l;K=W){for(b=0;b<s[i];W+=A/u*a[b++]);if(K>W)for(K=O;!++t[
--K];);for(A=A/u++*a[s[i++]]++;A<1<<24;A<<=8)t[O++]=W>>24,W<<=8;}o.write(t,O);
o<<C(W>>24)<<C(W>>16)<<C(W>>8)<<C(W);}else{C t[l=*(L*)s];for(W=s[4]<<24|s[5]<<
16|s[6]<<8|s[O=7];i<l;A*=a[b]++){for(K=b=0;A<1<<24;A<<=8)W=W<<8|s[++O];for(A/=
u++;W/A>=K;K+=a[b++]);W-=A*(K-a[t[i++]=--b]);}o.write(t,l);}}


718 :デフォルトの名無しさん:02/03/11 00:50
main(int,char**V)のintはLに変えてもOKだな
あと、エンディアン変換のところ、デコード側で工夫すれば
変換しないでそのままストアできそうだから、縮むかも

719 :comp:02/03/11 01:04
>>718
> intはLに
あ、そうですね。ありがとうございます。

しかし、エンディアン変換とはどこのことでしょうか。
o<<C(W>>24)<<C(W>>16)<<C(W>>8)<<C(W);
でしょうか。
それとも、エンコード時のt[0]からt[3]を整数でストアして、
デコードのW=s[4]<<24... をたとえば W=*(L*)&s[4] にするということですか?

何にしてもそこら辺はやはりネックですね、どうしたもんでしょうか。
#この世にビッグエンディアンしかなければ・・・

720 :comp:02/03/11 01:19
あ、今気付いたんですが、
g.seekg(0,ios::beg); の ios::beg はいらないですね。


721 :デフォルトの名無しさん:02/03/11 01:43
>o<<C(W>>24)<<C(W>>16)<<C(W>>8)<<C(W);
ここ。んで、デコード側は4バイトごとに読み込んで、
右シフトしながらデコードバッファに入れると。

キャスト連発が無駄にしか見えないんで

722 :デフォルトの名無しさん:02/03/11 01:48
正直、このスレ見た後にプログラム組もうとすると、
感覚おかしくなってめちゃコード書きにくくなります(w

723 :comp:02/03/11 01:55
なんとなくあげ

>>721
符号語の読み書きをすべて4バイト単位に行うと、・・・可能でしょうかね。
ふむ。そうすると、s の読み込みも、逐次にすることもできそうですね。
そうなると、長さの算出(tellg)もいらなくなりますね。

うーむ。全体の設計、特にファイル入出力を見直してみます。

724 :comp:02/03/11 02:43
tellg 近辺を削除できたので、37バイト縮まりました。
本当に、7行いけるかもしれませんねぇ。嘘みたいだ。
4バイト入出力は、しかし、意外と難しそうです。

#include <fstream>
typedef unsigned L;typedef unsigned char C;L W,O,u,i,l,R=-1,K;main(L,char**V){
L b=256,a[b],R=-1,c;C*t=new C[1<<24];ifstream g(V[2]);ofstream o(V[3]);while(u
<b)a[u++]=1;if(*V[1]-68){for(;(c=g.get())<256;K=W,l++){for(b=0;b<c;W+=R/u*a[b
++]);if(K>W)for(K=O;!++t[--K];);for(R=R/u++*a[c]++;R<1<<24;R<<=8)t[O++]=W>>24,
W<<=8;}o.write(&l,4);o.write(t,O);o<<C(W>>24)<<C(W>>16)<<C(W>>8)<<C(W);}else{g
.read(&l,4);g.read(t,4);for(W=*t<<24|t[1]<<16|t[2]<<8|t[3];i<l;R*=a[b]++){for(
K=b=0;R<1<<24;R<<=8,O++)W=W<<8|g.get();for(R/=u++;W/R>=K;K+=a[b++]);W-=R*(K-a[
t[i++]=--b]);}o.write(t,l);}}


725 :comp:02/03/11 02:58
8行目の O++ は要りません。
それから、変数 l も消せました。

もう寝ます・・・

726 :デフォルトの名無しさん:02/03/11 03:49
>>724 R*=a[b]++
バグ。
1回目でa[256]を参照することになる

727 :デフォルトの名無しさん:02/03/11 04:23
#include <fstream>
typedef unsigned char C;unsigned W,O,u=256,i,l,K,b,a[256],R=-1;main(int,char**V
){C*t=new C[1<<24];ifstream g(V[2]);ofstream o(V[3]);if(*V[1]-68){for(;(i=g.get
())<256;K=W,l++){for(b=0;b<i;W+=R/u*(a[b++]+1));if(K>W)for(K=O;!++t[--K];);for(
R=R/u++*(1+a[i]++);R<1<<24;R<<=8)t[O++]=W>>24,W<<=8;}o.write(&l,4);o.write(t,O)
;o<<C(W>>24)<<C(W>>16)<<C(W>>8)<<C(W);}else{g.read(&l,4);g.read(t,4);for(W=*t<<
24|t[1]<<16|t[2]<<8|t[3];i<l;R*=++a[b]){for(K=b=0;R<1<<24;R<<=8,O++)W=W<<8|g.
get();for(R/=u++;W/R>=K;K+=a[b++]+1);W-=R*(K-a[t[i++]=--b]-1);}o.write(t,l);}}

8行まで縮みました

728 :デフォルトの名無しさん:02/03/11 04:37
#include <fstream>
typedef unsigned char C;unsigned W,O,u=256,i,l,K,b,a[256],R=-1;main(int,char**V
){C*t=new C[1<<24];ifstream g(V[2]);ofstream o(V[3]);if(*V[1]-68){for(;(i=g.get
())<256;K=W,l++){for(b=0;b<i;W+=R/u*(a[b++]+1));if(K>W)for(K=O;!++t[--K];);for(
R=R/u++*++a[i];R<1<<24;R<<=8)t[O++]=W>>24,W<<=8;}o.write(&l,4);o.write(t,O);o<<
C(W>>24)<<C(W>>16)<<C(W>>8)<<C(W);}else{g.read(&l,4);g.read(t,4);for(W=*t<<24|t
[1]<<16|t[2]<<8|t[3];i<l;R*=++a[b]){for(K=b=0;R<1<<24;R<<=8)W=W<<8|g.get();for(
R/=u++;W/R>=K;K+=a[b++]+1);W-=R*(K-a[t[i++]=--b]-1);}o.write(t,l);}}

あと69キャラクタですね

729 :comp:02/03/11 19:07
>>726
エンコード側は初期化していますし、デコード側も問題ないはずですが・・・

>>727
頻度を0で初期化して、計算時に+1するのは考えていたのですが、実装に手間取っていました。
先を越されてしまいましたね。さすがです。

というわけで、仕様を変更して、標準入出力を使うようにしました。
あと22−1文字です。
% exec < infile > outfile


#include <iostream>
typedef unsigned char C;unsigned W,O,u=256,i,l,K,b,a[256],R=~0,y=1<<24,x=u;main
(int,char**V){C*t=new C[y];if(*V[1]-69){cin>>O;cin.read(t,5);for(W=t[1]*y|t[2]
<<16|t[3]*x|t[4];l<O;R*=++a[b]){for(K=b=0;R<y;R*=x)W=W*x|cin.get();for(R/=u++;W
/R>=K;K+=a[b++]+1);W-=R*(K-a[t[l++]=--b]-1);}}else{for(;~(i=cin.get());K=W,l++)
{for(b=0;b<i;W+=R/u*(a[b++]+1));if(K>W)for(K=O;!++t[--K];);for(R=R/u++*++a[i];R
<y;R*=x)t[O++]=W/y,W*=x;}cout<<l<<C(0);t[O++]=W/y;t[O++]=W>>16;t[O++]=W/x;t[O++
]=W;}cout.write(t,O);}

730 :デフォルトの名無しさん:02/03/11 19:25
>>726 エンコード側は初期化していますし、デコード側も問題ないはずですが・・・
デコード側で問題がある。


731 :730:02/03/11 19:29
新しい版では修正されてるようですね
char a[256]で確保して、a[256]を参照していた

732 :comp:02/03/11 19:44
>>731
さっぱりわかりません・・・。
デコード側2個目の for で K=b=0 してありますし、
データが正しければその後、b に 256 が入ることはないと思うのですが・・・。
私は、何か勘違いしているんでしょうか?

733 :730:02/03/11 20:00
>>732
スマソ激しく勘違いしてました。
出直してきます

734 :comp:02/03/11 20:51
>>733
気にしないでください。
後21文字、頑張りましょう。

735 :デフォルトの名無しさん:02/03/11 22:15
#include <iostream>
typedef char C;unsigned W,O,u=256,i,l,K,b,a[256],R=~0,y=1<<24,x=u;main(int,C**V
){C*t=new C[y];if(*V[1]-69){cin>>O;cin.read(t,5);for(W=t[1]*y|t[2]<<16|t[3]*x|t
[4];l<O;R*=++a[b]){for(K=b=0;R<y;R*=x)W=W*x|cin.get();for(R/=u++;W/R>=K;K+=a[b
++]+1);W-=R*(K-a[t[l++]=--b]-1);}}else{for(;~(i=cin.get());K=W,l++){for(b=0;b<i
;W+=R/u*(a[b++]+1));if(K>W)for(K=O;!++t[--K];);for(R=R/u++*++a[i];R<y;R*=x)t[O
++]=W/y,W*=x;}cout<<l<<C(0);t[O++]=W/y;t[O++]=W>>16;t[O++]=W/x;t[O++]=W;}cout.
write(t,O);}

あと12文字。そろそろ限界近いかも

736 :673:02/03/11 22:19
超スゲエ

褒め称えage

737 :デフォルトの名無しさん:02/03/11 22:29
#include <iostream>
unsigned W,O,u=256,i,l,K,b,a[256],R=~0,y=1<<24,x=u;main(int,char**V){char*t=new
char[y];if(*V[1]-69){cin>>O;cin.read(t,5);for(W=t[1]*y|t[2]<<16|t[3]*x|t[4];l<O
;R*=++a[b]){for(K=b=0;R<y;R*=x)W=W*x|cin.get();for(R/=u++;W/R>=K;K+=a[b++]+1);W
-=R*(K-a[t[l++]=--b]-1);}}else{for(;~(i=cin.get());K=W,l++){for(b=0;b<i;W+=R/u*
(a[b++]+1));if(K>W)for(K=O;!++t[--K];);for(R=R/u++*++a[i];R<y;R*=x)t[O++]=W/y,W
*=x;}cout<<l<<' ';t[O++]=W/y;t[O++]=W>>16;t[O++]=W/x;t[O++]=W;}cout.write(t,O);}

7行到達&頭が割れそう

738 :デフォルトの名無しさん:02/03/11 22:31
あ、一文字オーバーのカウントかな?
最後は改行無しでスマソ

739 :デフォルトの名無しさん:02/03/11 22:36
続いてたんだなここ・・・
httpdも算術符号もすごすぎ。


740 :デフォルトの名無しさん:02/03/11 22:42
#include <iostream>
unsigned W,O,u=256,i,l,K,b,a[256],R=~0,y=1<<24,x=u;main(int,char**V){char*t=new
char[y];if(*V[1]-69){cin>>O;cin.read(t,5);for(W=t[1]*y|t[2]<<16|t[3]*x|t[4];l<O
;R*=a[b]){for(K=b=0;R<y;R*=x)W=W*x|cin.get();for(R/=u++;W/R>=K;K+=a[b++]+1);W-=
R*(K-++a[t[l++]=--b]);}}else{for(;~(i=cin.get());K=W,l++){for(b=0;b<i;W+=R/u*(a
[b++]+1));if(K>W)for(K=O;!++t[--K];);for(R=R/u++*++a[i];R<y;R*=x)t[O++]=W/y,W*=
x;}cout<<l<<' ';t[O++]=W/y;t[O++]=W>>16;t[O++]=W/x;t[O++]=W;}cout.write(t,O);}

正真正銘到達age
です

741 :デフォルトの名無しさん:02/03/11 22:47
って、ダメだ。テキストしか確認してなかった

742 :デフォルトの名無しさん:02/03/11 22:50
737さん凄すぎ。縮むもんだねえ。
次のお題は Mersenne Twister でどうでしょ


743 :デフォルトの名無しさん:02/03/11 23:00
>>742
ゴメン、737はダメです。
バイナリに適応できません。

現在あと1文字で修正版ができるはずです

744 :comp:02/03/11 23:08
鈴木氏の証人喚問をTVで見ていたら、またもや抜かされ・・・。

>>740
セパレータを cout<<l<<' ' から cout<<l<<-1 とすると、
1文字減らせます。
もちろん、デコーダーでは、cin.read(t,6) などとしていきます。


745 :デフォルトの名無しさん:02/03/11 23:19
>>744 なるほどぉ出来ました

#include <iostream>
unsigned W,O,u=256,i,l,K,b,a[256],R=~0,y=1<<24,x=u;main(int,char**V){unsigned
char t[y];if(*V[1]-69){cin>>O;cin.read(t,6);for(W=t[2]*y|t[3]<<16|t[4]*x|t[5];l
<O;R*=a[b]){for(K=b=0;R<y;R*=x)W=W*x|cin.get();for(R/=u++;W/R>=K;K+=a[b++]+1);W
-=R*(K-++a[t[l++]=--b]);}}else{for(;~(i=cin.get());K=W,l++){for(b=0;b<i;W+=R/u*
(a[b++]+1));if(K>W)for(K=O;!++t[--K];);for(R=R/u++*++a[i];R<y;R*=x)t[O++]=W/y,W
*=x;}cout<<l<<-1;t[O++]=W/y;t[O++]=W>>16;t[O++]=W/x;t[O++]=W;}cout.write(t,O);}

ってことで7行です。
ロジックを縮めまくったcompさんに拍手

746 :comp:02/03/11 23:28
記念上げ!

>>745
とんでもない。最後の大詰めに貴方の大活躍があったならばこそです。


747 :デフォルトの名無しさん:02/03/12 00:29
>>742
MTは基幹に関わる定数の数&桁が多いんで、
コード部分でやたらと稼がないとダメ&理論を熟知している人がすくないだろうから、
難易度高いね、ものすごく。

748 :デフォルトの名無しさん:02/03/12 01:32
難易度高すぎるかな。

749 :デフォルトの名無しさん:02/03/12 02:25
MTできちゃった
#include<stdio.h>
#define T(u,v) ((((u)&0x8000000|(v)&0x7FFFFFFF)>>1)^((v)&1?0x9908b0df:0))
typedef unsigned long L;unsigned long N=623,M=397,K=227,m[624],i;x(L s){m[0]=s;
for(i=1;i<N;i++)m[i]=69069*m[i-1];}ns(){for(i=0;i<K;i++)m[i]=m[i+M]^T(m[i],m[i\
+1]);for(;i<N;i++)m[i]=m[i-K]^T(m[i],m[i+1]);m[N]=m[M-1]^T(m[N],m[0]);i=624;}L
g(){L y;if(!i--)ns();y=m[624-i];y^=y>>11;y^=(y<<7)&0x9d2c5680;y^=(y<<15)&0xefc\
60000;y^=y>>18;return y;}main(){x(4357);while(1){printf("%lx\n",g());}}

750 :デフォルトの名無しさん:02/03/12 10:12
完成版。1000個吐いたら止まる

#include<stdio.h>
#define T(u,v) ((((u)&0x8000000|(v)&0x7FFFFFFF)>>1)^((v)&1?0x9908b0df:0))
typedef unsigned long L;unsigned long N=623,M=397,K=227,m[624],i;x(L s){m[0]=s;
for(i=1;i<N;i++)m[i]=69069*m[i-1];}n(){for(i=0;i<K;i++)m[i]=m[i+M]^T(m[i],m[i+1
]);for(;i<N;i++)m[i]=m[i-K]^T(m[i],m[i+1]);m[N]=m[M-1]^T(m[N],m[0]);i=624;}L g(
){L y;if(!i--)ns();y=m[624-i];y^=y>>11;y^=(y<<7)&0x9d2c5680;y^=(y<<15)&0xefc60\
000;return y^(y>>18);}main(){L a=1000;x(4357);while(a--){printf("%lx\n",g());}}

751 :デフォルトの名無しさん:02/03/12 14:51
上の方にオセロがあったみたいだから、今度は将棋かチェスよろしく

752 :デフォルトの名無しさん:02/03/12 15:05
>>749-750
素晴らしすぎる

753 :750:02/03/12 15:28
ごめんバグあった。これで最終版です。
初期化にKnuthのランダムを使うバージョンです。

#include<stdio.h>
#define T(u,v) ((((u)&0x8000000|(v)&0x7FFFFFFF)>>1)^((v)&1?0x9908b0df:0))
typedef unsigned long L;L N=623,M=397,K=227,m[624],i;x(L s){m[0]=s;for(i=1;i<N;
i++)m[i]=69069*m[i-1];}n(){for(i=0;i<K;i++)m[i]=m[i+M]^T(m[i],m[i+1]);for(;i<N;
i++)m[i]=m[i-K]^T(m[i],m[i+1]);m[N]=m[M-1]^T(m[N],m[0]);i+=2;}L g(){L y;if(!i--
)n();y=m[624-i];y^=y>>11;y^=(y<<7)&0x9d2c5680;y^=(y<<15)&0xefc60000;return y^(y
>>18);}main(){L a=1000;x(4357);while(a--){printf("%08lx\n",g());}}

754 :750:02/03/12 15:30
>>751
将棋は辛そう・・・

>>752
ありがとー!すげえ嬉しい!

755 :デフォルトの名無しさん:02/03/12 16:09
>>751
駒の動かし方パターンを持っておくだけで七行になりそうな気がするぞ(w

756 :Javaさん:02/03/13 02:05
いまさらながらにHttpd

index.htmlしか返せないのが
//D.java
import java.net.*;import java.io.*;class D extends Thread{OutputStream o;static
void main(String[] s)throws Exception{ServerSocket t=new ServerSocket(80);while(
true){new D(t.accept());}}D(Socket s)throws Exception{int q=s.getInputStream().
read();o=s.getOutputStream();start();}public void run(){try{BufferedReader f=
new BufferedReader(new FileReader("index.html"));o.write(("HTTP/1.1 200 OK\nCon"
+"tent-Type: text/html\n\n").getBytes());while(f.ready()){o.write((f.readLine()+
"\n").getBytes());}o.close();}catch(Exception e){}}}

こんなかんじ?

で、複数ファイル名対応にしようとすると7行の壁が,、、、
//同じくD.javaでスマソ
import java.net.*;import java.io.*;class D extends Thread{OutputStream o;String
v;static void main(String[] s)throws Exception{ServerSocket t=new ServerSocket
(80);while(true){new D(t.accept()).start();}}D(Socket s)throws Exception{o=s.
getOutputStream();v=new BufferedReader(new InputStreamReader(s.getInputStream())
).readLine();v=v.substring(v.indexOf(" ")+2,v.lastIndexOf("H")-1);if(v.endsWith(
"/"))v+="index.html";}public void run(){try{BufferedReader f=new BufferedReader(
new FileReader(v));while(f.ready()){o.write((f.readLine()+"\n").getBytes());}o.
close();}catch(Exception e){}}}

"HTTP/1.1 ..."等のレスポンスまで削ってもきつい。
等幅で見ると余裕がないのが見え見え。。。
しかもカレントより上のディレクトリにもアクセスできる、、、、w

#Javaは板違い?

757 :Javaさん:02/03/13 02:09
上のほうの
"HTTP/1.1 200 OK\nCon"+"tent-Type: text/html\n\n"
の部分は、ただ行にぎっしり詰めるためだけの"+"です。
無くても7行で収まるけど、まぁ、ユルシテ、、、、

758 :デフォルトの名無しさん:02/03/13 10:06
>>756
言語は問わないから Java でも別にかまわないと思われ
むしろ #include で1行使わされる C/C++ より有利かも

759 :デフォルトの名無しさん:02/03/13 10:09
JAVA作品は多いよ7〜10あるんじゃない?

Del坊ガンバレ まだ3作品しかない


760 :デフォルトの名無しさん:02/03/14 00:29
>>756
あうー、Threadやめてしまうなりよ

import java.net.*;import java.io.*;class D{OutputStream o;String v;static void
main(String[]a){try{ServerSocket t=new ServerSocket(80);for(;;){Socket s=t.
accept();OutputStream o=s.getOutputStream();String v=new BufferedReader(new
InputStreamReader(s.getInputStream())).readLine();v=v.substring(v.indexOf(" ")+
1,v.lastIndexOf("H")-1);BufferedReader f=new BufferedReader(new FileReader(v));
while(f.ready())o.write((f.readLine()+"\n").getBytes());o.close();}}catch(
Exception e){}}}

どうなりか?7行。

761 :デフォルトの名無しさん:02/03/14 00:40
>>760 あうっ! フィールドは使ってなかった...
けずると6行になっちゃうぞ?



762 :デフォルトの名無しさん:02/03/14 01:41
塩基配列圧縮記念
http://www.zdnet.co.jp/news/bursts/0203/11/08.html

データの遺伝子を調べるソフトです。
標準入力のデータから塩基配列を調べて、標準出力に出します。
何の工夫も無く、7行です。
% acgt < acgt.c
などとして遊んでください。

acgt.c ------------------------------------------
#include <stdio.h>
int main() {
 char*s="ACGT",c,i;
 while((c=getchar())!=EOF)
  for(i=0;i<4;i++,c>>=2)
   printf("%c",s[c&3]);
}


763 :デフォルトの名無しさん:02/03/14 13:19
>>762
う〜ん,気にいった。何の役にも立たないところが良い。

764 :デフォルトの名無しさん:02/03/14 16:05
あれ?>762は正しいの?
Cなんて忘れたけどさ、intで受けないと変なとこで終わらない?


765 :デフォルトの名無しさん:02/03/14 18:20
つーか、永遠に終わらない

766 :デフォルトの名無しさん:02/03/14 20:27
シロウト考えではFFを読み込んだときに終わっちゃいそうにオモタ。


767 :デフォルトの名無しさん:02/03/14 21:39
ctrl+Z でも ctrl+C でも終るだろう?

768 :デフォルトの名無しさん:02/03/15 10:26
 

769 :デフォルトの名無しさん:02/03/15 17:00
#include<stdio.h>
main(){int a[99],c,i,n;for(i=0;i<99;i++)a[i]=0;*a+=1;for(n=256;n>0;n--){for(i=c=
0;i<99;i++){a[i]+=c;c=a[i]%n;a[i]/=n;c*=1000000;}*a+=1;}for(i=0;i<99;i++)printf(
i?"%06d":"%d.",a[i]);printf("\n");}
自然対数の底。既出かね

770 :Javaさん:02/03/15 21:16
>>760
なるほど、スレッドを使わないのも簡易HTTPサーバとしてはありですね.
少しでも重いコンテンツを載せると終了しますが、、.
あと、コピペしてコンパイルしてみましたが、そのソースだと動かないようです.
v.indexOf(" ")+1のところは+2でないとダメですね.


スレッドを使用したものも7行に縮めることに成功しました.

import java.net.*;import java.io.*;class D extends Thread{Socket s;static void
main(String[]z)throws Exception{ServerSocket t=new ServerSocket(80);for(;;)new D
(t.accept()).start();}public void run(){try{BufferedReader f=new BufferedReader(
new InputStreamReader(s.getInputStream()));String v=f.readLine();v=v.substring(
v.indexOf(" ")+2,v.lastIndexOf("H")-1);if(v.endsWith("/"))v+="index.html";f=new
BufferedReader(new FileReader(v));while(f.ready())s.getOutputStream().write((f.
readLine()+"\n").getBytes());s.close();}catch(Exception e){}}D(Socket a){s=a;}}


771 :デフォルトの名無しさん:02/03/16 22:34
いえーいあげ

次のお題は、RSA暗号でどうよ

772 :デフォルトの名無しさん:02/03/17 10:27
このスレすげぇなぁ…。

773 :デフォルトの名無しさん:02/03/18 12:16
>>772
同意。
なんか、MSX-FANの一画面プログラムを思い出すなぁ
職人はすごいっすね

774 : ◆tAdi.2WY :02/03/18 13:30
perl版の倉庫番は >>120 で出ているけど、今度は C で倉庫番。

#include <stdio.h>
char*strchr(const char*,int),*d="?@` A",*c=" .+*#@",m[768],*p,*q=m,*r,a,j,l;int
i;t(char*x){return strchr(c,*x)-c;}main(){FILE*e=fopen("map","r");for(;i<768;)j
=getc(e),j==10?i|=31:0,m[i++]=j;for(;q<m+768;)r=c+t(q),!r||!*q?r=c:0,r==c+5?p=q
:0,l+=r==c+2,*q++=*r;for(;;l?0:exit(0),i=getchar()-104,i<0|i>4?0:(j=d[i]-64,q=p
+j,r=q+j,t(q)&4?0:(t(q)&2?t(r)>1?0:(l+=(t(q)&1)-t(r),*q=c[t(q)-2],*r=43-t(r)):1
)?*p=c[a],a=t(q),*q=64,p=q:0))for(q=m,i=0;i<792;)putchar(i++%33?*q++:10);}

・ASCIIコード依存な上sizeof(int)>=sizeof(char *)じゃないと動かない…。
・マップはファイル "map" から読み込む(最大31x24)。
・@が自分、+が荷物、.がマーカー、*がマーカー上の荷物、#は壁。
 それ以外は道。
・hjkl + 改行で移動(vi or rogue風)。

サンプルの map ファイル。
x#######
##....x#
###...+###
#xx+#+x+x#
#x++xx#+x#
#xxxx#xxx#
####x@x###
xxx#####


775 :デフォルトの名無しさん:02/03/18 20:41
#include <stdio.h>
#define P(A,N,B,M) for(i=0;i<N;i++) putc(A, f); for(i=0;i<M;i++) putc(B, f);
int x,y,k,i;main(){FILE *f=fopen("t.bmp","wb");P(66,1,77,1)P(54,1,132,1)P(3,1,0
,5)P(54,1,0,3)P(40,1,0,3)P(64,1,1,1)P(0,2,240,1)P(0,3,1,1)P(0,1,24,1)P(0,6,132,
1)P(3,1,0,1)P(196,1,14,1)P(0,2,196,1)P(14,1,0,10)for(y=0;y++<240;)for(x=0;x++<
320;)for(k=0;k++<3;)putc(x*y*k/128,f);}

BMPファイル生成;
だれか残りの100文字でおもろいもん描画してみてくれ・・。
ってか、もっとちぢむのかな・・。
再帰の木の描画やろうと思ったんだが7行はムリか・・。

776 :arch:02/03/18 23:47
/* ta.cpp -- tar の展開 */
#include <fstream>
main(){char*c,*b=new char[1<<24];for(;cin.read(b,512),*b;){cout<<b<<endl;int i,
s;ofstream o(b);for(c=b+124,s=i=0;i<11;i++,c++)s=s*8+*c-48;cin.read(c,512*(s/
512+1));o.write(c,s);}}

誰か、アーカイバを作ってということだったので、試し。
入力は、標準入力より。
ただし展開のみで、しかもファイルのみ。
ディレクトリの作成は対応したい予定。

777 :デフォルトの名無しさん:02/03/19 01:23
BMPをJPGに7行で変換に挑戦してみるか。

778 :デフォルトの名無しさん:02/03/19 14:21
>777 になにかを期待してた。そんな俺が悪いのか!

779 :デフォルトの名無しさん:02/03/19 15:05
>>778
そんな778にささげる。

#!/bin/sh
convert $1 $2

2行でBMP2JPGコンバータだ。
sh と ImageMagik がインストールされていれば、な。

780 :デフォルトの名無しさん:02/03/20 14:54


781 :778:02/03/25 15:04
>779
いや、そういう意味じゃなくてね・・
ほら、ここ「7行プログラミング」でしょ・・



782 :デフォルトの名無しさん:02/03/25 15:28
すまん・・・ネタのつもりじゃなかったんだが、どうしても7行には収まらん。
つーか無理っぽい気がしてきた。
7行関数 ってことにしても無理っぽいなぁ。

783 :デフォルトの名無しさん:02/03/25 15:50
>>782
途中経過でいいからはっつけちゃえー

784 :C_sugar:02/03/26 00:21
<html><head><script>var Ky=-1;var SHP,TId;var SL=1;var SRL=0;var SR=[];var D=
document;function GBP(){do{var BP=Math.floor(Math.random()*400)}while(GI(BP)!=
"□")return BP}function GS(){var F="";for(i=0;i<20;i++){for(j=0;j<20;j++){
var Id="F"+(i*20+j);F+=((i==0)||(i==19)||(j==0)||(j==19))?"<span id="+Id+
">■</span>":"<span id="+Id+">□</span>"}F+="<br>";}SI("EX",F);SHP=GBP();
SI(SHP,"●");SI(GBP(),"▲");SR[0]=SHP;MS()}function MS(){if(Ky!=-1){SRL++;SHP+=
[-1,-20,1,20][Ky];switch(GI(SHP)){case"●":case"■":clearTimeout(TId);alert(
"GameOver");return;case"▲":SL++;SI(GBP(),"▲");}SR[SRL]=SHP;SI(SHP,"●");SI(SR[
SRL-SL],"□")}TId=setTimeout("MS()",100)}function SI(P,H){D.all["F"+P
].innerHTML=H}function GI(P){return D.all["F"+P].innerHTML}</script></head>
<body onLoad="GS()" onKeyDown="javascript:Ky=event.keyCode-37;" Style="
font-family:monospace"><div id=FEX></div></body></html>

Snake Game(JavaScript)

12行が限界でした。

IE5以上、シフトJIS。
カーソルキーで操作します。





785 :デフォルトの名無しさん:02/03/26 01:49
>>784
すごい! おもしろい! はまってしまった・・・
なので10行まで縮めてみた。変数名勝手にいじってスマソ。

<html><head><script>var K=-1,P,T,M=1,L=0,Z=[],D=document,B,F,A;function R(){do{
B=Math.floor(Math.random()*400)}while(E(B)!="□")return B}function G(){F="";for
(i=0;i<20;i++){for(j=0;j<20;j++){A="F"+(i*20+j);F+=((i==0)||(i==19)||(j==0)||(j
==19))?"<span id="+A+">■</span>":"<span id="+A+">□</span>"}F+="<br>"}I("EX",F
);P=R();I(P,"●");I(R(),"▲");Z[0]=P;Y()}function Y(){if(K!=-1){L++;P+=[-1,-20,
1,20][K];switch(E(P)){case"●":case"■":clearTimeout(T);alert("Over");return;
case"▲":M++;I(R(),"▲")}Z[L]=P;I(P,"●");I(Z[L-M],"□")}T=setTimeout("Y()",100
)}function I(P,H){D.all["F"+P].innerHTML=H}function E(P){return D.all["F"+P].
innerHTML}</script></head><body onLoad="G()" onKeyDown="javascript:K=event.
keyCode-37;" Style="font-family:monospace"><div id=FEX></div></body></html>


786 :デフォルトの名無しさん:02/03/26 01:54
題材キタ━━━( ゚∀゚ )━( ゚∀)━(  ゚)━(  )━(゚  )━(∀゚ )━( ゚∀゚ )━━━!!!!
どうせIE5以上限定であるのなら、<html>とか削っちゃうとかw

787 :デフォルトの名無しさん:02/03/26 02:38
>>786
削ってみた。実質9行になた。
●■などを半角にすると、バランス悪いので、やめた。

<script>var K=-1,P,T,M=1,L=0,Z=[],D=document,F="",C="<span id=F";function R(){
while(E(F=Math.ceil(Math.random()*399))!="□");return F}function G(){for(i=0;i<
400;i++){F+=C+i;F+=(i<20||i>380||i%20==0||i%20==19)?">■</span>":">□</span>";
if(i%20==19){F+="<br>"}}I("EX",F);I(P=Z[0]=R(),"●");I(R(),"▲");Y()}function Y
(){if(K!=-1){L++;P+=[-1,-20,1,20][K];switch(E(P)){case"●":case"■":
clearTimeout(T);alert("Over");return;case"▲":M++;I(R(),"▲")}I(Z[L]=P,"●");I(
Z[L-M],"□")}T=setTimeout("Y()",99)}function I(P,H){D.all["F"+P].innerHTML=H}
function E(P){return D.all["F"+P].innerHTML}</script><body onLoad="G()"
onKeyDown="javascript:K=event.keyCode-37;" Style="font-family:monospace"><div
id=FEX>


362 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)