以前スレッドに張られた7行UNIXシェルを短くしてみた。 気になった点をちょちょいと、
ただ短くしただけだけなのでまだまだ改良の余地はあると思う。
これでパイプとかリダイレクトとか実装できるかもね
extern struct _IO_FILE *stdin;extern char**environ;main(int c,char**a){char*V[
9],B[99],**A,*C,i;for(environ=a+1;printf(">")&&fgets(B,99,stdin);){*strchr(B,
10)=0;for(*(A=V)=C=B;C=strchr(C,32);*++A=C)*C++=0;*++A=0;if(!strcmp(*V,"exit")
)exit(0);if(strcmp(*V,"cd")||chdir(V[1])){switch(fork()){case 0:execvp(*V,V);
case-1:puts("err");exit(0);}wait(0);}}}
./ish PATH=/usr/bin TZ=-9 てな感じで環境変数とか設定とか云々カンヌん。
しかしなぜishなのか? BASE64みたいなアレと関係あるのかなぁ
Code Golfに関するブログを読んでたら、
> for を main()に…
なんて記述があったのでパクってみた。
mainの中身全体をくくるforの代わりに、mainを再帰することでループを実現する。
で、できたコードがこれ。
ちなみに問題はこれ → http://golf.shinh.org/p.rb?Smileys+Triangle
j;
main(i){
for(j=0;j<i;j++)
printf(j<3?":\0-\0)"+j*2:"))");
puts("")&&i<34&&main(i+1),exit(1);
}
ちぢまらねぇーーーーーーーーー
iが34までいったところで終了せにゃならんから、どうしても i<34 と exit(1) は外せない(と思う)んだけど、
それだけですでに for(;i<34;) と同じだけ文字数がかかる罠。
iをグローバルにして main の引数をなくしてもほとんど縮まらず。まず main が4文字もあるし。
さらになにをやってるのかくそ分かりにくい。最後の一行なんかまさにカオス。
明日見たらもう分からんなこれ。
http://golf.shinh.org/
面白そうなのでやってみた。ハマる。
http://golf.shinh.org/p.rb?Smileys+Triangle
んで、↑の問題がCでどんなにがんばっても79バイトより短くなる気がしない。
i;
main(j){
for(;i++<34;puts(""))
for(j=0;j<i;j++)
printf(j<3?":\0-\0)"+j*2:"))");
}
これでスペースと改行を削って79バイト。
一位の人は63バイトなんだけど無理だろ。
system(“perl …”) とかしてるんだろうか・・・
systemとかexecとか使わずにもっと縮むよ!って人がいたら教えてくれ。
アーキテクチャ依存(スタックの構造を仮定したり)はギリギリ許す。
(けどこの問題はそれで縮む気があまりしない・・・ やり方を変えてforを一個減らすしかないか?)
厶板-七行プログラミング part5より
7行テトリスが6行になったようで
637 名前:◆EZ4MK1.tr. [sage]: 2007/12/24(月) 21:35:43
<body id=D onKeyDown=K=event.keyCode-38 onload='Z=X=[B=A=12];Y=function(){for(C
=[q=c=i=4];f=i--*K;c-=!Z[h+(K+6?p+K:C[i]=p*A-(p/9|0)*145)])p=B[i];for(c?0:K+6?h
+=K:t?B=C:0;i=K=q--;f+=Z[A+p])k=X[p=h+B[q]]=1;h+=A;if(f|B)for(Z=X,X=[l=228],B=[
[-7,-20,6,h=17,-9,3,3][t=++t%7]-4,0,1,t-6?-A:2];l--;)for(l%A?l-=l%A*!Z[l]:(P+=
k++,c=l+=A);--c>A;)Z[c]=Z[c-A];for(S="";i<240;S+=X[i]|(X[i]=Z[i]|=++i%A<2|i>228
)?i%A?"■":"■<br>":"_");D.innerHTML=S+P;Z[5]||setTimeout(Y,i-P)};Y(h=K=t=P=0)'