/* そんなdefineで大丈夫か? */ /* 一番短いコードを頼む */ <> = 鶴亀算 = == Before: == {{{#!highlight c #include int main(void) { int num,leg,tsuru,kame; printf("鶴と亀の数の合計 ? "); scanf("%d",&num); printf("鶴と亀の足の本数の合計 ? "); scanf("%d",&leg); kame = (leg - 2 * num) / 2; tsuru = num - kame; printf("鶴と亀の数の合計 %d\n",num); printf("鶴と亀の足の本数の合計 %d\n",leg); printf("鶴 %d 羽, 亀 %d 匹\n",tsuru,kame); return 0; } }}} == After: == {{{#!highlight c #define P;printf("%s%s " #define S;scanf("%d", 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): == {{{#!highlight c #define P;printf("%s%s " #define S y);scanf("%d", 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) * 最後のprintfを分割して"%s%s "部分の省略を図ったのと、Sにy)を取り込んだので、それぞれ1B稼げました。 = PKU 1006 = http://poj.org/problem?id=1006 == Before: == {{{#!highlight c #include #define C_PHY 23 #define C_EMO 28 #define C_INT 33 int findpeak(int a, int ca, int b, int cb) { a -= b; while (a % cb != 0) { a += ca; } return a+b; } int main() { int n; for (n = 1; ; n++) { int p, e, i, d; scanf("%d %d %d %d", &p, &e, &i, &d); if (p == -1) break; int tmp; tmp = findpeak(e, C_EMO, i, C_INT); tmp = findpeak(tmp, C_EMO*C_INT, p, C_PHY); tmp -= d; if (tmp <= 0) tmp += C_EMO*C_INT*C_PHY; else if (tmp > C_EMO*C_INT*C_PHY) tmp -= C_EMO*C_INT*C_PHY; printf("Case %d: the next triple peak occurs in %d days.\n", n, tmp); } return 0; } }}} * golf版にアルゴリズムを合わせてあります == After: == {{{#!highlight c 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: == {{{#!highlight c #include int main(void) { int a, b; printf("input two numbers\n"); scanf("%d%d", &a, &b); printf("%d+%d=%d\n", a, b, a + b); printf("%d-%d=%d\n", a, b, a - b); printf("%d*%d=%d\n", a, b, a * b); if (b) { printf("%d/%d=%d\n", a, b, a / b); printf("%d%%%d=%d\n", a, b, a % b); } return 0; } }}} == 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=...と展開された結果残念なことになった == Revised (renda): == {{{#!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(%)} }}} (106B) *p(x)の後のSpaceいらないよね! *一応hijiri(x86_64)のgccで通ることは確認。sunやnestだとどうでしょう *そうか、気付かなかった...sunでもnestでも通りました == Revised (ytoku): == {{{#!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(/)p(%);} }}} (104B) *b&&が二回出てくるのが気になって一つの式に納められないか考えたらすんなり = ICPC2010 インターネット予選 A問題 = == Before: == あとで (1103B) == After: == {{{{#!highlight c #define K scanf("%d", #define I(x)for(x=N;--x;) #define L(a,b,c)I(i)I(j)if(k[i][j])b=b>a?b:a,c=a int main(void) { char str[4], rts[4]; printf("文字列を入力してください "); scanf("%3s", str); rts[0] = str[2]; rts[1] = str[1]; rts[2] = str[0]; rts[3] = str[3]; printf("%s %s %s %s \n ", str, rts, str, rts); return 0; } }}} (299B) == After: == {{{#!highlight c #define P(x);printf("%s ",x); #define S(i);r[i]=s[2-i] char str[4],rts[4],*s,*r=rts;main(){P("文字列を入力してください")s=gets(str)S(0)S(1)S(2)P(s)P(r)P(s)P(r)P("\n")} }}} (168B) *main関数の中にセミコロンが1つもないCのコードである。Pの汎用性は計りしれない *Pの効果はprintfが3つ以上現れたときに発揮される *引数に特定のパターンがあればもっと効果を発揮する *グローバル変数は0で初期化される *warning: this program uses gets(), which is unsafe. == Revised (ytoku): == {{{#!highlight c #define P(x)printf("%s ",x); #define S(i)r[i]=s[2-i]; char str[4],rts[4],*s,*r=rts;main(){P("文字列を入力してください")P(s=gets(str))S(0)S(1)S(2)P(r)P(s)P(r)P("\n")} }}} (166B) *最初のstrの表示は反転処理の前に行うことができるので、getsした足でそのまま表示で1文字削減 *さらに、これによってPとS以外の文が消えたのでセミコロンをマクロの最後において1文字削減 == Revised (ytoku on the dark side): == {{{#!highlight c #define P(x)printf("%s ",x); #define S r[i]=s[2-i++] char str[4],rts[4],*s,*r=rts;i;main(){P("文字列を入力してください")P(s=gets(str))S;S;S;P(r)P(s)P(r)P("\n")} }}} (161B) *ダークサイドに落ちた結果がこれだよ`\(^o^)/` *どうみても動作未定義です。本当にありがとうございました。 == Revised (ytoku): == {{{#!highlight c #define P(x)printf("%s ",x); char str[4],rts[4],*s,*r=rts+3;main(){P("文字列を入力してください")for(P(s=gets(str))*s;)*--r=*s++;P(r)P(str)P(r)P("\n")} }}} (151B) *実は#define Sよりも単純にforの方が短かったという罠(155B) *さらにポインタでコピーすることでiが消えました *ついでにforの初期化部分に前のPを突っ込んで;を消去 == Revised (nomeaning): == {{{#!highlight c char a[9],b[];i;main(){printf("文字列を入力してください ");for(gets(a);i<3;i++)b[i]=a[2-i];printf("%s %s %s %s \n ",a,b,a,b);} }}} (126B) *マクロを使わない方が短かった. *最初のbの宣言は若干コンパイラ依存.動作はnestと!IdeOneとMinGWで確認. *a[9]の9を消してもnestなら動作する. *後は工夫も何も無い残念なコード. ---- = ツリーの表示 = コマンドラインから整数n(n>=0を仮定してよい)を受け取り、n段のツリーを表示する。nが与えられなかったとき、およびn=0のときは何も表示しない。次に示す例はn=5のときである: {{{ * * * * * * * * * * * * * * * }}} == Before == {{{#!highlight c #include #include int main(int argc, char **argv) { int i, j, n; if (argc > 1) { n = atoi(argv[1]); for (i = 0; i < n; ++i) { for (j = 0; j < n - i - 1; ++j) putchar(' '); for (j = 0; j < i + 1; ++j) printf(j == i ? "*\n" : "* "); } } return 0; } }}} (387B) == After (clear): == {{{#!highlight c i,n;main(int a,char**v){for(n=a>1?atoi(v[1]):0;i1?atoi(v[1]):0;i1?atoi(v[1]):0;i++ 1){ if(n / 2 * 2 == n){ n /= 2; }else{ n = n * 3 + 1; } c++; } if(c <= 10) printf("F(%d)=%d\n",i,c); } return 0; } }}} (257B) * 完全移植したので無駄なループも残る * 一度ループで計算したF(x)は覚えておくともっと早く出るだろう == After == {{{#!highlight c c,i,n;main(m){scanf("%d",&m);for(;++i<=m;c=0){for(n=i;n>1;c++)n=n&1?n*3+1:n/2;if(c<11)printf("F(%d)=%d\n",i,c);}} }}} (115B)  * n & 1は偶数の時0,奇数の時1 == Revised (ytoku): == {{{#!highlight c c,i,n;main(m){scanf("%d",&m);for(;i++1;c++)n=n&1?n*3+1:n/2;if(c<11)printf("F(%d)=%d\n",i,c);}} }}} (114B)  * インクリメントの順序で不等号から等号を除去 == Revised (nomeaning): == {{{#!highlight c c,i;main(n,m){for(scanf("%d",&m);i++1;c++)n=n&1?n*3+1:n/2;c<11&&printf("F(%d)=%d\n",i,c);}} }}} (109B) * if文を消去. * 入力にgets(m),atoi(m)を用いると1byte短くなるが,5桁以上の整数の時に落ちるので断念. == Revised (nomeaning): == {{{#!highlight c c,i;main(n,m){for(scanf("%d",&m);i++1;c++)n=n&1?n*3+1:n/2;} }}} (106B) * c=0とc<11&&printf("F(%d)=%d\n",i,c);を統合して,{}のペアを一つ除去 = 完全数を求める = == 問題 == N以下の完全数を全て求め、昇順に出力せよ。 === 入力 === N(≦10000)を含む1行で与えられる === 出力 === 完全数を1行ごとに、降順に出力せよ。 === 入力例1 === {{{ 9999 }}} === 出力例1 === {{{ 6 28 496 8128 }}} == Before == {{{#!highlight c #include int main(void){ int i, j, n, m; scanf("%d", &m); for(i = 2;i <= m;i++){ n = 0; for(j = 1;j < i;j++){ if(i%j == 0){ n += j; } } if(i == n){ printf("%d\n", i); } } return 0; } }}} == After (ytoku): == {{{#!highlight c j,n,m;main(i){for(scanf("%d",&m);i++m||printf("%d\n",j))i=i+2&6;} }}} (81B) * iの更新式の変更 * 終了条件の変更 == Revised(nomeaning): == {{{#!highlight c m,j=6;main(i){for(scanf("%d",&m);j<=m;j-=1< 入力 || 出力 || || ABA || ABA || || APB || APBPA || || ABAB || ABABA || == Before == {{{#!highlight c #include #include #include int is_palindrome(const char *s){ int i, j; for(i = 0, j = strlen(s) - 1; i < j; i++, j--){ if(s[i] != s[j]){ return 0; } } return 1; } int main(void) { char str[15]; int i, len, j; scanf("%10s",str); for(len = strlen(str); len < 100; len++){ char s[100]; s[len] = '\0'; for(i = len - 1, j = 0; str[j]; i--, j++){ s[i] = str[j]; } memcpy(s, str, strlen(str)); if(is_palindrome(s)){ puts(s); return EXIT_SUCCESS; } } return EXIT_FAILURE; } }}} = ICPC 国内予選2013 C問題 = == After (ytoku): (Perl) == {{{ perl -MList::Util=sum -pe'INIT{<>}s/^,// while s%\[(,?)([,\d]+)]%@s=sort{$a-$b}split/,/,$2;",".($1?sum@s[0..@s/2]:$2+1>>1)%ge' }}} 126bytes *https://twitter.com/uecmma/status/357448204410814464 == After (nomeaning): (Ruby) == {{{ ruby -lpe'BEGIN{gets};$_.strip!while$_.gsub!(/\[( )?([ \d]+)\]/){" #{a=$2.split.map(&:to_i);$1?a.sort[0..a.size/2].inject(:+):a[0]/2+1}"}' }}} 138bytes *https://twitter.com/uecmma/status/357448824647729152 *7/22の放課後にytoku先輩と一緒にゴルフしてました。 == After (nomeaning): (Ruby) == {{{ ruby -ne'def f(*a);a[1]?a.sort[0..a.size/2].inject(:+): a[0]/2+1;end;p eval$_.gsub("[","f(").gsub("]","),")[0..-3] if$.>1 }}} 122bytes *正規表現無しの方が短かった。 == Revised (nomeaning): (Ruby) == {{{ ruby -ne'def f(*a);a[1]?a.sort[0..a.size/2].inject(:+):-~a[0]/2;end;p eval$_.gsub(?[,"f(").gsub(?],"),")[0..-3]if$.>1 }}} 118bytes *"a" -> ?a *a+1 => -~a == After (nomeaning): (Goruby) == {{{ goruby -ne'def f(*a)a[1]?a.so[0..a.sz/2].ij(:+):-~a[0]/2;end;p v$_.gs(?[,"f(").gs(?],"),")[0..-3]if$.>1' }}} 102bytes == After (ytoku): (Perl) == {{{ perl -MList::Util=sum -lpe'INIT{<>}sub f{@_-1?sum@_[0..@_/2]:1+pop>>1}s/\[/f(sort{\$a-\$b}/g,s/]/),/g,$_=eval' }}} (110B) ---- CategoryContest