SlideShare a Scribd company logo
1 of 26
Download to read offline
正規表現で作るワンライナー
ライフゲーム
@manaten
今日話すこと
正規表現
正規表現とmanaten
 入社する前
 ほとんど書かなかった
 バリデーションが一番必要なWebアプリはあ
まり作らなかった
 使う場合はググってコピペ
正規表現とmanaten
 入社してすぐ
 バリデーション時などに必要だったので、少
しずつ使うようになった
preg_match('/^[0-9]+$/', $hoge);
preg_match('/^[a-zA-Z0-9_¥-]+$/', $hoge);
正規表現とmanaten
 入社して半年くらい
 JS厨なので、replaceとクロージャを組み合
わせるのが割と好き
var date = new Date(0);
"Y-m-d H:i:s".replace(/[YmdHis]/g, function(s) {
return {
Y: date.getFullYear(), m: date.getMonth(),
d: date.getDate(), H: date.getHours(),
i: date.getMinutes(), s: date.getSeconds()
}[s];
).replace(/¥d+/g, function(s) {
return s.length === 1 ? '0' + s : s;
}); // "1970-00-01 09:00:00"
正規表現とmanaten
 最近
 グルーピングして$nで参照して置換するのが
便利!
 プログラム中より、エディタでよく使う
ピカチュウ,でんき,
フシギダネ,くさ,どく
"ピカチュウ" : [ "でんき", "" ],
"フシギダネ" : [ "くさ", "どく" ],
s/^([^,]*),([^,]*),([^,]*)$/"$1" : [ "$2", "$3" ],/g
グルーピング置換が便利すぎるので
 これでなにか面白いことをしよう!
 ライフゲームをつくろう!
ライフゲーム?
 二次元平面上のマス目
 各マスは生存(■)と死亡(□)の2状態を持つ
 時間とともに、各マスの状態が変化
 あるマスの状態の変化は、周りの8つのマスの現在
の状態による
 http://ja.wikipedia.org/wiki/ライフゲーム
ライフゲーム?
 誕生
 死んでいるセルに隣接する生きたセルがちょうど3つ
あれば、次の世代が誕生する。
 生存
 生きているセルに隣接する生きたセルが2つか3つな
らば、次の世代でも生存する。
 過疎
 生きているセルに隣接する生きたセルが1つ以下なら
ば、過疎により死滅する。
 過密
 生きているセルに隣接する生きたセルが4つ以上なら
ば、過密により死滅する。
 http://ja.wikipedia.org/wiki/ライフゲーム より
ライフゲーム?
 要するに、あるマスの周りの生きたマスの
数によって、そのマスを置換すればいい!
 正規表現で作れそう!
正規表現による実装
 今回は8x8のテキストファイルを対象に
 一回の置換じゃ無理なので、置換複数回で実
装してみる
##
# #
# #
# #
# #
# #
# #
##
スペースと#で構成されたマス
正規表現による実装
 あるマスと、周り9マスにマッチさせる
([ #]{3})([ #¥n]{8})([ #])([ #])([ #])([ #¥n]{8})([ #]{3})
##
# #
# #
# #
# #
# #
# #
##
正規表現による実装
 あるマスと、周り9マスにマッチさせる
([ #]{3})([ #¥n]{8})([ #])([ #])([ #])([ #¥n]{8})([ #]{3})
## ¥n
# # ¥n
# #
# #
# #
# #
# #
##
正規表現による実装
 マッチさせたマスを置換
 あとで周りの生存マスを数えやすいように
s/([ #]{3})([ #¥n]{8})([ #])([ #])([ #])([ #¥n]{8})([ #]{3})/
$1$2$3a$4$1$3$5$7b$5$6$7/
## ¥n
# # ¥n
# #
# #
# #
# #
# #
##
正規表現による実装
 マッチさせたマスを置換
 あとで周りの生存マスを数えやすいように
s/([ #]{3})([ #¥n]{8})([ #])([ #])([ #])([ #¥n]{8})([ #]{3})/
$1$2$3a$4$1$3$5$7b$5$6$7/
## ¥n
# # ¥n
# #
# #
# #
# #
# #
##
周りのマスは
そのまま
• 他のマスと区別するた
めに、a…bで囲む
• 数えるため、周りのマ
スをa…bの中に設置
正規表現による実装
 マッチさせたマスを置換
 あとで周りの生存マスを数えやすいように
s/([ #]{3})([ #¥n]{8})([ #])([ #])([ #])([ #¥n]{8})([ #]{3})/
$1$2$3a$4$1$3$5$7b$5$6$7/
## ¥n
a# # # b # ¥n
# #
# #
# #
# #
# #
##
周りのマスは
そのまま
• 他のマスと区別するた
めに、a…bで囲む
• 数えるため、周りのマ
スをa…bの中に設置
正規表現による実装
 生存/死亡ルールの適応
##
a# # # b #
# #
# #
# #
# #
# #
##
正規表現による実装
 生存/死亡ルールの適応
 s/a ( *# *){3}b/#/
 生存マス3つに囲まれた死亡マスを生存に置換
 s/a#( *# *){2,3}b/#/
 生存マス2つまたは3つに囲まれた生存マスを生存
に置換
 s/a[^b]*b/ /
 それ以外だったら、死亡に置換
正規表現による実装
 生存/死亡ルールの適応
##
# #
# #
# #
# #
# #
# #
##
ぜんたいか
 以上の操作をすべてのマスに適応・・・したい
 単純に gオプション をつけるだけだと、ダメ
 1つのマスに対して、同時に周り8マスと、その
間のマスにもマッチさせているため
##
# #
# #
# #
# ##
# #
# #
##
この4マスしか
置換できない
ぜんたいか
 先読み・後読み を使う
 Perlなどで使用可能
 マッチさせるパターンの前後の文字列を指定
できる
 マッチさせてないのにグルーピング出来る
ぜんたいか
 先読み・後読み を使う
 Perlなどで使用可能
 マッチさせるパターンの前後の文字列を指定
 マッチさせてないのにグルーピング出来る!
s/(?<=([ #]{3})[ #¥n]{8}([ #]))([ #])(?=([ #])[ #¥n]{8}
([ #]{3}))/a$3$1$2$4$5b/g
ぜんたいか
 先読み・後読み を使う
 Perlなどで使用可能
 マッチさせるパターンの前後の文字列を指定
 マッチさせてないのにグルーピング出来る!
s/(?<=([ #]{3})[ #¥n]{8}([ #]))([ #])(?=([ #])[ #¥n]{8}
([ #]{3}))/a$3$1$2$4$5b/g
先読み
後読み
先読みの中で
グルーピング
ぜんたいか
s/(?<=([ #]{3})[ #¥n]{8}([ #]))([ #])(?=([ #])[ #¥n]{8}
([ #]{3}))/a$3$1$2$4$5b/g
## ¥n
# # ¥n
# #
# #
# #
# #
# #
##
完成
cat lifegame.txt |
perl -0777 -pe 's/(?<=([ #]{3})[ #¥n]{8}([ #]))([ #])(?=([ #])
[ #¥n]{8}([ #]{3}))/a$3$1$2$4$5b/g' |
perl -pe 's/a( ( *# *){3}|#( *# *){2,3})b/#/g' |
perl -pe 's/a[^b]*b/ /g' |
tee lifegame.txt
まとめ
 痴漢は楽しい

More Related Content

Viewers also liked

Viewers also liked (9)

Euler 標数は測度ですか??
Euler 標数は測度ですか??Euler 標数は測度ですか??
Euler 標数は測度ですか??
 
Haskell golf intro
Haskell golf introHaskell golf intro
Haskell golf intro
 
Ambari運用ツラたん #ambarimeetup
Ambari運用ツラたん #ambarimeetupAmbari運用ツラたん #ambarimeetup
Ambari運用ツラたん #ambarimeetup
 
折り紙とコンパスで計算してみよう@ノラヤ・サイエンス・バー
折り紙とコンパスで計算してみよう@ノラヤ・サイエンス・バー折り紙とコンパスで計算してみよう@ノラヤ・サイエンス・バー
折り紙とコンパスで計算してみよう@ノラヤ・サイエンス・バー
 
「日曜数学のススメ 」情報科学若手の会・冬の陣2015 #wakate2015w
「日曜数学のススメ 」情報科学若手の会・冬の陣2015 #wakate2015w 「日曜数学のススメ 」情報科学若手の会・冬の陣2015 #wakate2015w
「日曜数学のススメ 」情報科学若手の会・冬の陣2015 #wakate2015w
 
定規とコンパスで足し算 科学勉強会第二回公開発表会
定規とコンパスで足し算 科学勉強会第二回公開発表会定規とコンパスで足し算 科学勉強会第二回公開発表会
定規とコンパスで足し算 科学勉強会第二回公開発表会
 
数学を数学で数学した人々
数学を数学で数学した人々数学を数学で数学した人々
数学を数学で数学した人々
 
クンマーの合同式とゼータ関数の左側 - 数学カフェ #mathcafe_height
クンマーの合同式とゼータ関数の左側 - 数学カフェ #mathcafe_height クンマーの合同式とゼータ関数の左側 - 数学カフェ #mathcafe_height
クンマーの合同式とゼータ関数の左側 - 数学カフェ #mathcafe_height
 
やさしい整数論
やさしい整数論やさしい整数論
やさしい整数論
 

正規表現で作るワンライナーライフゲーム