• Like
Shortcodin
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

Published

 

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
411
On SlideShare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
0
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. ShortCoding ~ byte を持て余さないプログラマーの遊び~
  • 2. ShortCodingとは?
    • 正式名称はCodeGolf
    • 3. 発祥はPerlGolf
      • PerlのGolf後のコードは無類である
    • CのCodeGolfはPerlやRubyやPythonに次いで人気のはず
    • 4. とりあえずCのCodeGolfしようぜ
  • 5. なんでする!
    • 縮むのが楽しいから!
    • 6. 縮めることで低層な事がわかる
    • 7. ページを無駄にせずに内職できる
    • 8. 変態になれる!
    • 9. 短さを競う大会がないようである
      • とくに理由はない
    • 参加することに意義がある
      • 異議なし
  • 10. ShortCodingのルール
    • 何でもアリになるから外部ファイル禁止
      • #include”おまいらの作ったファイル”←禁止
    • やたら環境依存すぎるのはよろしくない
      • 一つの共通環境で試そう
      • 11. ゆえにOnlineJudge
      • 12. PKU,AOJがよくつかわれるね
    • その他まずそうなこと禁止
      • バイナリ、モジュール、zip、ファイル入出力etc
  • 13. ShortCode例
    • GCC的好都合でincludeからグローバル変数や引数の型宣言省略
      • たいていGCC。もはや環境依存ではない。
      • 14. そういう仕様なんだよ。
    • return使ってる場合じゃねー
      • eaxにぶち込むなら代入で十分。
      • 15. せめて制御文じゃないexit()使え。
    • とりあえず次のソースコードをみてくれ
  • 16. ショートコーダの生態
    • 型どころか変数すら書く気がない
    • 17. If文や一部演算子があまり使えない
    • 18. mainを呼ぶ,int型を%sでformatする
    a;main(x){printf(“%d”,a-1?:x);} main(){for(;~gets();)puts();} main(a){~scanf(“%s”,&a)&&main(puts(a%2))}
  • 19. コアな具体例(qsort)
    • Includeしなくてもqsortつかえる!
      • でもcompareで関数宣言しないと。
      • 20. 公理「新しい関数->冗長」
      • 21. なんとか短く宣言しよう。
    • 比較的一般的なcompare
      • 引数が多い、 return すんな、関数名が一文字じゃない
    compare(int*a,int*b){ return*a-*b; }
  • 22. 低層なShortCoding
    • GCC的に関数の引数が多すぎてもスルーする
      • (厳密には違うが詳細解説は俺がスルーする)
    • 値はレジスタにスタックな積まれ方をする
      • 2つの引数は間隔なく積まれるわけだから
      • 23. となりのアドレスを見れば良い。
    • 渡されるポインタの隣のポインタ
      • つまりポインタのポインタのとなり(+1)のポインタの指す場所ポインタの指す場所
    compare(int*a){ return *a-**(&a+1); }
  • 24. さらに短く
    • a[b]=*(a+b)よって**(&a+1)=*(*(1+&a))=*1[&a]
    • 25. ※おまけ:compareなんてなかった。
    compare(int*a){ return *a-**(&a+1); } compare(int*a){ return *a-*1[&a]; } qsort(hoge,huga,piyo,”YXZQQQx8b0+x02xc3”) //pop,pop,pop,push,push,push,mov,sub,ret
  • 26. 実際に縮めてみる
    • AOJ0103:野球のやつ
    • 27. 内容:HIT、HOMERUN、OUTが入力されるから3OUTごとにそのイニングの点数うp
    • 28. 入力      出力
    HIT HIT HOMERUN OUT HIT HIT OUT HIT HIT OUT OUT OUT OUT 4 0
  • 29. 普通に組む
    • 入力の二文字目で判断。
    • 30. OUT は3で割り切れ
    • 31. たら出力
    • 32. Base は必要になったら
    • 33. 3引いて点にする
    • 34. EOF で終了処理
    • 35. いたって普通
    #include<stdio.h> main(){ char a[9]; int base=0,score=0,out=0; for(;scanf(“%s”,a)!=EOF;){ if(a[2]=='I'){ base++; } if(a[2]=='O'){ score+=base+1; base=0; } if(a[2]=='U'){ out++; if(out%3==0){ if(base>3) score+=out-3 printf(&quot;%dn&quot;,score); } } base=score=0 } return 0; }
  • 36. if文を消す
    • 三項演算子
      • 中括弧削減
    • わりと縮んだ
      • まだまだ縮む
    • 200byteくらい
    #include<stdio.h> main(){ char a[9]; int base=0,score=0,out=0; for(;scanf(&quot;%s&quot;,&a)!=EOF;){ a[2]=='I'?base++:base; a[2]=='O'?score+=base+1,base=0:base; a[2]=='U'?++out%3==0? printf(“%dn”, base>3?score+out-3:score); score=base=0 } return 0; }
  • 37. == #include<stdio.h> main(){ char a[9]; int base=0,score=0,out=0; for(;scanf(&quot;%s&quot;,&a)!=EOF;){ a[2]-'I'?:base++; a[2]-'O'?:(score+=base+1,base=0); a[2]-'U'?++out%3?: (printf(“%dn”, base>3?score+out-3:score), score=base=0):; } return 0; }
  • 42. クォーテーション邪魔
  • 49. char->int #include<stdio.h> main(){ char a[9]; int base=0,score=0,out=0; for(;scanf(&quot;%s&quot;,&a)!=EOF;){ a[2]-73?:base++; a[2]-79?:(score+=base+1,base=0); a[2]-85?++out%3?: (printf(“%dn”, base>3?score+out-3:score), score=base=0):; } return 0; }
  • 56. char*4->int
    • 16進数的に
    • 57. H I T 0
    • 58. 48 49 54 0 (16進数)
  • 59.