VIP de Programming

   

気になった発言とか簡易まとめ
ある程度まとまったらwikiにうpしよう!
レス集

[C]新しいデバッグ表示の提案

234: 2008/05/23(金) 03:57:52.38 ID:sM2jNusj0 (3)

ねぇねぇ、こんなのどう思いますか?

#define DEBUGMODE
#ifdef DEBUGMODE
#define DBG if(1)
#else
#define DBG if(0)
#endif

void main(){
    DBG printf("デバッグモードの時だけ表示される情報だよ\n");
}

#define DEBUGMODE の行をコメントアウトしてコンパイルしたら、 最適化されてDBGの行は消してからコンパイルされるよね?

#ifdef DEBUGMODE
printf("デバッグモードの時だけ表示される情報だよ\n");
#endif

よりも見やすいと思うんだけど・・・。

269: 2008/05/23(金) 21:40:42.30 ID:cRvPjj4q0

gcc (GCC) 4.1.3なら-O0、オプション無しですら消される


これの味噌は、デバッグprint以外にもDBG exit(1);とかDBG i++;とかができる点にあります。

249: 2008/05/23(金) 18:16:39.06 ID:uN5A9fC70 (4)

しかし、

DBG {
  hoge_dbg();
}
else { 
  hoge();
}

これはキモいな

http://ex25.2ch.net/test/read.cgi/news4vip/1211348705/234,269,249

Permalink
Comments (View)

[C][Golf]7行UNIXシェル

以前スレッドに張られた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みたいなアレと関係あるのかなぁ

Permalink
Comments (View)

Code Golf その2

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文字もあるし。

さらになにをやってるのかくそ分かりにくい。最後の一行なんかまさにカオス。
明日見たらもう分からんなこれ。

Permalink
Comments (View)
tags C Golf

Code Golf

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を一個減らすしかないか?)

Permalink
Comments (View)