正規表現で計算

正規表現で計算する方法に関する私のツイートを纏めました.
0
襖屋石蔵 Ishizo FUSUMAYA @shz_fsmy

#perl -le 'sub prime {if ((1 x $_[0]) !~ /^(11+)\1+$/) {return 1;} else {0;}} for (1..40) {$n=$_**2+$_+41; print "$_\t$n\t",prime($n);}' # ?

2011-05-11 22:50:25
襖屋石蔵 Ishizo FUSUMAYA @shz_fsmy

@shz_fsmy # 正規表現がある星に生まれてよかった!

2011-05-11 23:07:17
襖屋石蔵 Ishizo FUSUMAYA @shz_fsmy

#perl -le 'join("0", map { 1 x $_; } @ARGV) =~ /^(1+)\1*(0\1+)*$/; print length($1);' 42 98 28 # 14 ← 最大公約数 GCD を計算する正規表現 regexp.

2011-05-12 21:41:51
襖屋石蔵 Ishizo FUSUMAYA @shz_fsmy

#ruby -e 'ARGV.collect{|x|"1"*x.to_i}.join("0") =~ /^(1+)\1*(0\1+)*$/; puts $1.length;' 42 98 28 # 14 ← 最大公約数 GCD を計算する正規表現 regexp.

2011-05-12 21:54:54
襖屋石蔵 Ishizo FUSUMAYA @shz_fsmy

@shz_fsmy #ruby -e 'puts /^(1+)\1*(0\1+)*$/.match(ARGV.collect{|x|"1"*x.to_i}.join("0"))[1].length;' 42 98 28 # 14 ← このようにも書けるのかな.

2011-05-14 12:46:00
襖屋石蔵 Ishizo FUSUMAYA @shz_fsmy

#perl -le '$s="1"x$ARGV[0]; while (1) {print $s; $s=~/^((1?)((1+)\4))$/; last unless $3; $s=$2?$2.$1x3:$4;}' 7 # Collatz 予想

2011-10-06 23:08:46
襖屋石蔵 Ishizo FUSUMAYA @shz_fsmy

#ruby -e 's="1"*$*[0].to_i; loop {puts s; /^((1?)((1+)\4))$/=~s; break unless $3; s=($2=="1")?$2+$1*3:$4;}' 7 # Collatz 予想

2011-10-06 23:14:05
襖屋石蔵 Ishizo FUSUMAYA @shz_fsmy

@shz_fsmy #perl -le '$s="1"x$ARGV[0]; while (1) {print $s; last if $s=~/^1$/; $s=~s/^(1(1+)\2)$/1\1\1\1/ && next; $s=~s/^(1+)\1$/\1/;}' 7

2011-10-07 19:33:05
襖屋石蔵 Ishizo FUSUMAYA @shz_fsmy

@shz_fsmy #ruby -e 's="1"*7; loop {puts s; break if s=~/^1$/; s.sub!(/^(1(1+)\2)$/,'\''1\1\1\1'\'') &&next; s.sub!(/^(1+)\1$/,'\''\1'\'');}'

2011-10-07 19:39:03
襖屋石蔵 Ishizo FUSUMAYA @shz_fsmy

正規表現の lookahead はいいけど lookbehind が, Perl 5.8.8 で期待する通りに動作しない気が, Ruby 1.8.6 では使えない気がします.

2011-10-09 20:35:36
襖屋石蔵 Ishizo FUSUMAYA @shz_fsmy

ぶへへ. 後に ? を付けて最短一致させると, 目的の文字列を取り出せました.

2011-10-20 18:22:42
襖屋石蔵 Ishizo FUSUMAYA @shz_fsmy

正規表現の lookbehind (?<=...) と (?<!...) は, ... の部分が固定長でないと使えないようなので, while ループを回しました. さて, 140 字で書けるかな.

2011-10-20 20:57:22
襖屋石蔵 Ishizo FUSUMAYA @shz_fsmy

