ログイン
編集不可のページディスカッション情報添付ファイル
"CodeGolf"の差分

MMA
16と17のリビジョン間の差分
2010-10-21 00:46:09時点のリビジョン16
サイズ: 2695
編集者: ytoku
コメント:
2010-10-21 00:58:29時点のリビジョン17
サイズ: 3152
編集者: clear
コメント:
削除された箇所はこのように表示されます。 追加された箇所はこのように表示されます。
行 98: 行 98:

== 四則演算と剰余 ==
=== Before: ===
なぜかまだ書いていない。
=== After: ===
{{{#!highlight c
#define p(x) printf("%d%s%d=%d\n",a,#x,b,a x b);
a;main(b){scanf("%d%d",&a,&b);p(+)p(-)p(*)b&&p(/)b&&p(%)}
}}}
(107B)
 * defineは1つで十分だった。可読性もささやかに向上
 * printf("%d"#x"%d=%d\n",a,b,a x b)として1Bの節約を図ったら、p(%)で%d%%d=...と展開された結果残念なことになった

renda/golf

ゴルフ大会会場

鶴亀算

Before:

   1 #include <stdio.h>
   2 
   3 int main(void)
   4 {
   5   int num,leg,tsuru,kame;
   6   printf("鶴と亀の数の合計 ? ");
   7   scanf("%d",&num);
   8   printf("鶴と亀の足の本数の合計 ? ");
   9   scanf("%d",&leg);
  10   kame = (leg - 2 * num) / 2;
  11   tsuru = num - kame;
  12   printf("鶴と亀の数の合計 %d\n",num);
  13   printf("鶴と亀の足の本数の合計 %d\n",leg);
  14   printf("鶴 %d 羽, 亀 %d 匹\n",tsuru,kame);
  15 
  16   return 0;
  17 }

After:

   1 #define P;printf("%s%s "
   2 #define S;scanf("%d",
   3 s="鶴と亀の",y="足の本数の合計";main(n,l){P"? ",s,y+6)S&n)P"? ",s,y)S&l)P"%d\n%s%s %d\n鶴 %d 羽, 亀 %d 匹\n",s,y+6,n,s,y,l,n*2-l/2,l/2-n);}

(187B)

  • ポインタの関係で32bitでないと動かない。intが16bitの環境でも動かない。
  • EUC-JPでないとポインタの演算が合わないのでy+6を書き換える必要アリ。

Revised (ytoku):

   1 #define P;printf("%s%s "
   2 #define S y);scanf("%d",
   3 s="鶴と亀の",y="足の本数の合計";main(n,l){P"? ",s,6+S&n)P"? ",s,S&l)P"%d\n",s,y+6,n)P"%d\n鶴 %d 羽, 亀 %d 匹\n",s,y,l,n*2-l/2,l/2-n);}

(185B)

PKU 1006

http://poj.org/problem?id=1006

Before:

   1 #include <stdio.h>
   2 
   3 #define C_PHY 23
   4 #define C_EMO 28
   5 #define C_INT 33
   6 
   7 int findpeak(int a, int ca, int b, int cb)
   8 {
   9     a -= b;
  10     while (a % cb != 0) {
  11         a += ca;
  12     }
  13     return a+b;
  14 }
  15 
  16 int main()
  17 {
  18     int n;
  19     for (n = 1; ; n++) {
  20         int p, e, i, d;
  21         scanf("%d %d %d %d", &p, &e, &i, &d);
  22         if (p == -1) break;
  23 
  24         int tmp;
  25         tmp = findpeak(e, C_EMO, i, C_INT);
  26         tmp = findpeak(tmp, C_EMO*C_INT, p, C_PHY);
  27         
  28         tmp -= d;
  29         if (tmp <= 0) tmp += C_EMO*C_INT*C_PHY;
  30         else if (tmp > C_EMO*C_INT*C_PHY) tmp -= C_EMO*C_INT*C_PHY;
  31 
  32         printf("Case %d: the next triple peak occurs in %d days.\n", n, tmp);
  33     }
  34     return 0;
  35 }
  • golf版にアルゴリズムを合わせてあります

After:

   1 main(n,p,e,i,d){for(;scanf("%d%d%d%d",&p,&e,&i,&d),p+1;printf("Case %d: the next triple peak occurs in %d days.\n",n++,(i-d+21251)%21252+1))while((i-p)%23|(i-e)%28)i+=33;}

(171B)

  • ホールインワンは157Bらしい
    • Googleで検索するとそのコードが最上位に出てくるけれどもうちょっと考えたいところ
  • mainの第一引数 == 1 (コマンドライン引数がなければ)

四則演算と剰余

Before:

なぜかまだ書いていない。

After:

   1 #define p(x) printf("%d%s%d=%d\n",a,#x,b,a x b);
   2 a;main(b){scanf("%d%d",&a,&b);p(+)p(-)p(*)b&&p(/)b&&p(%)}

(107B)

  • defineは1つで十分だった。可読性もささやかに向上
  • printf("%d"#x"%d=%d\n",a,b,a x b)として1Bの節約を図ったら、p(%)で%d%%d=...と展開された結果残念なことになった

CodeGolf (最終更新日時 2013-07-24 21:33:54 更新者 ytoku)