Submit Search
Code Golf
13 likes
15,166 views
Shinichiro Hamaji
For talk about code golf in program symposium.
Technology
Read more
1 of 57
Download now
Downloaded 109 times
1
2
3
4
5
6
7
Most read
8
9
10
11
12
13
14
15
16
17
Most read
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
Most read
57
More Related Content
PPTX
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
Fixstars Corporation
PPTX
SLAM勉強会(PTAM)
Masaya Kaneko
PDF
組み込み関数(intrinsic)によるSIMD入門
Norishige Fukushima
PDF
プログラムを高速化する話Ⅱ 〜GPGPU編〜
京大 マイコンクラブ
PPT
Glibc malloc internal
Motohiro KOSAKI
PDF
RSA暗号運用でやってはいけない n のこと #ssmjp
sonickun
PDF
研究分野をサーベイする
Takayuki Itoh
PDF
[論文紹介] Convolutional Neural Network(CNN)による超解像
Rei Takami
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
Fixstars Corporation
SLAM勉強会(PTAM)
Masaya Kaneko
組み込み関数(intrinsic)によるSIMD入門
Norishige Fukushima
プログラムを高速化する話Ⅱ 〜GPGPU編〜
京大 マイコンクラブ
Glibc malloc internal
Motohiro KOSAKI
RSA暗号運用でやってはいけない n のこと #ssmjp
sonickun
研究分野をサーベイする
Takayuki Itoh
[論文紹介] Convolutional Neural Network(CNN)による超解像
Rei Takami
What's hot
(20)
PDF
できる!並列・並行プログラミング
Preferred Networks
PPTX
[DL輪読会]SurfelGAN: Synthesizing Realistic Sensor Data for Autonomous Driving
Deep Learning JP
PDF
全力解説!Transformer
Arithmer Inc.
PDF
CUDAプログラミング入門
NVIDIA Japan
PDF
プログラムを高速化する話
京大 マイコンクラブ
PDF
マルチコアを用いた画像処理
Norishige Fukushima
PPTX
ベイズ最適化によるハイパラーパラメータ探索
西岡 賢一郎
PDF
いまさら聞けない!CUDA高速化入門
Fixstars Corporation
PPT
技術勉強会(楕円曲線暗号)資料
Tetsuyuki Oishi
PDF
機械学習による統計的実験計画(ベイズ最適化を中心に)
Kota Matsui
PDF
機械学習と主成分分析
Katsuhiro Morishita
PDF
GANの概要とDCGANのアーキテクチャ/アルゴリズム
Hirosaji
PPTX
猫でも分かるVariational AutoEncoder
Sho Tatsuno
PPTX
AVX-512(フォーマット)詳解
MITSUNARI Shigeo
PPTX
ニューラルネットワークの理論
Kazuma Komiya
PDF
ELBO型VAEのダメなところ
KCS Keio Computer Society
PDF
Pythonによる黒魔術入門
大樹 小倉
PDF
SSII2021 [TS2] 深層強化学習 〜 強化学習の基礎から応用まで 〜
SSII
PDF
【メタサーベイ】Video Transformer
cvpaper. challenge
PPTX
【論文紹介】How Powerful are Graph Neural Networks?
Masanao Ochi
できる!並列・並行プログラミング
Preferred Networks
[DL輪読会]SurfelGAN: Synthesizing Realistic Sensor Data for Autonomous Driving
Deep Learning JP
全力解説!Transformer
Arithmer Inc.
CUDAプログラミング入門
NVIDIA Japan
プログラムを高速化する話
京大 マイコンクラブ
マルチコアを用いた画像処理
Norishige Fukushima
ベイズ最適化によるハイパラーパラメータ探索
西岡 賢一郎
いまさら聞けない!CUDA高速化入門
Fixstars Corporation
技術勉強会(楕円曲線暗号)資料
Tetsuyuki Oishi
機械学習による統計的実験計画(ベイズ最適化を中心に)
Kota Matsui
機械学習と主成分分析
Katsuhiro Morishita
GANの概要とDCGANのアーキテクチャ/アルゴリズム
Hirosaji
猫でも分かるVariational AutoEncoder
Sho Tatsuno
AVX-512(フォーマット)詳解
MITSUNARI Shigeo
ニューラルネットワークの理論
Kazuma Komiya
ELBO型VAEのダメなところ
KCS Keio Computer Society
Pythonによる黒魔術入門
大樹 小倉
SSII2021 [TS2] 深層強化学習 〜 強化学習の基礎から応用まで 〜
SSII
【メタサーベイ】Video Transformer
cvpaper. challenge
【論文紹介】How Powerful are Graph Neural Networks?
Masanao Ochi
Ad
Code Golf
1.
Code Golfについて Shinichiro
Hamaji <shinichiro.hamaji _at_ gmail.com> 2007 年 8 月 9 日 夏のプログラムシンポジウム
2.
概要 Code Golfとは
歴史や派閥など 意義と面白さ アルゴリズム選択の重要性 なんでもアリの最小化 各言語のゴルフ
3.
概要 Code Golf
とは 歴史や派閥など 意義と面白さ アルゴリズム選択の重要性 なんでもアリの最小化 各言語のゴルフ
4.
Code Golfとは ゴルフ:
少ないストローク数でホールインすることを競う Code Golf: 少ないストローク(打鍵)数で仕様を満たすプログラムを書くことを競う ショートコーディングなどとも
5.
具体例(仕様) 空行削除: 標準入力から受け取った文章から改行だけの行を除去しろ。
http://golf.shinh.org/p.rb?delete+blank+lines
6.
具体例(投稿) コードを書いて Webフォームから投稿すると
サーバが自動的に実行して動作確認して OKなら記録が残る
7.
具体例(圧縮) 適当に縮めて37B 短さだけが正義
#includeしてない intの省略、mainの引数が一つだけ int*をgetsに渡してputsに至っては引数省略 リトルエンディアンを仮定 @ (ASCIIで64)で始まる文字列が来ないと仮定
8.
具体例(制約条件) 基本的にはなんでもアリではあるものの 外部プロセス呼び出し禁止
main(){system("perl ...");} モジュール禁止 ファイル入出力禁止 制限時間 バイナリ文字列の使用制限 eval Zlib.decode("*BINARY*") などの制限がつくことも
9.
概要 Code Golfとは
歴史や派閥など 意義と面白さ アルゴリズム選択の重要性 なんでもアリの最小化 各言語のゴルフ
10.
歴史 おそらくオリジナルはPerl Golf
プログラムで変なことさせたらPerlは天下一品 2001年にはNewsGroupでコンペティションが 520ページにも及ぶPerlgolf History Book http://perlgolf.sf.net/ もちろんそれ以前にもコードサイズを縮める文化は多数存在していた 「ハッカーズ」によるとMITの学生はコードサイズを縮めることに魂を注ぎ込んでいた IOCCCにも短いコードは何度も登場
11.
歴史2 Code Golf
(2006/5~) http://codegolf.com/ Perl だけでなく、Ruby, Python, PHPも使用可 運営者が出題して真剣に競う 休止気味? Anarchy Golf (2007/01~) http://golf.shinh.org/ 約50言語をサポート ユーザーが出題して適当に競う
12.
参加者 Code Golfサイトのtop10中6(7?)人が日本人
http://golf.shinh.org/ 全部で: 400000 access/month トップ: 30000 access/month ~1000 unique users ちょっとしたブーム?
13.
Short Coders C言語では北京大学がICPCなどの練習用として公開しているオンラインジャッジシステムを用いてゴルフをする文化がある
他のゴルフよりややアルゴリズム重視 Short Coding 職人達の技法
14.
ゴルフで人気の言語
15.
ゴルフに強い言語
16.
概要 Code Golfとは
歴史や派閥など 意義と面白さ アルゴリズム選択の重要性 なんでもアリの最小化 各言語のゴルフ
17.
意義 昔はコードサイズ=実行速度だった 今でもハードウェア屋だと命令数は重要
とはいえ現在では基本的にゴルフによって作られたコードは実用性は皆無 メンテ不能 最速・省メモリとも限らない というわけで 基本的には Just for Fun だと、私は考えています
18.
何がおもしろいのか? 一般化はできないのですが、個人的には パズルゲームとして
コードを眺めつつチマチマ削るのは数独などのパズルに通じるものがあるかも 元々ヘンなコードが好き Quine, Polyglot, esoteric languages プログラム言語の可能性 1000ケタの円周率をbzip2で圧縮して524B Rubyだと54B
19.
副産物としての意義 プログラマのための頭の体操 新しい言語を学ぶ時にとりあえずゴルフの問題を解いてみるという学習法
ゴルフのためにRubyを覚えたゴルファー、優秀な成績を残すがclassの書き方すら知らない事件 短いイディオムや言語機能は身につく ひとつやり方を覚えると使い続けてしまう現象 勝ちたければ新しい表現を模索する必要がある 実は短いコードはたいてい速い 最初は時間制限にひっかかったけど縮めていたら通ったり
20.
概要 Code Golfとは
歴史や派閥など 意義と面白さ アルゴリズム選択の重要性 なんでもアリの最小化 各言語のゴルフ
21.
基本はアルゴリズム 意外にも、最も差がつく部分 例えば自分が100Bで解いた問題を他の人が70Bで解いてたら間違いなくアルゴリズムが違う
とにかく色んな方法で問題をとらえてみる 多くの場合、速いアルゴリズムは短い 特に長い/難しい問題では
22.
空行削除問題アゲイン 空行削除をCの感覚でRubyで解いてみると 適当に縮める
22B 21B
23.
発想の転換 「一行ずつ読んで空行じゃなきゃ表示する」->「全部読んで空行だけの行を捨てる」 良いアルゴリズム>細かい小細工
18B! 暗号化 ゴルフイディオム適用 14B!
24.
中置記法->後置記法問題 普通に考えると再帰下降のパーサとか書く Shunting
yard algorithm とかいうのがあるらしい 間違いなく暗号(104B)
25.
処理系におまかせ Rubyはもともと中置記法->eval a,b,c,dは未定義な変数->method_missing
逆にpが定義済みなので邪魔->undef 短くなったのに暗号度大幅にダウン http://www.kmonos.net/wlog/71.html#_2014070301 61B!
26.
概要 Code Golfとは
歴史や派閥など 意義と面白さ アルゴリズム選択の重要性 なんでもアリの最小化 各言語のゴルフ
27.
暗号記述言語Perl Hello, world!
by ppencode (http://www.namazu.org/~takesako/ppencode/demo.html)
28.
暗号記述言語Perl rev(1) 明らかに括弧の対応がおかしい
29.
暗号記述言語Perl 実は-pオプションは前後にプログラムコードを追加しているだけというすごい実装
30.
マインスイーパ まわりにある爆弾の数を数える Perl
Golf history book p.268 http://terje2.frox25.no-ip.org/perlgolf_history_070109.pdf
31.
Insane Perl Golfers
36B (ただしPerl Golfでは#!perlはカウントしない) 正規表現1個で終了 しかもほぼ同一の解に4人が到達
32.
正規表現の構文でループ shebangは入力を全て$_に入れるという意味 $_="
........\n........\n....***.\n …"; s!\.!!eg は、全ての.を、右辺を実行した結果に置き換える、という意味 s///egはループの代用としてよく使われる
33.
悪魔の数字 $`はマッチした部分の 左側文字列
666e6=666000000 666e6x3= 666000000666000000666000000 まさにマジックナンバー ここがマッチ したとする
34.
悪魔の数字 $`はマッチした部分の 左側文字列
666e6=666000000 666e6x3= 666000000666000000666000000 つまり右図のような文字列…?
35.
謎の特殊変数 $^は"STDOUT_TOP"という文字列 10Byte(8+1+1)の文字列なら
なんでも良かった $_ は最初に全部読み込んだ 一行と一列 だけずれた
36.
文字列& 全ての文字に対して論理和 &
=
37.
mapで数を数える言語 後は "
の数を数えるだけ 神秘的な理由により、 Perl では関数型言語でおなじみの map 関数を使って文字列中に出現した部分文字列の数を数えることができる
38.
C 機械語をはじめとして、低レベル技術と仲良しであることが必要 スタックやらポインタやら
ビット演算 ~演算子 x*(x+1) vs. x*-~x -10 vs. ~9 for(;~scanf("%d");)
39.
qsort
40.
qsort (正しい実装) intをソートしたい
完全に問題の無い実装 ゴルフとしては0点
41.
qsort (入力依存) intをソートしたい
型宣言を消して引き算でかえり値を計算 オーバーフローの危険 ゴルフとしては50点
42.
qsort (引数減らし) intをソートしたい
メモリ空間の知識がないと理解できない C言語の知識がないと理解できない
43.
qsort (return消し) intをソートしたい
アセンブリの知識がないと理解できない 代入しとけばEAXに残ったままの場合がある
44.
qsort (x86) intをソートしたい
Cは匿名関数をサポートした言語 これで短くなるのはCISCの神秘 11Byteで9命令 pop, pop, pop, push, push, push, mov, sub, ret 処理系依存でさらに短くなったりも
45.
まとめ Code Golf
について概要および実際のコードを紹介しました 言語自身や処理系の癖などについて、広い知識が必要なパズル たぶん時間がないと思って割愛しましたが、OCaml, Haskell, LISP, PHP, PostScript, sed, Bash, Brainf*ck, Befungeでのゴルフや、サーバの構成について補足としてつけました
46.
概要 Code Golfとは
歴史や派閥など 意義と面白さ アルゴリズム選択の重要性 なんでもアリの最小化 各言語のゴルフ
47.
OCaml 関数名が長い(print_string) 型システムをいかに騙すか
Trueより1>0 if c then print_stirng"hoge" より c&()=print_string"hoge" 切り札Obj.magic 自然対数の底の小数点以下を100ケタ表示せよ http://d.hatena.ne.jp/KeisukeNakano/20070319/1174307629
48.
Haskell 割と強い Cより強くてスクリプト言語に負けるくらい
気の効いた標準関数群 interact :: (String -> String) -> IO() 細かいシンタクスシュガー $で括弧を除去 main再帰
49.
CLISP / Scheme
あまり強くない? マクロがあるとは言うけれど そもそもマクロが生きるほど長い問題は少なめ 可読性無視のゴルフでは、LISPのマクロが使える局面では、スクリプト言語のevalも使える
50.
PHP Hello, world!最強言語
基本的には長い標準関数名が不利でスクリプト言語としてはイマイチ ereg_replace
51.
PostScript 割と強い その上バイナリ表現ができる
52.
sed 実は四則演算やソートくらいはできる 単純な問題で無類の強さ
空行除去5B ただし、難しい問題はそもそも制限時間内に解けないことが多い
53.
Bash FizzBuzz最強 1から100まで数え上げていって、3の倍数ならFizzを、5の倍数ならBuzzを、15の倍数ならFizzBuzzを出力し、それらでなければその数値を出力する。
54.
Brainf*ck ただ解くだけでも大変 データの用意のしかたが重要
16を用意したいのなら… メモリ領域を喰いつぶしていく 0クリアしたい場合、[-]とかするより>で新しいメモリアドレスに 空行除去
55.
Befunge 2D言語ゴルフ 演算能力は結構ある
calを253Bで 非常に独特のパズルに なるべく左寄せ 行数は少なく
56.
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で計算実行
57.
サーバ構成 Celeron 1.7GHz,
384MB, Ubuntu linux 負荷記録: 20000access/6hours Webサーバ(lighttpd & mod_fastcgi) 実行以外の全てを担当 実行サーバ(Xen) 基本的にノーガード fork連打やファイル書き込みで破壊可能 ネットワークはホストとしかつながっていない 人様には迷惑をかけない exec(2)対策にstrace(1)を利用
Download