SlideShare a Scribd company logo
1 of 23
オセロゲームでコードゴルフ
<PHP>
12fi091 @Arzzup
プレゼン内容
 自己紹介
 コードゴルフとは?
 作品(オセロゲーム)の紹介
 アルゴリズム、コードの解説
2
自己紹介
 学生
 未来科学部情報メディア学科2年
 好きな言語
 Java PHP Ruby
 Vimmer
 たけのこ派
 Twitterer
 @arzzup えるざっぷ
3
コードゴルフだぁ?
 コードの「文字数」を出来るだけ短くし
て目的のプログラムを作る遊び、競技
4
if ( $key )
print(“OK”);
else
print(“NG”);
!= 0 {
} {
}
5
if ($key)
print(“OK”);
else
print(“NG”);
6
print($key?”OK”:”NG”);
echo$key?”OK”:”NG”;
7
if ($key != 0) {
print(“OK”);
} else {
print(“NG”);
}
echo$key?”OK”:”NG”;
56Byte
20Byte
8
コードゴルフだぁ?
 コードの「文字数」を出来るだけ短くし
て目的のプログラムを作る遊び、競技
これがコード
ゴルフだぁ!
9
IOCCC(国際邪悪なCコードコンテスト)
565byteテトリス
 参考:わずか565バイトテトリスのプログ
ラミング解説
 http://zapanet.info/blog/item/1125
10
オセロだぁ?
 ウィンタースポーツ
 埼玉県民は毎日している
11
作成結果
 <?=header('Content-type:text/html;charset=utf-
8');error_reporting(0);$s=$_GET['m']or$s=sprintf('%0100s',0);$m=str_sp
lit($s);$w=str_split($_GET['w']);$t=$_GET['t'];$k=$_GET['k'];$f=$t%2+1;
$e=$d=0;$r=array(-11,-10,-9,-
1,1,9,10,11);if($k){$i=0;$m[$k]=$t;foreach($r
as$c=>$j)for($b=$k+$j;$f==$m[$b]*$w[$c];$b+=$j)$m[$b]=$t;}else{fore
ach($m as$k=>&$v)$v=($k%10&&$k%10-
9&&$k/10>=1&&$k/10<=9)?0:5;$m[44]=$m[55]=2;$m[45]=$m[54]=1;$t
=1;}$p=m($m);$u=-2;while($u++<1){for($i=-
1;++$i<100;){$w[$i]=str_split(sprintf('%08s',0));foreach($r
as$c=>$j)for($b=$i+$j;$m[$b]*!$m[$i]&&$m[$b]-
5;$b+=$j)if($m[$b]==$f)if($j+$i==$b)break;else$w[$i][$c]=$u=1;}$y=$f;
$f=$t;$t=$y;}for($i=-
1;++$i<100;){if(!($i%10))echo"<br>";$v=$m[$i];if($v==2)$e++;if($v==1)$
d++;$h=implode($w[$i]);echo($h*1?"<a
href="?m=$p&t=$t&k=$i&w=$h&e">":"").g($v).($h*1?"</a>":"");}echo"
t=".g($t)." W$e,B$d";function g($v){return($v?$v-1?($v-
5?"◯":"■"):"●":"□");}function m($m){$x="";foreach($m
as$v)$x.=$v;return$x;}
968Byte 12
13
実物
 ろーかる
 ねっと
14
アルゴリズム
 石が置ける所をハイパーリンク
 その際GET値に、
「プレイヤーターンの情報」
「石をおいた場所」 「すべての石の情報」
「置いた場所から石をひっくり返せる方
向」を載せる
 GET値無し→初期盤面作成
15
GET
 m:盤面の情報
 t:プレイヤー手番
 k:石が置かれ場所
 w:ひっくり返す方向
http://localhost/code_golf/golf_othello.
php?m=55555555555000000005500000
00055000000005502222200550021200
055001210005500112000550011120055
555555555&t=1&k=87&w=00010000
16
嬉しい誤算すごい所
 一手戻る、一手進む機能
 棋譜確認機能
 置ける場所が見やすい
17
データ受取
18
ひっくり返す部分
19
文字描画部分
20
感想
 書きにくい!
 面倒くさい!
 面白くない!
コードゴルフしよう!
21
まとめ
 その言語の知識が深まる
 省略記法に詳しくなる
 →コーディング速度が上がる
 →コードを綺麗に書けるようになる(?)
コードゴルフしよう!
22
23
:q

オセロゲームでコードゴルフ

Editor's Notes

  1. 例もphpで
  2. 波括弧 条件式
  3. サーバーサイドの設定をいじれば省ける部分
  4. 941byte
  5. 適当な解説
  6. スキップ処理のために分けざる負えなかったforループ
  7. 見づらい、 いちいち確認しながら
  8. 解読