SlideShare a Scribd company logo
Code Golfについて Shinichiro Hamaji <shinichiro.hamaji _at_ gmail.com> 2007 年 8 月 9 日 夏のプログラムシンポジウム
概要 Code Golfとは 歴史や派閥など 意義と面白さ アルゴリズム選択の重要性 なんでもアリの最小化 各言語のゴルフ
概要 Code Golf とは 歴史や派閥など 意義と面白さ アルゴリズム選択の重要性 なんでもアリの最小化 各言語のゴルフ
Code Golfとは ゴルフ: 少ないストローク数でホールインすることを競う Code Golf: 少ないストローク(打鍵)数で仕様を満たすプログラムを書くことを競う ショートコーディングなどとも
具体例(仕様) 空行削除: 標準入力から受け取った文章から改行だけの行を除去しろ。 http://golf.shinh.org/p.rb?delete+blank+lines
具体例(投稿) コードを書いて Webフォームから投稿すると サーバが自動的に実行して動作確認して OKなら記録が残る
具体例(圧縮) 適当に縮めて37B 短さだけが正義 #includeしてない intの省略、mainの引数が一つだけ int*をgetsに渡してputsに至っては引数省略 リトルエンディアンを仮定 @ (ASCIIで64)で始まる文字列が来ないと仮定
具体例(制約条件) 基本的にはなんでもアリではあるものの 外部プロセス呼び出し禁止 main(){system(&quot;perl ...&quot;);} モジュール禁止 ファイル入出力禁止 制限時間 バイナリ文字列の使用制限 eval Zlib.decode(&quot;*BINARY*&quot;) などの制限がつくことも
概要 Code Golfとは 歴史や派閥など 意義と面白さ アルゴリズム選択の重要性 なんでもアリの最小化 各言語のゴルフ
歴史 おそらくオリジナルはPerl Golf プログラムで変なことさせたらPerlは天下一品 2001年にはNewsGroupでコンペティションが 520ページにも及ぶPerlgolf History Book http://perlgolf.sf.net/ もちろんそれ以前にもコードサイズを縮める文化は多数存在していた 「ハッカーズ」によるとMITの学生はコードサイズを縮めることに魂を注ぎ込んでいた IOCCCにも短いコードは何度も登場
歴史2 Code Golf (2006/5~) http://codegolf.com/ Perl だけでなく、Ruby, Python, PHPも使用可 運営者が出題して真剣に競う 休止気味? Anarchy Golf (2007/01~) http://golf.shinh.org/ 約50言語をサポート ユーザーが出題して適当に競う
参加者 Code Golfサイトのtop10中6(7?)人が日本人 http://golf.shinh.org/ 全部で: 400000 access/month トップ: 30000 access/month ~1000 unique users ちょっとしたブーム?
Short Coders C言語では北京大学がICPCなどの練習用として公開しているオンラインジャッジシステムを用いてゴルフをする文化がある 他のゴルフよりややアルゴリズム重視 Short Coding 職人達の技法
ゴルフで人気の言語
ゴルフに強い言語
概要 Code Golfとは 歴史や派閥など 意義と面白さ アルゴリズム選択の重要性 なんでもアリの最小化 各言語のゴルフ
意義 昔はコードサイズ=実行速度だった 今でもハードウェア屋だと命令数は重要 とはいえ現在では基本的にゴルフによって作られたコードは実用性は皆無 メンテ不能 最速・省メモリとも限らない というわけで 基本的には Just for Fun だと、私は考えています
何がおもしろいのか? 一般化はできないのですが、個人的には パズルゲームとして コードを眺めつつチマチマ削るのは数独などのパズルに通じるものがあるかも 元々ヘンなコードが好き Quine, Polyglot, esoteric languages プログラム言語の可能性 1000ケタの円周率をbzip2で圧縮して524B Rubyだと54B
副産物としての意義 プログラマのための頭の体操 新しい言語を学ぶ時にとりあえずゴルフの問題を解いてみるという学習法 ゴルフのためにRubyを覚えたゴルファー、優秀な成績を残すがclassの書き方すら知らない事件 短いイディオムや言語機能は身につく ひとつやり方を覚えると使い続けてしまう現象 勝ちたければ新しい表現を模索する必要がある 実は短いコードはたいてい速い 最初は時間制限にひっかかったけど縮めていたら通ったり
概要 Code Golfとは 歴史や派閥など 意義と面白さ アルゴリズム選択の重要性 なんでもアリの最小化 各言語のゴルフ
基本はアルゴリズム 意外にも、最も差がつく部分 例えば自分が100Bで解いた問題を他の人が70Bで解いてたら間違いなくアルゴリズムが違う とにかく色んな方法で問題をとらえてみる 多くの場合、速いアルゴリズムは短い 特に長い/難しい問題では
空行削除問題アゲイン 空行削除をCの感覚でRubyで解いてみると 適当に縮める 22B 21B
発想の転換 「一行ずつ読んで空行じゃなきゃ表示する」->「全部読んで空行だけの行を捨てる」 良いアルゴリズム>細かい小細工 18B! 暗号化 ゴルフイディオム適用 14B!
中置記法->後置記法問題 普通に考えると再帰下降のパーサとか書く Shunting yard algorithm とかいうのがあるらしい 間違いなく暗号(104B)
処理系におまかせ Rubyはもともと中置記法->eval a,b,c,dは未定義な変数->method_missing 逆にpが定義済みなので邪魔->undef 短くなったのに暗号度大幅にダウン http://www.kmonos.net/wlog/71.html#_2014070301 61B!
概要 Code Golfとは 歴史や派閥など 意義と面白さ アルゴリズム選択の重要性 なんでもアリの最小化 各言語のゴルフ
暗号記述言語Perl Hello, world! by ppencode  (http://www.namazu.org/~takesako/ppencode/demo.html)
暗号記述言語Perl rev(1) 明らかに括弧の対応がおかしい
暗号記述言語Perl 実は-pオプションは前後にプログラムコードを追加しているだけというすごい実装
マインスイーパ まわりにある爆弾の数を数える Perl Golf history book p.268 http://terje2.frox25.no-ip.org/perlgolf_history_070109.pdf
Insane Perl Golfers 36B (ただしPerl Golfでは#!perlはカウントしない) 正規表現1個で終了 しかもほぼ同一の解に4人が到達
正規表現の構文でループ shebangは入力を全て$_に入れるという意味 $_=&quot; ........\n........\n....***.\n …&quot;; s!\.!!eg は、全ての.を、右辺を実行した結果に置き換える、という意味 s///egはループの代用としてよく使われる
悪魔の数字 $`はマッチした部分の 左側文字列 666e6=666000000 666e6x3= 666000000666000000666000000 まさにマジックナンバー ここがマッチ したとする
悪魔の数字 $`はマッチした部分の 左側文字列 666e6=666000000 666e6x3= 666000000666000000666000000 つまり右図のような文字列…?
謎の特殊変数 $^は&quot;STDOUT_TOP&quot;という文字列 10Byte(8+1+1)の文字列なら なんでも良かった $_ は最初に全部読み込んだ 一行と一列 だけずれた
文字列& 全ての文字に対して論理和 & =
mapで数を数える言語 後は &quot; の数を数えるだけ 神秘的な理由により、 Perl では関数型言語でおなじみの map 関数を使って文字列中に出現した部分文字列の数を数えることができる
C 機械語をはじめとして、低レベル技術と仲良しであることが必要 スタックやらポインタやら ビット演算 ~演算子 x*(x+1) vs. x*-~x -10 vs. ~9 for(;~scanf(&quot;%d&quot;);)
qsort
qsort (正しい実装) intをソートしたい 完全に問題の無い実装 ゴルフとしては0点
qsort (入力依存) intをソートしたい 型宣言を消して引き算でかえり値を計算 オーバーフローの危険 ゴルフとしては50点
qsort (引数減らし) intをソートしたい メモリ空間の知識がないと理解できない C言語の知識がないと理解できない
qsort (return消し) intをソートしたい アセンブリの知識がないと理解できない 代入しとけばEAXに残ったままの場合がある
qsort (x86) intをソートしたい Cは匿名関数をサポートした言語 これで短くなるのはCISCの神秘 11Byteで9命令 pop, pop, pop, push, push, push, mov, sub, ret 処理系依存でさらに短くなったりも
まとめ Code Golf について概要および実際のコードを紹介しました 言語自身や処理系の癖などについて、広い知識が必要なパズル たぶん時間がないと思って割愛しましたが、OCaml, Haskell, LISP, PHP, PostScript, sed, Bash, Brainf*ck, Befungeでのゴルフや、サーバの構成について補足としてつけました
概要 Code Golfとは 歴史や派閥など 意義と面白さ アルゴリズム選択の重要性 なんでもアリの最小化 各言語のゴルフ
OCaml 関数名が長い(print_string) 型システムをいかに騙すか Trueより1>0 if c then print_stirng&quot;hoge&quot; より c&()=print_string&quot;hoge&quot; 切り札Obj.magic 自然対数の底の小数点以下を100ケタ表示せよ http://d.hatena.ne.jp/KeisukeNakano/20070319/1174307629
Haskell 割と強い Cより強くてスクリプト言語に負けるくらい 気の効いた標準関数群 interact :: (String -> String) -> IO() 細かいシンタクスシュガー $で括弧を除去 main再帰
CLISP / Scheme あまり強くない? マクロがあるとは言うけれど そもそもマクロが生きるほど長い問題は少なめ 可読性無視のゴルフでは、LISPのマクロが使える局面では、スクリプト言語のevalも使える
PHP Hello, world!最強言語 基本的には長い標準関数名が不利でスクリプト言語としてはイマイチ ereg_replace
PostScript 割と強い その上バイナリ表現ができる
sed 実は四則演算やソートくらいはできる 単純な問題で無類の強さ 空行除去5B ただし、難しい問題はそもそも制限時間内に解けないことが多い
Bash FizzBuzz最強 1から100まで数え上げていって、3の倍数ならFizzを、5の倍数ならBuzzを、15の倍数ならFizzBuzzを出力し、それらでなければその数値を出力する。
Brainf*ck ただ解くだけでも大変 データの用意のしかたが重要 16を用意したいのなら… メモリ領域を喰いつぶしていく 0クリアしたい場合、[-]とかするより>で新しいメモリアドレスに 空行除去
Befunge 2D言語ゴルフ 演算能力は結構ある calを253Bで 非常に独特のパズルに なるべく左寄せ 行数は少なく
x86 ELFヘッダとプログラムヘッダと機械語をがんばって重ねる http://shinh.skr.jp/binary/fsij061115/ CISCマジック 1Bでも強力な子たち: push, pop, inc, dec, ... decでZFが立つとか for (int i = 0; i < 10; i++) { ... } for (int i = 10; --i; ) { ... } 未だに残る8bitレジスタ群 2Bで計算実行
サーバ構成 Celeron 1.7GHz, 384MB, Ubuntu linux 負荷記録: 20000access/6hours Webサーバ(lighttpd & mod_fastcgi) 実行以外の全てを担当 実行サーバ(Xen) 基本的にノーガード fork連打やファイル書き込みで破壊可能 ネットワークはホストとしかつながっていない 人様には迷惑をかけない exec(2)対策にstrace(1)を利用

More Related Content

PPTX
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
PPTX
SLAM勉強会(PTAM)
PDF
組み込み関数(intrinsic)によるSIMD入門
PDF
プログラムを高速化する話Ⅱ 〜GPGPU編〜
PPT
Glibc malloc internal
PDF
RSA暗号運用でやってはいけない n のこと #ssmjp
PDF
研究分野をサーベイする
PDF
[論文紹介] Convolutional Neural Network(CNN)による超解像
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
SLAM勉強会(PTAM)
組み込み関数(intrinsic)によるSIMD入門
プログラムを高速化する話Ⅱ 〜GPGPU編〜
Glibc malloc internal
RSA暗号運用でやってはいけない n のこと #ssmjp
研究分野をサーベイする
[論文紹介] Convolutional Neural Network(CNN)による超解像

What's hot (20)

PDF
できる!並列・並行プログラミング
PPTX
[DL輪読会]SurfelGAN: Synthesizing Realistic Sensor Data for Autonomous Driving
PDF
全力解説!Transformer
PDF
CUDAプログラミング入門
PDF
プログラムを高速化する話
PDF
マルチコアを用いた画像処理
PPTX
ベイズ最適化によるハイパラーパラメータ探索
PDF
いまさら聞けない!CUDA高速化入門
PPT
技術勉強会(楕円曲線暗号)資料
PDF
機械学習による統計的実験計画(ベイズ最適化を中心に)
PDF
機械学習と主成分分析
PDF
GANの概要とDCGANのアーキテクチャ/アルゴリズム
PPTX
猫でも分かるVariational AutoEncoder
PPTX
AVX-512(フォーマット)詳解
PPTX
ニューラルネットワークの理論
PDF
ELBO型VAEのダメなところ
PDF
Pythonによる黒魔術入門
PDF
SSII2021 [TS2] 深層強化学習 〜 強化学習の基礎から応用まで 〜
PDF
【メタサーベイ】Video Transformer
PPTX
【論文紹介】How Powerful are Graph Neural Networks?
できる!並列・並行プログラミング
[DL輪読会]SurfelGAN: Synthesizing Realistic Sensor Data for Autonomous Driving
全力解説!Transformer
CUDAプログラミング入門
プログラムを高速化する話
マルチコアを用いた画像処理
ベイズ最適化によるハイパラーパラメータ探索
いまさら聞けない!CUDA高速化入門
技術勉強会(楕円曲線暗号)資料
機械学習による統計的実験計画(ベイズ最適化を中心に)
機械学習と主成分分析
GANの概要とDCGANのアーキテクチャ/アルゴリズム
猫でも分かるVariational AutoEncoder
AVX-512(フォーマット)詳解
ニューラルネットワークの理論
ELBO型VAEのダメなところ
Pythonによる黒魔術入門
SSII2021 [TS2] 深層強化学習 〜 強化学習の基礎から応用まで 〜
【メタサーベイ】Video Transformer
【論文紹介】How Powerful are Graph Neural Networks?
Ad

Code Golf