#perl -le '$_=1x$ARGV[0];while(1){print;s/(.*?)((1+)1(,1)*)$/\2/||last;($s,$t)=($1,$3);s/,//g;1 while s/($t+?)(1+)/\1,\2/;$_=$s.$_;}' 8

2011-10-20 21:35:36
襖屋石蔵 Ishizo FUSUMAYA @shz_fsmy

#perl -le '$_=1x$ARGV[0]; while (1) {print; s/(.*?)((1+)1(,1)*)$/\2/ || last; $s=$1; $t=$3; s/,//g; 1 while s/($t)1/$t,1/; s/^/$s/;}' 8

2011-10-21 19:39:11
襖屋石蔵 Ishizo FUSUMAYA @shz_fsmy

正規表現で自然数の分割を列挙する http://t.co/gssBKnCQ を, http://t.co/PV4OpZwc と書き直してみました.

2011-10-21 19:44:21
襖屋石蔵 Ishizo FUSUMAYA @shz_fsmy

@shz_fsmy その後に | perl -e 'undef $/; $_=<>; s/(?<=\n)(?=1)/\n/g; s/,/\n/g; s/(?<=1)(?=1)/ /g; print;' を付け加えると, Young 図形が見えます.

2011-11-03 17:19:34
襖屋石蔵 Ishizo FUSUMAYA @shz_fsmy

#perl -le '$m=1x$ARGV[0]; $n=1; l: while ($m=~/1$n/) {$n=~s/^/1/; for (@p) {next l if $n=~/^($_)+$/;} push @p,$n;} print for @p;' 80 # までの素数

2011-10-27 20:11:05
襖屋石蔵 Ishizo FUSUMAYA @shz_fsmy

#perl -le '$_="1"x$ARGV[0]; $n="1"x$ARGV[1]; s/$/$n/; print; print length;' 19 4 # の和

2011-10-29 17:35:05
襖屋石蔵 Ishizo FUSUMAYA @shz_fsmy

#perl -le '$_="1"x$ARGV[0]; $n="1"x$ARGV[1]; s/$n// || die; print; print length;' 19 4 # の差

2011-10-29 17:39:05
襖屋石蔵 Ishizo FUSUMAYA @shz_fsmy

#perl -le '$_="1"x$ARGV[0]; $n="1"x$ARGV[1]; s/1/$n/g; print; print length;' 19 4 # の積

2011-10-29 17:44:05
襖屋石蔵 Ishizo FUSUMAYA @shz_fsmy

#perl -le '$_="1"x$ARGV[0]; $n="1"x$ARGV[1] || die; s/((?:$n)*)1*/$1/; s/$n/1/g; print; print length;' 19 4 # の商

2011-10-29 17:49:05
襖屋石蔵 Ishizo FUSUMAYA @shz_fsmy

#perl -le '$_="1"x$ARGV[0]; $n="1"x$ARGV[1] || die; s/(?:$n)*//; print; print length;' 19 4 # の剰余

2011-10-29 17:52:05
襖屋石蔵 Ishizo FUSUMAYA @shz_fsmy

#perl -le '$n="1"x$ARGV[0]; while ($n=~/$s/) {s/$/1/; $s=$_; $s=~s/1/$s/g;} s/1//; print; print length;' 76 # の平方根

2011-10-29 17:57:05
襖屋石蔵 Ishizo FUSUMAYA @shz_fsmy

#perl -le '$_="1"x$ARGV[0]; $n="1"x$ARGV[1] || die; /($n)*/; $_=$&; $r=$'\''; s/$n/1/g; print "$_ $r\n",length," ",length $r;' 19 4 # の商と剰余

2011-10-30 16:43:05
襖屋石蔵 Ishizo FUSUMAYA @shz_fsmy

Perl で -w スイッチを付けたら警告されたよ. ウォーン! ワーン!

2012-08-01 20:25:20