[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 05/10 16:01 / Filesize : 349 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

七行プログラミング part2



1 名前:デフォルトの名無しさん [02/04/15 12:09]
7行×79文字なら言語は問いません。
過去作品は>>2-5を参照。

■前スレ
pc.2ch.net/test/read.cgi/tech/984182993/

552 名前:521 mailto:sage [02/07/23 23:41]
>>548-551
g と e をまとめちゃったのが、まずいのではないかな?
今のところ後2文字くらいになっていますが、どこを削れるかなぁ。

553 名前:521 [02/07/23 23:45]
これで7行ですね。上げておきます。

#include <stdio.h>
size_t*a,l,r=~0,e,z,q,u[257],f[257],c=5,x=256;main(int g,char**v){FILE*n=fopen(
v[2],"rb"),*o=fopen(v[3],"wb");for(g=*v[1]-69&&fread(f,4,x,n);g?--c:~(c=getc(n)
);)g?e=e*x|getc(n):f[c]++;g||fwrite(f,4,x,o)&&fseek(n,c=0,0);for(a=f;c<x;q=u[1+
c++]=q+*a++)z+=*a,*a>=x?*a=255:0;for(;g?z--:~(c=getc(n));){r/=q;if(g){for(c=x;
--c&&(e-l)/r<u[c];);putc(c,o);}for(l+=u[c]*r,r*=f[c];r<=~l*x/x||r<x*x&&(r=65535
&-l);)g?e=e*x|getc(n):putc(l>>24,o),r*=x,l*=x;}for(c=4;c--;)g||putc(l>>c*8,o);}

554 名前:七誌饅頭 mailto:sage [02/07/23 23:59]
あらま。考えてる間に。
>>521さんお疲れ様です。それにしても縮んでよかった(w
3人寄れば文殊の知恵というかなんと言うか。
コードのエントロピーはどこにあるんでしょうね(w

555 名前:デフォルトの名無しさん mailto:sage [02/07/24 00:14]
>>554
今回は久しぶりに参加者が多かったですね。
中盤では、比較的わかりやすいソースコードになっていたからでしょうね。
最終的にはやはり奇妙奇天烈(に見えるもの)になりましたが。

556 名前:デフォルトの名無しさん mailto:sage [02/07/24 00:17]
>>553
こいつはマジですげぇ。インデントしてもまともなプログラムとは思えねぇ(w
forをうまく使い込み、(まともに使っていれば)ありえないような例外処理も省き、
その上でエンコードとデコードの処理が3項演算子と論理演算子で融合されている。
定石と、非常識が合わさった執念のプログラム。これが匠という奴なのか。

557 名前:デフォルトの名無しさん mailto:sage [02/07/24 00:22]
ソースを追うごとにwhileが消えていく(w

558 名前:最大の賛辞 [02/07/24 00:28]
君たち頭おかしいよ、まじで。

559 名前:デフォルトの名無しさん mailto:sage [02/07/24 00:29]
>>557
やたら for や ?:, ++, --, * が増える。それもまた楽しw

560 名前:デフォルトの名無しさん mailto:sage [02/07/25 14:18]
前スレのハフマン符号 pc3.2ch.net/test/read.cgi/tech/984182993/194
アルゴリズムをほとんど見ずに、ステートメントだけで縮めてみました。

int b,i,j,l,m,n=1024,c,p=7,h[32],y=16;r(h,b){for(;b--;!p--?putchar(c),c=0,p=7:0
)c|=(h>>b)%2<<p;}q(int*a,int*b){return*a-*b;}struct v{int i,b,h,n;}*v,*f;struct
{int n,i,e,k;struct v v[63];}x[32]={0,},*a=x;main(){char*d=0;for(;~(b=getchar()
);a[d[l++]=b%y].n++)a[(d=realloc(d,l+2))[l++]=b/y].n++;for(i=32;i--;)a[a[i].i=a
[i].v[0].i=i].e=1;qsort(a,y,n,&q);for(b=17,i=0;!x[i++].n;a++)b--;for(;2<b;a+=2)
{qsort(a,b--,n,&q);for(j=1;j<3;j++)for(i=0,v=a[j].v;i<a[j].e;i++)v[i].h|=j%2<<v
[i].b++;m=a[1].e;memcpy(a->v+a->e,a[1].v,m*y);memcpy(a->v+m+a->e,a[2].v,496);a
->e+=m+a[2].e;a->n+=a[1].n+a[2].n;memcpy(a+2,a,n);}for(i=0;i<y;i++)for(j=0;j<32
;j++)if((f=a->v+j)->i==i)r(f->b-1,4),r(f->h,f->b),h[i]=f->b,h[i+y]=f->h,j=32;
for(i=0;i<l;r(b+y,b))b=h[d[i++]];p-7&&r(0,p);}



561 名前:デフォルトの名無しさん [02/07/25 18:55]
面白そうなので、私も作ってみました。15パズルです。

P.java(JDK1.4.0で確認)

import java.awt.*;public class P extends Frame{class B extends Button{String l,
r,t;int o;B(int i){o=i%4+i/4*6;s(r=i+1+"");}void m(){if((64<<o&4257<<n.o)>0){t=
l;s(n.l);n.s(t);n=this;}}void s(String n){setLabel(l=n);}}int g;B[]a=new B[16];
B n;public P(){setLayout(new GridLayout(4,4));for(;g<16;g++)add(n=a[g]=new B(g)
);pack();show();i();}void i(){n.s("");for(g=0;g++<999;)a[(int)(Math.random()*16
)].m();}public boolean handleEvent(Event e){if(e.id==201)System.exit(0);if(e.id
==1001)if(g<0)i();else{((B)e.target).m();for(g=15;g-->0;)if(a[g].l!=a[g].r)
return 1>0;n.s("R");}return 1>0;}public static void main(String s[]){new P();}}

頑張って8行まで縮めたのですが、私にはこれで限界でした(;_;)
ちなみに、201==Event.WINDOW_DESTROY、1001==Event.ACTION_EVENTです(笑)

# 2ちゃんねる初書き込みなので、ちょっとどきどき…。


562 名前:560 mailto:sage [02/07/26 18:45]
オリジナルに間違いがあったのでそれも修正しました。
現在9行。アルゴリズムを変更しないと、これ以上は無理かな・・・

int b,i,j,l,n=1024,c,p,h[32],y=16;r(h,b){for(;b--;++p>7?putchar(c),p=c=0:0)c|=(
h>>b)%2<<7-p;}q(int*a,int*b){return*a-*b;}struct v{int i,b,h,n;}*v;struct{int n
,i,e,k;struct v v[63];}x[32],*a=x;main(){char*d=0;for(;~(b=getchar());a[d[l++]=
b%y].n++)d=realloc(d,l+2),a[d[l++]=b/y].n++;for(i=32;i--;)a[a[i].i=a[i].v[0].i=
i].e=1;for(qsort(a,b=y,n,&q);!x[y-b--].n;a++);for(;b;a+=2){qsort(a,2+b--,n,&q);
for(j=1;j<3;j++)for(i=0,v=a[j].v;i<a[j].e;i++)v[i].h|=j%2<<v[i].b++;i=a[1].e;
memcpy(a->v+a->e,v-64,i*y);memcpy(a->v+i+a->e,v,496);a->e+=i+a[2].e;a->n+=a[1].
n+a[2].n;memcpy(a+2,a,n);}for(i=0;i<y;i++)for(j=0;(v=a->v+j)->i==i?r((b=v->b)-1
,4),r(h[i+y]=v->h,h[i]=b),0:++j;);for(i=0;i<l;r(h[b+y],h[b]))b=d[i++];r(0,7);}

563 名前:デフォルトの名無しさん [02/07/27 03:20]
ひさしぶりage

564 名前:デフォルトの名無しさん mailto:sage [02/07/27 03:26]
コーディングテクニックが極まっちゃうと手を加えられなくなるよね。


565 名前:560 mailto:sage [02/07/27 05:59]
Huffman 符号構成のアルゴリズムを変更してみました。現在8行。
ほぼ1から作り直したので、コーディングに甘い部分があります。
関数 z とか新設したんですが、どなたかこれを無くして下さいです。

int*d=0,i,j,k,l,h[32],y=16,c,p;r(h,b){for(;b--;++p>7?putchar(c),p=c=0:0)c|=(h>>
b)%2<<7-p;}q(int*a,int*b){return*a-*b;}struct v{int f,b,s[2],i,c;}n[31],*x=n,*w
;z(d,c){int m;struct v*w=x;if(w->i<y)w->b=d,w->c=c;else for(m=2;m--;)for(j=30;w
->s[m]==n[j].i?x=n+j,z(d+1,c*2+m),0:j--;);}main(){for(;i<y;)n[i++].f=1;for(;~(i
=getchar());n[d[l++]=i/y].f++)d=realloc(d,l*4+8),n[d[l++]=i%y].f++;for(;++i<y;)
n[i].i=i;for(j=k=y;--k;w->s[1]=x++->i){qsort(x,j,24,&q);w=x+j--;w->f=x->f+x[1].
f;w->i=i++;w->s[0]=x++->i;}z(-1,0);for(i=y;i--;)for(k=31;k--;)n[k].i==i?r(j=h[y
+i]=n[k].b,4),r(h[i]=n[k].c,j):0;for(;++i<l;r(h[j],h[y+j]))j=d[i];r(0,7);}
寝よう・・・

566 名前:560 mailto:sage [02/07/27 06:10]
圧縮率と簡便さから、range coder が Huffman にとって代わりつつあるが、
符号化&復号をあわせて7行プログラミングできるかどうかでも、
Huffman は range coder に敵わないのだということを嫌というほど実感中w

・・・起きたら7行に到達していたらいいなぁ・・・zZZ

567 名前:デフォルトの名無しさん [02/07/27 11:15]
ここのソースを自動インデントするプログラムを書こうと思ったけど
一文字ずつの処理じゃもうだめぽ

568 名前:デフォルトの名無しさん mailto:sage [02/07/27 12:41]
>565
c|=(h>>b)%2<<7-p;→c+=c+(h>>b)%2;
A==B?C:D;→A-B?D:C;
で僅かに縮む…が、焼け石に水か(w

569 名前:デフォルトの名無しさん mailto:sage [02/07/27 14:18]
>>568
A-B?D:C; の場合、C にカンマ演算子が含まれていないことが条件ですぞ。
: までと : 以降ではカンマの扱いが微妙に違うのがいやらしい。
&&, || の場合もカンマ演算子は使いにくいです。

570 名前:568>569 mailto:sage [02/07/27 15:03]
3項演算子の方は検証せずに書いてた、逝って狂



571 名前:560 mailto:sage [02/07/27 18:09]
現在残り29文字になりました。これから z を改良します。
・・・ところで、どなたか復号器を作っていただけませんか。

>>565までのものには、明らかな間違いが存在します。
また復号が不可能だったので、データ長を記録するようにしました。

符号語のフォーマットは、
元のデータ長(4byte), (符号語長 4bit, 符号語 x bit) の組が16個,
その後ろに符号化したデータがぞろぞろと繋がります。

int*d=0,i,j,k,l,h[32],y=16,c,p;r(h,b){for(;b--;++p>7?putchar(c),p=c=0:0)c+=c+(h
>>b)%2;}struct v{int f,b,s[4],i,c;}n[31],*x=n,*w;z(d,c){int m;struct v*w=x;w->b
=d,w->c=c;for(m=2;(w->i>=y)&&m--;)for(j=30;w->s[m]==n[j].i?x=n+j,z(d+1,c*2+m),0
:j--;);}q(int*a,int*b){return*a-*b;}main(){for(;~(i=getchar());n[d[l++]=i/y].f
++)d=realloc(d,l*4+8),n[d[l++]=i%y].f++;for(;++i<y;)n[i].i=i;for(j=k=y;--k;w->s
[1]=x++->i){qsort(x,j,32,&q);w=x+j--;w->f=x->f+x[1].f;w->i=i++;w->s[0]=x++->i;}
z(i=0,0);for(r(l,32);i<l+y;i++)for(w=n+31;w-->n;w->i==(i<y?i:d[i-y])?i<y&&r(j,4
),r(w->c,j):0)j=w->b;r(0,7);}

>>568>>570 いえいえ、ありがとうございます。

572 名前:560 [02/07/27 18:55]
7行 Huffman符号化。
ただし、復号できるかどうかは未検証です。

int*d=0,i,j,k,l,h[32],y=16,c,p;r(h,b){for(;b--;++p>7?putchar(c),p=c=0:0)c+=c+(h
>>b)%2;}q(int*a,int*b){return*a-*b;}struct v{int f,b,s[4],i,c;}n[31],*x=n,*w=n+
16;main(){for(;~(i=getchar());n[d[l++]=i/y].f++)d=realloc(d,l*4+8),n[d[l++]=i%y
].f++;for(;++i<y;)n[i].i=i;for(k=y;--k;w++->s[1]=x++->i){qsort(x,k+1,32,&q);w->
f=x->f+x[1].f;w->i=i++;w->s[0]=x++->i;}for(r(l,32);i--;)for(j=i,w=n+i;w->i>=y&&
j--;)for(k=2;k--;)w->s[k]==n[j].i?n[j].b=w->b+1,n[j].c=w->c*2+k:0;for(;++i<l+y;
)for(w=n+31;w-->n;w->i==(i<y?i:d[i-y])?i<y&&r(j,4),r(w->c,j):0)j=w->b;r(0,7);}

573 名前:デフォルトの名無しさん mailto:sage [02/07/27 19:07]
(~~~ ゚ ∀~)~~~ ゚ メダマ ボーン

574 名前:デフォルトの名無しさん mailto:sage [02/07/27 21:30]
&qの&はなくてもいいんではないのかい?

575 名前:デフォルトの名無しさん mailto:sage [02/07/27 21:54]
最近のレスを見ていると、よくもこんなというテクニックが多く見られる
当時興味があったBASICも、今見るとあちこち縮められそうに思える
技術の進歩はすごいんだなあ…参戦したくなりますたw

576 名前:今日始めてこのスレ見つけた奴 mailto:sage [02/07/27 22:01]
このスレにWebプログラミングで参戦してみようと思います
恐らくPHPですかね
なんかやってみます

577 名前:デフォルトの名無しさん mailto:sage [02/07/27 22:02]
>>576
大歓迎ざます

578 名前:今日始めてこのスレ見つけた奴 mailto:sage [02/07/27 22:06]
ただ、ここにいる方々ほど偉大な
プログラミングは出来ないですが、
やれるだけのことはやってみます

579 名前:デフォルトの名無しさん mailto:sage [02/07/28 00:19]
>>578
始めてじゃなくて初めてだな
プログラミングと一緒に日本語もガンバレヨ

580 名前:デフォルトの名無しさん [02/07/28 15:43]
前スレのスライド辞書圧縮
pc3.2ch.net/test/read.cgi/tech/984182993/153-154
符号化と復号とが分かれていたので、いっしょにしてみました。現在9行。

#include <stdio.h>
int(*p)()=putchar,(*q)()=getchar,f=1023,g,j,k,l,m,n=127,s;char*d=0;r(o){for(p(o
);o--;)p(d[g++]);}main(int i){if(i>1){l=getw(stdin);for(d=malloc(l+8);s<l;){g=q
();if(g<n)for(i=g;i--;)d[s++]=q();else for(k=q()+(g-128)*256,i=k>>10,j=s-(k&f);
i--;)d[s++]=d[j++];}for(;l--;)p(*d++);}else{for(;~(s=q());d[l++]=s)d=realloc(d,
l+9);putw(l,stdout);memset(d+l,0,8);for(l+=8;s<l-3;s++){m=1;j=s>31?31:s;j=l-s-2
>j?j:l-s;for(;j>2;j--){for(i=s<f?0:s-f;i<s;i++)if(!(m=memcmp(d+i,d+s,j))||i+j>l
)break;if(!m)break;}if(!m){for(k=s-g;k>n;k-=n)r(n);k&&r(k);p(128+j*4+(k=s-i)/
256);p(k%256);g+=j;s=g-1;}}}}



581 名前:でけた! [02/07/28 15:53]
fawekfgvuq4eoptvnu4u905634^05689^3-5iqwoptjap bmg\xcm,c/<a\;vifa
sfkqvprv8q^@08pgkv\b/m,sb\/Vcbn\/.\>a[]-1[\lo-5^-269^2ryib@;:]ym
wriobyw45[2bm9^\c;,lhmx\:V,xc\./n,z_C;1^\@a:daf/v,w@]byk90w46by0
-3569kby-w35y6w65yeryhnu356ja;4pot8mi681^-:]bc\./bzsgnsfhn/.n,s
we\2\q34t5o34^-68^24690^-oy;:pvb\./xn,\/XCV,.b;:d]s9tbqo^while
dt69oqw@]qyniom7@ln:,/.zcvbn;]r[q[rt2^\56o2^\5789hknl.vmn.;/vmn;
hlwit^y02846ypokfhfghh56yfghadginytmainstdio.hriotjueirutjintint

582 名前:デフォルトの名無しさん mailto:sage [02/07/28 16:41]
>>581 ワラタ

583 名前:デフォルトの名無しさん mailto:sage [02/07/28 17:07]
>>580
縮めてみますた。アルゴリズムが間違っていたらすまソ

#include <stdio.h>
int(*p)()=putchar,(*q)()=getchar,f=1023,g,j,k,l,m,n=127,s;char*d=0;main(int i){
if(i>1){l=getw(stdin);for(d=malloc(l+8);s<l;){g=q();if(g<n)for(i=g;i--;)d[s++]=
q();else for(k=q()+(g-128)*256,i=k>>10,j=s-(k&f);i--;)d[s++]=d[j++];}for(;l--;)
p(*d++);}else{for(;~(s=q());d[l++]=s)d=realloc(d,l+9);putw(l,stdout);memset(d+l
,0,8);for(l+=8;s<l-3;s++){for(m=j=l-s-2>31?31:l-s;m&&j>2;j--)for(i=s<f?0:s-f;m
&&i<s;)m=memcmp(d+i++,d+s,j);if(!m){for(k=s-g;k+1;)for(p(m=k>n?n:k);k--,m--;)p(
d[g++]);p(++j*4+128+(k=s-i+1)/256);p(k);g+=j;s=g-1;}}}}

584 名前:昨日初めてこのスレ見つけた奴 mailto:sage [02/07/28 18:01]
オセロ作ったら39行になっちった(汗

585 名前:580 mailto:sage [02/07/28 18:17]
意外と縮むようで、縮まない。後21文字

#include <stdio.h>
int(*p)()=putchar,(*q)()=getchar,f=1023,g,j,k,l,m,n=127,s;char*d=0;main(int i){
if(i>1){for(l=getw(stdin),d=malloc(l+8);s<l;)for(g=m=q(),m>n?k=q()|g-128<<8,m=k
>>10:0;m--;s++)d[s]=g>n?d[s-(k&f)]:q();for(;l--;)p(*d++);}else{for(;~(s=q());d[
l++]=s)d=realloc(d,l+9);putw(l,stdout);memset(d+l,0,8);for(l+=8;s<l-3;s++){for(
m=j=l-s-2>31?31:l-s;m&&j>2;j--)for(i=s<f?0:s-f;m&&i<s;)m=memcmp(d+i++,d+s,j);if
(!m){for(k=s-g;k;)for(p(m=k>n?n:k);m--;k--)p(d[g++]);p(++j*4+128|(k=s-i+1)>>8);
p(k);g+=j;s=g-1;}}}}

586 名前:デフォルトの名無しさん [02/07/28 21:18]
>>585
関数ポインタか…

587 名前:580 mailto:sage [02/07/29 00:07]
rangecoderを7行にしたみなさんこちらも挑戦してみてください、と言ってみるテスト
もう一人協力いただければ、文殊の知恵で何とかできるかもしれない

#include <stdio.h>
int(*p)()=putchar,(*q)()=getchar,f=1023,g,j,k,l,m,n=127,s;char*d;main(int i){if
(i>1){for(l=getw(stdin),d=malloc(l+8);s<l;)for(g=m=q(),m>n?k=q()|g-128<<8,m=k>>
10:0;m--;s++)d[s]=g>n?d[s-(k&f)]:q();for(;l--;)p(*d++);}else{for(;~((d=realloc(
d,9+l))[l]=q());)l++;putw(l,stdout);memset(d+l,0,8);for(l+=8;m=l-s,m>3;s++){for
(j=m-2>31?31:m;m*j>2;j--)for(i=s<f?0:s-f;i<s*m;)m=memcmp(d+i++,d+s,j);if(!m){
for(k=s-g;k;)for(p(m=k>n?n:k);m--;k--)p(d[g++]);k=++g-i;s+=j;g+=j;p(j*4+132|k>>
8);p(k);}}}}

588 名前:デフォルトの名無しさん [02/07/29 00:11]
みんな作るときどうしてる?

・普通にコード書く→スペース・タブなどを潰して縮めて見てを繰り返す
・いきなり7行書きをする


589 名前:デフォルトの名無しさん mailto:sage [02/07/29 00:39]
>>588
for や if は右にそのまま書く。
インデントは長いブレースのところにだけ置く。
などとして、15行程度のソースコードで書いている。

590 名前:饅頭 mailto:達成age [02/07/29 09:30]
多分memsetはいらないと。
あと>>587は動かなかった。
#include <stdio.h>
int(*p)()=putchar,(*q)()=getchar,f=1023,g,j,k,l,m,n=127,s;char*d;main(int i){if
(i>1){for(l=getw(stdin),d=malloc(l+8);s<l;)for(g=m=q(),m>n?k=q()|g-128<<8,m=k>>
10:0;m--;s++)d[s]=g>n?d[s-(k&f)]:q();for(;l--;)p(*d++);}else{for(;~(s=q());d[l
++]=s)d=realloc(d,l+9);putw(l,stdout);for(l+=8;s<l-3;s++){for(m=j=l-s-2>31?31:l
-s;m&&j>2;j--)for(i=s<f?0:s-f;m&&i<s;)m=memcmp(d+i++,d+s,j);if(!m){for(k=s-g;k;
)for(p(m=k>n?n:k);m--;k--)p(d[g++]);k=++g-i;s+=j;g+=j;p(j*4+132|k>>8);p(k);}}}}




591 名前:561 [02/07/29 18:36]
15パズル、7行達成しました〜♪

P.java(JDK1.4.0で確認)

import java.awt.*;public class P{public static void main(String[]s){new Frame()
{class B extends Button{String l,r;int o;B(int i){o=i%4+i/4*6;s(r=i+1+"");}void
m(){if((64<<o&4257<<n.o)>0){n.s(l);s("");n=this;}}void s(String n){setLabel(l=n
);}}int g;B n,a[]=new B[16];{setLayout(new GridLayout(4,4));for(;g<16;g++)add(n
=a[g]=new B(g));n.s("");pack();show();for(;g++<999;)a[(int)(Math.random()*16)].
m();}public boolean action(Event e,Object o){if(g<0)System.exit(0);((B)e.target
).m();for(g=15;g-->0;)if(a[g].l!=a[g].r)return 1>0;n.s("E");return 1>0;}};}}

ちょっと仕様変更して、

・ウィンドウクローズボタンをあきらめ
 (七行スレのJavaプログラム標準?(^^;))
・ゲームクリア時、リスタートせず終了するよう変更

としました。
あと、先達のテクニックも参考にさせていただきました。
(匿名クラスを使うのは目から鱗…)


592 名前:饅頭 mailto:sage [02/07/29 18:58]
どうせなのでもう少し削っておきました。

#include <stdio.h>
int(*p)()=putchar,(*q)()=getchar,f=1023,g,j,k,l,m,n=127,s;char*d;main(int i){if
(i>1)for(l=getw(stdin),d=malloc(l+8);s<l;)for(g=m=q(),m>n?k=q()|g-128<<8,m=k>>
10:0;m--;s++)p(d[s]=g>n?d[s-(k&f)]:q());else{for(;~(s=q());d[l++]=s)d=realloc(d
,l+9);putw(l,stdout);for(l+=8;s<l-3;s++){for(m=j=l-s-2>31?31:l-s;m&&j>2;j--)for
(i=s<f?0:s-f;m&&i<s;)m=memcmp(d+i++,d+s,j);if(!m){for(k=s-g;k;)for(p(m=k>n?n:k)
;m--;k--)p(d[g++]);p(++j*4+128|(k=s-i+1)>>8);p(k);s=(g+=j)-1;}}}}

593 名前:デフォルトの名無しさん mailto:sage [02/07/29 19:58]
>>590
>>587は動作しますが、>>590および>>592は動作しません・・・core dump
memset および復号時の l までの復号は必須のようですよ?

当片 gcc 2.95.2 を使用しています。

594 名前:580 mailto:sage [02/07/29 20:28]
ややっ7行達成と思ったのですが、>>593での指摘通り、動きません。
前スレのレスを見ると、符号語を過剰に生成して、
復号時に余分を切り捨てるという仕組みなので、
アルゴリズムを変えないと memset などは消せないのかもしれませんね。
ちなみに私は Cygwin(or FreeBSD) + gcc 2.95.3 を使用しています。

595 名前:饅頭 mailto:sage [02/07/29 23:34]
むう、一応やってみました。これでオッケーなら七行達成です。
#include <stdio.h>
int(*p)()=putchar,(*q)()=getchar,f=1023,g,j,k,l,m,n=127,s;char*d;main(int i){if
(i>1)for(l=getw(stdin),d=malloc(l+8);s<l;)for(g=m=q(),m>n?k=q()|g-128<<8,m=k>>
10:0;m--&&s<l;s++)p(d[s]=g>n?d[s-(k&f)]:q());else{for(;~((d=realloc(d,9+l))[l]=
q());)l++;putw(l,stdout);memset(d+l,0,8);for(l+=8;s<l-3;s++){for(j=l-s>33?31:l-
s;j>2;j--)for(i=s<f?0:s-f;i<s;)if(!memcmp(d+i++,d+s,j)){for(k=s-g;k;)for(p(m=k>
n?n:k);m--;k--)p(d[g++]);p(j*4+128|(k=s-i+1)>>8);p(k);g+=j;s=g-1;goto z;}z:}}}

596 名前:饅頭 mailto:sage [02/07/30 00:59]
すいません>>595はVCで文句を言われました。
これで七行です。多分gccでもO.K.ではないかと。
#include <stdio.h>
int(*p)()=putchar,(*q)()=getchar,f=1023,g,j,k,l,m,n=127,s;char*d;main(int i){if
(i>1)for(l=getw(stdin),d=malloc(l+8);s<l;s++,m--)!m?g=m=q(),m>n?k=q()|g-128<<8,
m=k>>10:0:0,p(d[s]=g>n?d[s-(k&f)]:q());else{for(;~(s=q());d[l++]=s)d=realloc(d,
l+9);putw(l,stdout);memset(d+l,0,8);for(l+=8;s<l-3;s++){for(j=l-s>33?31:l-s;j>2
;j--)for(i=s<f?0:s-f;i<s;)if(!memcmp(d+i++,d+s,j)){for(k=s-g;k;)for(p(m=k>n?n:k
);m--;k--)p(d[g++]);p(j*4+128|(k=s-i+1)>>8);p(k);g+=j;s=g-1;goto z;}z:;}}}

597 名前:580 mailto:sage [02/07/30 13:33]
>>596
おみごと! 今度は gcc でも動作しました。
if や for をまとめる手腕は素晴らしいです。

>>587 は gcc でもファイルによっては動作しないようですね・・・欝。

598 名前:*nix厨 mailto:sage [02/07/30 18:31]
久しぶりに来て見たら、なんと7行!
しかも圧縮+復元してるし素晴らしすぎる
ここまで縮むと思ってなかったので感動です

# おかげで、また何か作りたくなっちゃいました(w

599 名前:デフォルトの名無しさん mailto:ageてみたり [02/07/30 21:06]
おお!*nix厨たんだ。萌え〜

600 名前:デフォルトの名無しさん mailto:sage [02/07/30 22:26]
スライド辞書の別版です、適当に作ったのでまだ縮む筈

#include<stdio.h>/*encoder*/
int X,Z,M,P;char*L,B[17],*W=B,*N,*R,K,*T;main(int c,char**v){FILE*r=fopen(v[1],
"rb"),*w=fopen(v[2],"wb");for(;~(X=fgetc(r));L[Z++]=X)L=realloc(L,Z+1);for(N=L;
N-L<Z;K+=K){if(!K)fwrite(B,K=1,W-B,w),W=B,*W++=0;for(X=0,(M=L-N+Z)>18?M=18:0,(T
=N-4096)<L?T=L:0;T<N;T++,P>X?X=P,R=T:0)for(P=0;P<M&&T[P]==N[P];P++);X*=2<X;P=N-
R;X?*W++=P>>8<<4|X-3:(*B|=K);*W++=X?N+=X,P:*N++;}fwrite(B,1,W-B,w);}

#include<stdio.h>/*decoder*/
int X,Z,M;char*W,F,K,*C;main(int c,char**v){FILE*r=fopen(v[1],"rb"),*w=fopen(v[
2],"wb");for(;~(X=fgetc(r));K+=K){if(!K)F=X,X=fgetc(r),K=1;if(F&K)M++[W=realloc
(W,M+1)]=X;else for(Z=3+X%16,W=realloc(W,M+Z),C=W+M-fgetc(r)-X/16*256-1;Z--;W[M
++]=*C++);}fwrite(W,1,M,w);}



601 名前:デフォルトの名無しさん mailto:sage [02/07/30 23:09]
>>600
うわー、これまた奇妙で素晴らしい。
こんな配列の操作方法、普段は絶対に使いたくないですなあ。
M++[W=realloc(W,M+1)]=X
・・・おおっ、(W=realloc())[M++] よりカッコの分だけ短くなるのかー!

602 名前:デフォルトの名無しさん mailto:sage [02/07/30 23:34]
>>600
また、ここの住人がまとめて7行にしちゃうよね、と言ってみるテスト

603 名前:デフォルトの名無しさん [02/07/31 01:23]
>>602
それにはまずageなきゃ.

604 名前:デフォルトの名無しさん mailto:sage [02/07/31 01:24]
>>600>>601
M=M++ と同じ問題が起こるのはカンマと論理演算子以外と思っていましたが、
配列のカッコ [] の中と外では、++ の演算順序が決まっているんでしたっけ?
あれ? M[W=realloc(W,1+M++)]=X; とすればいいのでは?

つーか、そんな使い方を実際に目にするのは初めてだ・・・。

605 名前:デフォルトの名無しさん mailto:age [02/07/31 01:25]
神の集うスレッドはここですか?

606 名前:デフォルトの名無しさん mailto:sage [02/07/31 01:28]
>>605
あなたも >>602 のお題を成し遂げて神になりましょう、と言ってみるテスト

607 名前:デフォルトの名無しさん mailto:sage [02/07/31 02:46]
>604
>601の部分はW=realloc(W,M+α);W[M++]=X;(但しα>0)となれば良い
従って演算順序はどちらでも構わない
むしろM[W=realloc(W,1+M++)]=X;は順序次第でバグるかと思われ

…もっとも実際に順序が規定されてるのかは知らん(w

608 名前:昼あげ mailto:age [02/07/31 10:58]
神の集うすれを執拗にage

609 名前:デフォルトの名無しさん mailto:sage [02/07/31 17:52]
>>607
どちらにしろ未定義動作。何が起こるかわからない。

某UNIXと某コンパイラはこれやるとカーネルパニック起こすことで有名。

610 名前:デフォルトの名無しさん mailto:sage [02/07/31 18:42]
某knkタンが思い浮かぶな<未定義動作



611 名前:デフォルトの名無しさん mailto:sage [02/07/31 18:59]
未定義動作といえば、あれでしょう。
というわけで>>600を実行すると鼻から悪魔が出てくるかもしれません。

612 名前:*nix厨 mailto:sage [02/07/31 19:12]
7行リハビリということでBASICを少し刈り込みました
#include <stdio.h>
#include <stdlib.h>
int b[2<<16],f,g,i,n;char l[103][80],c[80],*p,*q,*r,x;S(){for(;*p==32;++p);}T()
{for(r="GOTO \0PUT \0 ET \0 IF \0 RUN\0 QUIT"+6*n++,*r&&*r==*p;++r)++p;return
!*r&&(S()|1);}I(){g=atoi(p);return*p-48?g?g:b[*(short*)p]:g;}main(){for(;;){gets
(p=l[i=100]);while(i<101){n=0;S();if(*(q=p)==48||atoi(q))for(p=l[atoi(q)],q+=3;
*p++=*q++;)i=101;else p=!*q?l[++i]:T()?l[i=I()]:T()?printf("%d\n",I()),l[++i]:T
()?printf("?"),gets(c),b[*(short*)p]=atoi(c),l[++i]:T()?(I()?p+3:l[++i]):T()?l[
i=l[100][0]=0]:T()?exit(0),0:(61-q[2]?puts("ERR"):(p=q+3,f=I(),x=p[2]-43,p+=3,g
=I(),b[*(short*)q]=x?x-2?x+1?x-4?x-17?x-19?x+10?x-18?x+6?f:f%g:f==g:f!=g:f>g:f<
g:f/g:f*g:f-g:f+g),l[++i]);}puts("OK");}}

613 名前:デフォルトの名無しさん mailto:sage [02/07/31 19:21]
きました。主任の登場です(w

614 名前:デフォルトの名無しさん mailto:sage [02/07/31 19:30]
>>612
atoi() を関数ポインタで置き換えれば少しちぢむね。
printf() と puts() もまとめて置き換えられないだろうか?

しかし、stdlib.h を何とかしたほうがよっぽどちぢむかもしれん。

615 名前:デフォルトの名無しさん mailto:sage [02/07/31 19:41]
>>614
atoiは短くならないみたい
ちなみに4行目の6*n++の後は;の間違い
多分、空白を消す際に間違ったんだろう


616 名前:デフォルトの名無しさん mailto:sage [02/07/31 20:34]
>>600の展開
#include<stdio.h>/*decoder*/
int Z,M;char*W,F,K,*C;main(int X,char**v){FILE*r=fopen(v[1],"rb"),*w=fopen(v[2]
,"wb");for(;~(X=fgetc(r));K+=K){if(!K)F=X,X=fgetc(r),K=1;W=realloc(W,M+18);for(
Z=F&K?W[M++]=X,0:(C=W+M-fgetc(r)-X/16*256-1,3+X%16);Z--;W[M++]=*C++);}fwrite(W,
1,M,w);}

617 名前:デフォルトの名無しさん mailto:sage [02/07/31 23:05]
>>600>>616 をまとめただけです。
>exec {D|E} file1 file2

#include<stdio.h>
int Z,M,P;char*L,B[17],*W=B,*N,*R,*T,K;main(int X,char**v){FILE*r=fopen(v[2],
"rb"),*w=fopen(v[3],"wb");if(*v[1]-68){for(;~(X=fgetc(r));L[Z++]=X)L=realloc(L,
Z+1);for(N=L;N-L<Z;K+=K){if(!K)fwrite(B,K=1,W-B,w),W=B,*W++=0;for(X=0,(M=L-N+Z)
>18?M=18:0,(T=N-4096)<L?T=L:0;T<N;T++,P>X?X=P,R=T:0)for(P=0;P<M&&T[P]==N[P];P++
);X*=2<X;P=N-R;X?*W++=P>>8<<4|X-3:(*B|=K);*W++=X?N+=X,P:*N++;}T=B;M=W-B;}else{
for(;~(X=fgetc(r));K+=K){if(!K)P=X,X=fgetc(r),K=1;T=realloc(T,M+18);for(Z=P&K?T
[M++]=X,0:(R=T+M-fgetc(r)-X/16*256-1,3+X%16);Z--;T[M++]=*R++);}}fwrite(T,1,M,w);
}

618 名前:デフォルトの名無しさん [02/08/01 02:06]
クソスレの下に潜ってしまっているので上げ

619 名前:デフォルトの名無しさん mailto:sage [02/08/01 04:35]
>617、残り40文字弱

int Z,P,M,Q;char*L,*N,B[17],*W=B,F,K,*T;main(int X,char**v){FILE*r=fopen(v[2],
"rb"),*w=fopen(v[3],"wb");for(Q=*v[1]-68;~(X=fgetc(r));L[Z++]=X,K+=K){L=realloc
(L,Z+18);if(!Q){for(!K?F=X,X=fgetc(r),K=1:0,P=~F&K?T=L+Z-fgetc(r)-X/16*256-1,3+
X%16:1;--P;L[Z++]=*T++,X=*T);T=L;}}if(Q){for(N=L;N-L<Z;K+=K){if(!K)fwrite(B,K=1
,W-B,w),W=B,*W++=0;for(X=0,(M=L-N+Z)>18?M=18:0,(T=N-4096)<L?T=L:0;T<N;T++,P>X?Q
=N-T,X=P:0)for(P=-1;++P<M&&T[P]==N[P];);2<X?*W++=Q>>8<<4|X-3,N+=X:(*B|=K,Q=*N++
);*W++=Q;}L=B;Z=W-B;}fwrite(L,1,Z,w);}

620 名前:619 mailto:sage [02/08/01 04:38]
すまん、最初の#include<stdio.h>コピペし忘れた



621 名前:デフォルトの名無しさん mailto:sage [02/08/01 11:30]
stdlib.hは atoiだけの為みたいだから
extern int atoi(const char *s); と直接書いてはルールに触れる?


622 名前:デフォルトの名無しさん mailto:sage [02/08/01 13:24]
>>621
いいと思うよ。やってるの見た気がする。

623 名前:デフォルトの名無しさん mailto:sage [02/08/01 14:36]
>>619
fgetc() は getc() と置き換えてよい。
符号器の for(N=L; ...) を N=L=realloc(L, ...) にすると1文字短くなる。

あまり手伝えないなぁ

624 名前:623 mailto:sage [02/08/01 14:40]
>>619
そうか、N=L=realloc(L, ...) にすると、復号器側の T がいらなくなる。
T=L; を消せるし、if(!Q){...} のブレースもいらないな。

625 名前:623 mailto:sage [02/08/01 14:53]
ごめん、他にもいろいろ削れたんで、うpしちゃう。

#include <stdio.h>
int Z,P,M,Q;char*L,*N,B[17],*W=B,F,K,*T;main(int X,char**v){FILE*r=fopen(v[2],
"rb"),*w=fopen(v[3],"wb");for(Q=*v[1]-68;N=L=realloc(L,Z+18),~(X=getc(r));L[Z++
]=X,K+=K)if(!Q)for(!K?F=X,X=getc(r),K=1:0,P=~F&K?N=L+Z-getc(r)-X/16*256-1,3+X%
16:1;--P;L[Z++]=*N++,X=*N);if(Q){for(;N-L<Z;X>2?*W++=Q>>8<<4|X-3,N+=X:(*B|=K,Q=
*N++),*W++=Q,K+=K)for(X=!K?fwrite(B,K=1,W-B,w),W=B,*W++=0:0,(M=L-N+Z)>18?M=18:0
,(T=N-4096)<L?T=L:0;T<N;T++,P>X?Q=N-T,X=P:0)for(P=-1;++P<M&&T[P]==N[P];);L=B;Z=
W-B;}fwrite(L,1,Z,w);}

626 名前:*nix厨 mailto:sage [02/08/01 18:07]
もう少し短くしました
とりあえずここまでで、また縮むかもと思ったらBASICに手をつけます
これからオリジナルに挑戦、まずネタ探しから始めます

#include <stdio.h>
#include <stdlib.h>
int b[2<<16],f,g,i,n;char*p,l[103][80],c[80],*q,*r,x;S(){for(;*p==32;++p);}T(){
for(r="GET \0OTO \0PUT \0RUN\0 QUIT\0IF"+5*n++;*r&&*r==*p;++r)++p;return!*r&&(S
()|1);}I(){g=atoi(p);return*p-48?g?g:b[*(short*)p]:g;}main(){for(;;){gets(p=l[i
=100]);while(i<101){n=0;S();g=atoi(p);if(*(q=p)==48||g)for(p=l[g],q+=3;*p++=*q
++;)i=101;else p=!*q?l[++i]:T()?printf("?"),gets(c),b[*(short*)p]=atoi(c),l[++i
]:T()?l[i=I()]:T()?printf("%d\n",I()),l[++i]:T()?l[i=l[100][0]=0]:T()?exit(0),0
:T()?I()?p+3:l[++i]:(61-q[2]?puts("ERR"):(p=q+3,f=I(),x=p[2]-43,p+=3,g=I(),b[*(
short*)q]=x?x-2?x+1?x-4?x-17?x-19?x+10?x-18?x+6?f:f%g:f==g:f!=g:f>g:f<g:f/g:f*g
:f-g:f+g),l[++i]);}puts("OK");}}

627 名前:デフォルトの名無しさん mailto:sage [02/08/02 02:13]
とりあえずここまで縮んだ

#include<stdio.h>
int Z,P,Q;char*L,*N,B[17]="rb",*W=B,F,K,*T;main(int X,char**v){FILE*r=fopen(v[2
],B),*w=fopen(v[3],"wb");for(Q=*v[1]-68;N=L=realloc(L,18+Z),~(X=getc(r));L[Z++]
=X,K+=K)for(P=!Q?!K?F=X,X=getc(r),K=1:0,~F&K?T=L+Z-getc(r)-X/16*256-1,3+X%16:1:
1;--P;X=*T)L[Z++]=*T++;if(Q){for(;Z;Z-=(2<X?*W++=Q>>8<<4|X-3,N+=X,X:(*B|=K,Q=*N
++,1)),*W++=Q,K+=K)for(X=!K?fwrite(B,K=1,W-B,w),W=B,*W++=0:0,(T=N-4096)<L?T=L:0
;T<N;T++,P>X?Q=N-T,X=P:0)for(P=-1;++P<(Z>18?18:Z)&&T[P]==N[P];);L=B;Z=W-B;}
fwrite(L,1,Z,w);}

628 名前:561 mailto:sage [02/08/02 19:07]
Javaでブロック崩しと詰めロードランナー(番兵がいない奴(^^;))にも挑戦してみたけど、
ブロック崩しの方は16行、詰めロードランナーの方は17行と敗北…(;_;)
う〜む、題材が無謀過ぎたか。


629 名前:デフォルトの名無しさん [02/08/02 19:57]
7行達成したのでageときます

#include <stdio.h>
int Z,P,Q;char*L,*N,B[17],F,K,*T;main(int X,char**v){FILE*r=fopen(v[2],"rb"),*w
=fopen(v[3],"wb");for(X=*v[1]-69;N=L=realloc(L,18+Z),~(Q=getc(r));K+=K,L[Z++]=Q
)for(P=X?!K?F=Q,Q=getc(r),K=1:0,~F&K?T=L+Z-getc(r)-Q/16*256-1,3+Q%16:1:1;--P;Q=
*T)L[Z++]=*T++;if(!X){for(;Z-=X;2<X?B[P++]=Q>>8<<4|X-3:(*B|=K,Q=*N,X=1),N+=X,B[
P++]=Q,K+=K)for(X=!K?fwrite(B,K=1,P,w),P=1,*B=0:0,(T=N-4096)<L?T=L:0;T<N;T++,F>
X?Q=N-T,X=F:0)for(F=0;F<(Z>18?18:Z)&&T[F]==N[F];F++);L=B;Z=P;}fwrite(L,1,Z,w);}

630 名前:デフォルトの名無しさん [02/08/02 21:16]
前スレの雰囲気が出てきたね



631 名前:デフォルトの名無しさん [02/08/02 21:20]
始めまして。なんか最近面白いサイトが出来たみたいですよ。
掲示板とチャットルームがくっついたサイト?!ですかね。
キャラクター(笑)とかがタダで持てたり、着替えさしたり・・・・
でも今だけらしいですよ入会無料なのって!!
詳しくは下記URLをクリックして、確かめて!!

www.e-mansion.co.jp/co/ac.html

632 名前:デフォルトの名無しさん mailto:sage [02/08/02 22:25]
>>628=561
とりあえずうpしてみてください。
一人で縮めるより、みんなでああだこうだすると、
思いがけないテクニックが考案されたりして、どんどん縮まるよ。

633 名前:561 mailto:sage [02/08/02 22:57]
>>632
了解っす!
まずはブロック崩しから…。(現在16行)

import java.awt.*;public class B{public static void main(String[]a){new Frame()
{int W=23,H=32,P=7,U=6,b=W/2+(H-4)*W,n,d=56,p=W/2+(H-3)*W,g,l,t,o,i,j,k;int[]m=
new int[W*H];{Canvas c=new Canvas(){{setSize(W*U,H*U);}public void update(
Graphics g){for(int i=0;i<W*H;i++){g.setColor(m[i]>0?Color.BLACK:Color.WHITE);g
.fillRect(i%W*U,i/W*U,U,U);}}public boolean handleEvent(Event e){if(e.id==503){
int n;if((n=e.x/U)<1)n=1;if(n>W-2)n=W-2;p=n+(H-3)*W;}if(e.id==501)g=l;return 1>
0;}};for(;i<H;i++){m[j=i*W]=m[W-1+j]=1;if(i%3==1&i>3&i<=H/2)for(k=6-i/3%2*2;k<W
-6;k+=4){m[k+j]=m[k+1+j]=2;l++;}}for(i=W;i>0;){m[--i]=1;m[i+H*W-W]=4;}add(c);
pack();show();try{for(;;Thread.sleep(50)){m[n=b]=0;if(g>0){n+=v((d+16)%64)+v(d)
*W;o=m[n];if(o>0){i=n%W;j=n/W*W;d=(m[b%W+j]>0)?(m[i+b/W*W]>0)?(d+32)&63:-d&63:d
&32|(32-d)&31;if(o==2){m[k=(i&~1)+j]=m[k+1]=0;if(--l<1)g=0;}if(o==3){if((d+=(b%
W-p%W)*2/3)<36)d=36;if(d>60)d=60;}if(o==4){b=p-W;d=56;g=0;}}else b=n;}else b=p-
W;i=(H-3)*W;for(k=0;k<W;k++)m[k+i]=0;m[i]=m[W-1+i]=1;for(k=(j=p)-P/2;k<=j+P/2;k
++)if(k>=(H-3)*W&k<(H-2)*W)m[k]=3;m[b]=1;t=(t+1)%8;c.repaint();}}catch(
Exception e){}}int v(int d){int n;if((n=d%32)>16)n=32-n;return n*(t+1)/8>n*t/8?
(d<32)?1:-1:0;}};}}

アルゴリズム自体試行錯誤中なので、まだ最適化をしてません。
((H-2)*W→690みたいな…)
そこら辺を直せば1〜2行は縮まりそうですが、とても7行は無理っぽい…(;_;)

ボールの数は無制限です(^^;)
それから、終了はControl+Cで…。


634 名前:561 mailto:sage [02/08/02 23:11]
おっと、言い忘れましたが633はB.javaです。
続いて、詰めロードランナー。(L.java : 現在17行)

import java.awt.*;import java.io.*;public class L extends Frame{int W,H,T,U=12,
p,t,v,g,e,l,r,u,d,a,b,i,j,k,x,y,m[],w[];char[]q={'□','田','田',' ', ' ̄','#',
' ','◎','★'};L(String n){try{BufferedReader f=new BufferedReader(new
FileReader(n));W=Integer.valueOf(f.readLine()).intValue();H=Integer.valueOf(f.
readLine()).intValue();m=new int[T=W*H];w=new int[T];for(;i<T;){if((j=i%W)<1)n=
f.readLine();if((m[i]=(int)n.charAt(j)-48)>7)m[p=i]=3;if(m[i++]>6)g++;}Canvas
c=new Canvas(){{setSize(W*U,H*U);}public void paint(Graphics g){for(k=T;--k>=0;
)g.drawChars(q,m[k],1,k%W*U,k/W*U+U);g.drawChars(q,8,1,p%W*U,p/W*U+U);}};add(c)
;pack();show();m:for(;g>0|p>W*2;Thread.sleep(20)){e=0;for(i=T;--i>=0;)if(w[i]>0
&&--w[i]<1){e=m[i]=1;if(i==p)break m;}if((i=m[p])>6){m[e=p]=3;if(--g<1)for(j=T;
--j>=0;)if(m[j]==6)m[j]=5;}if(t>0)t--;else{v=(i!=4&i!=5&(j=m[p+W])!=0&j!=1&j!=5
|d>0&j>1)?W:(u>0&i==5&m[p-W]>2)?-W:(l>0&m[p-1]>2)?-1:(r>0&m[p+1]>2)?1:0;if(v!=0
){p+=v;e=t=4;}else{if(a>0)v=p+W-1;if(b>0)v=p+W+1;if(v>0&m[v]==1)if((j=m[v-W])==
3|j==6){m[v]=3;e=w[v]=500;}}}if(e>0)c.repaint();}}catch(Exception e){}}public
boolean handleEvent(Event e){if((x=402-e.id)>=0&x<2){y=e.key;if(y==52)l=x;if(y
==54)r=x;if(y==56)u=x;if(y==50)d=x;if(y==90|y==122)a=x;if(y==88|y==120)b=x;}
return 1>0;}public static void main(String[]a){new L(a[0]);}}

番兵はおらず、ひたすら穴を掘って金塊を集めます(笑)
こちらは、ゲームの面データを外部から与える形式なので、単独では動きません。

java L map.txt

として、テキストファイルで面データを指定します。
(ずるいかな?(^^;))
現時点で思いつくかぎりの最適化をしましたが、これ以上は縮まらず…(;_;)


635 名前:561 mailto:sage [02/08/02 23:22]
634の詰めロードランナー用面データはこんな感じ↓で作ります。

12
7
000000000000
033333333360
033334337360
075112115360
035177715360
035177715860
000000000000

1行目に幅、2行目に高さを指定します。
配置するブツの番号は

0 : ブロック(掘れない)
1 : レンガ(掘れる)
2 : 落とし穴(外見はレンガと同じ)
3 : 空白
4 : バー
5 : はしご
6 : 脱出はしご
7 : 金塊
8 : ロードランナー

です。
なお、画面端の判定を行っていないため、面データの周囲はブロックで囲ってください。
(アルゴリズム的な意味の『番兵』(笑))

オマケで、逆転掘りデータ(^^;)

7
10
0000000
0353330
0353330
0158310
0131510
0151310
0131510
0151710
0111110
0000000


636 名前:デフォルトの名無しさん mailto:sage [02/08/03 00:08]
>>631
勿論7行で作ったんだよね?
出来ればソース欲しいかも

637 名前:デフォルトの名無しさん [02/08/03 00:21]
>>636
perlとかなら7行掲示板作れそうだな。
荒らし対策とかは無理だろうけど。

638 名前:デフォルトの名無しさん mailto:sage [02/08/03 00:28]
webprogかどっかで見掛けたよ、掲示版。
見付けたら張ります。

639 名前:デフォルトの名無しさん mailto:sage [02/08/03 00:37]
>>637-638
>>2

640 名前:デフォルトの名無しさん mailto:sage [02/08/03 01:02]
>>633
定数HやWなんかは、定数でいいと思うよ



641 名前:デフォルトの名無しさん mailto:sage [02/08/03 01:12]
>>633 これは難しいねぇ。 >>20 を参考にして少し何とかできませんかね?

import java.awt.*;public class B{public static void main(String[]a){new Frame()
{int W=23,H=32,P=7,U=6,b=W/2+(H-4)*W,n,d=56,p=W/2+(H-3)*W,g,l,t,o,i,j,k;int[]m=
new int[W*H];{Canvas c=new Canvas(){{setSize(W*U,H*U);}public void update(
Graphics g){for(int i=0;i<W*H;g.fillRect(i%W*U,i++/W*U,U,U))g.setColor(m[i]>0?
Color.BLACK:Color.WHITE);}public boolean handleEvent(Event e){int n=e.x/U;n=n<1
?1:n>W-2?W-2:n;p=e.id==503?n+(H-3)*W:p;g=e.id==501?l:g;return 1>0;}};for(;i<H;i
++){m[j=i*W]=m[W-1+j]=1;if(i%3==1&i>3&i<=H/2)for(k=6-i/3%2*2;k<W-6;k+=4,l++)m[k
+j]=m[k+1+j]=2;}for(i=W;i>0;m[i+H*W-W]=4)m[--i]=1;add(c);pack();show();try{for(
;;Thread.sleep(50)){m[b]=0;o=m[n=b+v((d+16)%64)+v(d)*W];if(g>0)if(o>0){i=n%W;j=
n/W*W;d=m[b%W+j]>0?m[i+b/W*W]>0?(d+32)&63:-d&63:d&32|(32-d)&31;if(o==2){m[k=(i&
~1)+j]=m[k+1]=0;g=--l<1?0:g;}if(o==3){d+=(b%W-p%W)*2;d=d/3<36?36:d>60?60:d;}if(
o==4){b=p-W;d=56;g=0;}}else b=n;else b=p-W;m[i=(H-3)*W]=1;for(k=W-1;k>1;)m[--k+
i]=0;for(k=(j=p)-P/2;k<=j+P/2;k++)if(k>=(H-3)*W&k<(H-2)*W)m[k]=3;m[b]=1;t=(t+1)
%8;c.repaint();}}catch(Exception e){}}int v(int d){o=d%32;o=o>16?32-o:o;return
o*(t+1)/8>o*t/8?(d<32)?1:-1:0;}};}}

642 名前:デフォルトの名無しさん mailto:sage [02/08/05 13:29]
>>633とは別のブロック崩しを自分で作ってみました(現在9行)
JAVAアプレットです

C.java

import java.awt.*;public class C extends java.applet.Applet{int W=15,H=21,x=1,y
=W,i,m[]=new int[W*H],p=278,b=290;{for(;i<W*11;m[i++]=i<W?2:1);for(i=0;i<H;m[i*
W]=m[i++*W+14]=2);for(i=0;i<5;m[b+i++]=2);new Thread(){public void run(){try{
for(;;p+=x+y,repaint(),Thread.sleep(80))while(s(0,y)|s(x,0)|s(x,y));}catch(
Exception e){}}}.start();}boolean s(int t,int u){if((i=m[p+t+u])>0){x-=t*2;y-=u
*2;m[p+t+u]-=i>1?0:2;}return i>0;}public boolean keyDown(Event e,int k){if(k==
1007&m[b+5]<2){m[b]=0;m[b+++5]=2;}if(k==1006&m[b-1]<2){m[b+4]=0;m[b---1]=2;}
return 1>0;}public void paint(Graphics g){for(i=0;i<W*H;i++)g.drawString(m[i]>0
|i==p?"■":"□",i%W*10,i/W*10);}}

C.html

<HTML><BODY>
<APPLET code="C.class" width="150" height="200"></APPLET>
</BODY></HTML>

jdk1.4の場合、javac -target 1.1 C.java としてください
appletviewerおよびIE5で動作確認済(ちらつくのは仕様です)

643 名前:561 mailto:sage [02/08/05 18:55]
>>641
参考になりました。三項演算子を効果的に使うんですね。
かなり短縮できました。(ブロック崩し - B.java : 現在13行)

import java.awt.*;public class B{public static void main(String[]a){new Frame()
{int W=26,H=33,T=W*H,P=7,U=6,b=1+W,d=56,p=1+T-W*3,g,l,t,i,j,k,u,m[]=new int[T];
{Canvas c=new Canvas(){{setSize(W*U,H*U);}public void update(Graphics g){for(u=
0;u<T;g.fillRect(u%W*U,u++/W*U,U,U))g.setColor(m[u]>0?Color.BLACK:Color.WHITE);
}public boolean handleEvent(Event e){k=e.x/U;k=k<1?1:k>W-2?W-2:k;p=e.id==503?k+
T-W*3:p;g=e.id==501?l:g;return 1>0;}};for(;i<T;i++)m[i]=(j=i/W)>=H-1?4:j<1|(k=i
%W)<1|k>W-2?1:j>3&j<H/2+2&j%3>1&k>3&k<W-4&((j/3^k/2)&1)>0?2+0*++l:0;l/=2;add(c)
;pack();show();try{for(;;Thread.sleep(50)){m[b]=0;i=g>0?b+v((d+16)%64)+v(d)*W:p
-W;j=g>0?m[i]:0;if(j>0){d=m[i%W+b/W*W]>0?m[b%W+i/W*W]>0?(d+32)&63:(32-d)&63:-d&
63;if(j==2){m[i]=m[i^1]=0;g=--l<1?0:g;}if(j==3)d=(d+=b%W-p%W)<36?36:d>60?60:d;
if(j==4){d=56;g=0;}i=b;}m[b=i]=1;i=p%W-P/2;for(j=0;j<W;j++)m[j+T-W*3]=j>=i&j<i+
P?3:j<1|j>W-2?1:0;t=(t+1)%8;c.repaint();}}catch(Exception e){}}int v(int d){j=d
%32;j=j>16?32-j:j;return j*(t+1)/8>j*t/8?d<32?1:-1:0;}};}}

ただ、「g=--l<1?0:g;」のような処理はアトミックじゃないので、別スレッドから変更さ
れた場合に、やや心配ではありますが。(取り越し苦労?(^^;))

>>642
やっぱり仕様そのものが問題だったかも(^^;)
ラケットの位置により反射角度が変化ってのはオーバースペックかな?
あと、ApplicationよりAppletの方が短くできそうですね。


644 名前:デフォルトの名無しさん mailto:sage [02/08/05 21:38]
ShiftJISのヒルベルト曲線
EUCは33962→43180で大丈夫ではないかと

#include <stdio.h>
#include <stdlib.h>
main(int k,char**v){int a[]={17699,43061,39682,43056,17779,17697,47768,39746,
45464,31384,42549,27458},m,s,x,y;for(y=m=1<<atoi(v[1]);y--;puts(""))for(x=m;x--
;s=33962+s%6,printf("%c%c",s>>8,s))for(s=0,k=m;k/=2;s=(a[s]>>((x&k?0:4)+(y&k?0:
8)))&15);}

実行例
┓┏━┓┏━┓┏
┗┛┏┛┗┓┗┛
┏┓┗┓┏┛┏┓
┃┗━┛┗━┛┃
┗┓┏━━┓┏┛
┏┛┗┓┏┛┗┓
┃┏┓┃┃┏┓┃
┗┛┗┛┗┛┗┛

645 名前:デフォルトの名無しさん [02/08/05 21:41]
>>644
ヒルベルト走査は作ろうと思ってたんだが、先を越されてしまったな。
Java で作ろうと思ってたから、これより短くなることはなかっただろう。

いや、お見事。

646 名前:デフォルトの名無しさん [02/08/05 21:59]
どこが曲線なの?

647 名前:デフォルトの名無しさん mailto:sage [02/08/05 22:15]
>>646
お前…

648 名前:デフォルトの名無しさん mailto:sage [02/08/05 22:17]
>>646
今小学校何年生ですか?
曲線は、中学までに習うはず。それまでがまんがまん。

649 名前:age mailto:age [02/08/06 01:06]
カラアゲうまうま

650 名前:デフォルトの名無しさん mailto:sage [02/08/06 01:28]
>>643
私ごときが口を挟むのは失礼とは存じますが、、

public class B { を、class B にして7文字。
Color.black,Color.white を、Color.red, Color.blue で3文字。
32 をint変数として、2文字。
Thread.sleep(50) を、Thread.sleep(H) として1文字(汗;

以上、重箱の隅をつついてみました。



651 名前:561 mailto:sage [02/08/07 00:08]
>>650
>私ごときが口を挟むのは失礼とは存じますが、、

いやいや、そんなことはありませんです。参考になります。
特に、mainのクラスがpublicじゃなくてもいいというのは知りませんでした。
(SUNのサンプルにも非publicなクラスがありますから、安心して使えそうですね)
java.sun.com/docs/books/jls/second_edition/html/intro.doc.html#11484
7文字減らせますから、七行スレのJava使いには朗報です。

# 赤青の方も試してみましたが…目にキツいですね(笑)

成果を採り入れて、詰めロードランナーが一行縮みました。(L.java : 現在16行)

import java.awt.*;import java.io.*;class L extends Frame{int W,H,T,U=12,p,t,g,e
,l,r,u,d,a,b,i,j,k,x,y,m[],w[];char[]q={'□','田','田',' ', ' ̄','#',' ','◎',
'★'};L(String n){try{BufferedReader f=new BufferedReader(new FileReader(n));W=
Integer.valueOf(f.readLine()).intValue();H=Integer.valueOf(f.readLine()).
intValue();m=new int[T=W*H];w=new int[T];for(;i<T;g+=m[i++]>6?1:0){n=(j=i%W)<1?
f.readLine():n;if((m[i]=(int)n.charAt(j)-48)>7)m[p=i]=3;}Canvas c=new Canvas(){
{resize(W*U,H*U);}public void paint(Graphics g){for(k=T;k-->0;)g.drawChars(q,m[
k],1,k%W*U,k/W*U+U);g.drawChars(q,8,1,p%W*U,p/W*U+U);}};add(c);pack();show();m:
for(;g>0|p>W*2;Thread.sleep(20)){e=0;for(i=T;i-->0;)if(w[i]>0&&--w[i]<1){e=m[i]
=1;if(i==p)break m;}if((i=m[p])>6){m[e=p]=3;if(--g<1)for(g=T;g-->0;)m[g]-=m[g]>
5?1:0;}if(t>0)t--;else{p+=i=i!=4&i!=5&(j=m[p+W])>1&j!=5|d>0&j>1?W:u>0&i==5&m[p-
W]>2?-W:l>0&m[p-1]>2?-1:r>0&m[p+1]>2?1:0;if(i!=0)e=t=4;if(i==0&(i=a>0?p+W-1:b>0
?p+W+1:0)>0&m[i]==1)if((j=m[i-W])==3|j==6){m[i]=3;e=w[i]=500;}}if(e>0)c.repaint
();}}catch(Exception e){}}public boolean handleEvent(Event e){y=(x=402-e.id)>=0
&x<2?e.key-48:0;l=y==4?x:l;r=y==6?x:r;u=y==8?x:u;d=y==2?x:d;a=y==42|y==74?x:a;b
=y==40|y==72?x:b;return 1>0;}public static void main(String[]a){new L(a[0]);}}

7行には達するべくもなさそうですが、結構気に入ってます。
(最近更新してない自分のサイトにでも置こうかな…(^^;))


652 名前:デフォルトの名無しさん mailto:sage [02/08/08 03:31]
ヒルベルト走査関連

走査順に座標を求める
#include<stdio.h>
#include<stdlib.h>
main(int w,char**v){size_t k,m=1<<atoi(v[1]),n=m*m,s,t,x,y,z;for(;n--;printf(
"%d(%d,%d)\n",m*m+~n,x,y))for(x=y=0,t=n,s=54,k=m;k/=2;t%=k*k,x+=w&68?k:0,y+=w>4
?0:k,s=--z&2?z&1?(s&195)+(s&12)*4+(s/4&12):(s&60)+s/64+s%4*64:s)for(w=64;t-(z=s
/w%4)*k*k>=k*k;w/=4);}

座標から走査順を求める
#include<stdio.h>
#include<stdlib.h>
main(int w,char**v){int k,m=1<<atoi(v[1]),s,t,x,y=m;for(;y--;puts(""))for(x=m;x
--;printf("%02X ",t))for(t=0,s=54,k=m;k/=2;w=(s>>((y&k?4:0)+(x&k?2:0)))&3,t+=k*
k*w,s=--w&2?w&1?(s&195)+(s&12)*4+(s/4&12):(s&60)+s/64+s%4*64:s);}

↑を利用しBITMAPCOREHEADERのBMPを出力
#include<stdio.h>
#include<stdlib.h>
FILE*f;O(a,b){for(;b--;a>>=8)putc(a,f);}main(int w,char**v){int k,m=1<<atoi(v[1
]),s,t,x,y;f=fopen("hilbert.bmp","wb");O(19778,2);O(m*m*3+26,8);O(26,4);O(12,4)
;O(m*65537,4);O(1572865,4);for(y=m;y--;)for(x=m;x--;O(t,3))for(t=0,s=54,k=m;k/=
2;w=(s>>((y&k?0:4)+(x&k?2:0)))&3,t+=k*k*w,s=--w&2?w&1?(s&12)*4+(s&195)+(s/4&12)
:s/64+(s&60)+s%4*64:s);}

BITMAPINFOHEADERのBMPを出力
#include<stdio.h>
#include<stdlib.h>
FILE*f;O(a,b){for(;b--;a>>=8)putc(a,f);}main(int w,char**v){int k,m=1<<atoi(v[1
]),s,t,x,y;f=fopen("hilbert.bmp","wb");O(19778,2);O(m*m*3+54,8);O(54,4);O(40,4)
;O(m,4);O(m,4);O(1572865,8);O(m*m*3,4);O(x=11812,4);O(x,12);for(y=m;y--;)for(x=
m;x--;O(t,3))for(t=0,s=54,k=m;k/=2;w=(s>>((y&k?0:4)+(x&k?2:0)))&3,t+=k*k*w,s=--
w&2?w&1?(s&12)*4+(s&195)+(s/4&12):s/64+(s&60)+s%4*64:s);}

BMP2種はMSPAINTとGIMPで表示を確認






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](;´∀`)<349KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef