ShortCoding ~ byte を持て余さないプログラマーの遊び~
ShortCodingとは? <ul><li>正式名称はCodeGolf
発祥はPerlGolf </li><ul><li>PerlのGolf後のコードは無類である </li></ul><li>CのCodeGolfはPerlやRubyやPythonに次いで人気のはず
とりあえずCのCodeGolfしようぜ </li></ul>
なんでする! <ul><li>縮むのが楽しいから!
縮めることで低層な事がわかる
ページを無駄にせずに内職できる
変態になれる!
短さを競う大会がないようである </li><ul><li>とくに理由はない </li></ul><li>参加することに意義がある </li><ul><li>異議なし </li></ul></ul>
ShortCodingのルール <ul><li>何でもアリになるから外部ファイル禁止 </li><ul><li>#include”おまいらの作ったファイル”←禁止 </li></ul><li>やたら環境依存すぎるのはよろしくない </li><u...
ゆえにOnlineJudge
PKU,AOJがよくつかわれるね </li></ul><li>その他まずそうなこと禁止 </li><ul><li>バイナリ、モジュール、zip、ファイル入出力etc </li></ul></ul>
ShortCode例 <ul><li>GCC的好都合でincludeからグローバル変数や引数の型宣言省略 </li><ul><li>たいていGCC。もはや環境依存ではない。
そういう仕様なんだよ。 </li></ul><li>return使ってる場合じゃねー </li><ul><li>eaxにぶち込むなら代入で十分。
せめて制御文じゃないexit()使え。 </li></ul><li>とりあえず次のソースコードをみてくれ </li></ul>
ショートコーダの生態 <ul><li>型どころか変数すら書く気がない
If文や一部演算子があまり使えない
Upcoming SlideShare
Loading in...5
×

Shortcodin

478

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
478
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
1
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Transcript of "Shortcodin"

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

    Clipping is a handy way to collect important slides you want to go back to later.

×