Just another Ruby porter,


9月上旬の日記 | RDF

2016-09-10 (Sat)

Sony Reader PRS-T1のアップデート

自分で作ったEPUB3の文書をPRS-T1で見るとなぜかページ単位が1,1-2,2とか
わけのわからない表示になって気持ち悪かったんだけど、
全然本体のアップデートもしてないし確認したらどうもそれらしいアップデート内容が。
「EPUB3形式の書籍の表示品質を改善しました。」これは期待できる。
T3と違って専用のツールを使わないとアップデートできないもんだから気づかなかったが、
2年も前にすでに存在していた。適用したら解消した。なんでもっと早く確認しなかったのか。


2016-09-07 (Wed)

なぜかdiigoのアカウントが消えた

2,3日経つがやはり復活してないので新たに別名アカウントで作った。
たぶん登録したアイテム数は10万を越えていたと思われるが、
もやは既読フラグとしてしか使ってないので過去はなくてもどうでもいいのであった。


2016-09-06 (Tue)

GNU findのprintf

findしてlsってなんか二度手間っぽいので、GNU findを使っているなら-printfオプションがお勧め。

% find typhoon -type f -printf "%CF %CT %p\n" | sort | head
2016-09-01 16:19:36.6287212150 typhoon/japan_near_2016-09-01-09-00-00-large.jpg
2016-09-01 16:19:36.9047139800 typhoon/japan_near_2016-09-01-12-00-00-large.jpg
2016-09-01 16:19:37.1567073750 typhoon/japan_near_2016-09-01-15-00-00-large.jpg
2016-09-02 07:13:13.6201514790 typhoon/japan_near_2016-09-01-18-00-00-large.jpg
2016-09-02 07:13:13.9401440760 typhoon/japan_near_2016-09-01-21-00-00-large.jpg
2016-09-02 07:13:14.0801408380 typhoon/japan_near_2016-09-01-22-00-00-large.jpg
2016-09-02 07:13:14.1561390800 typhoon/japan_near_2016-09-01-23-00-00-large.jpg
2016-09-02 07:13:25.4878769220 typhoon/japan_near_2016-09-02-01-00-00-large.jpg
2016-09-02 07:13:25.5878746080 typhoon/japan_near_2016-09-02-02-00-00-large.jpg
2016-09-02 07:13:25.7158716460 typhoon/japan_near_2016-09-02-03-00-00-large.jpg

2016-09-05 (Mon)

Perlの呪文 #perlgolf

Q2へのへのもへじのuniqでのPerlの解の解説。日本語である必要もないのでababcadで。

% echo ababcad | perl -pe 's/./$&x~$`!~~$&/ge'                               
abcd

eなのでevalしてるわけでこの部分の呪文をばらして、わかりやすく別名にして()で囲む。

s/./$MATCH x (~$PREMATCH !~ ~$MATCH)/ge

まずは()の中の~を除外して考える。

$PREMATCH !~ $MATCH

これは先行する部分にマッチした文字がなければ1になることを意味する。
その場合は$MATCH x 1でそのまま残る。
マッチした場合は0になり$MATCH x 0でその文字は消える。
以上によりuniq処理となる。

では~はなんのためという話になるが、!~は正規表現というところがミソで、
$MATCHにメタ文字が含まれていた場合を考えるとまずいとわかる。

% echo abab.cad | perl -MEnglish -pe 's/./$MATCH x ($PREMATCH !~ $MATCH)/ge' 
abcd

のように.はワイルドカードなのでどんな文字にもマッチして消えてしまう。
これを防ぐにはescapeしてやる必要がある。

% echo abab.cad | perl -MEnglish -pe 's/./$MATCH x ($PREMATCH !~ quotemeta $MATCH)/ge'
ab.cd

という処理をゴルフすると~を使う方法になる。
~でビット反転するとメタ文字には絶対にならないので、quotemetaの代わりに使える。
よくこんな方法を思い付くよな。

% echo abab.cad | perl -MEnglish -pe 's/./$MATCH x (~$PREMATCH !~ ~$MATCH)/ge'
ab.cd

というわけでへのへのもへじの場合は~がなくてもいい。


2016-09-04 (Sun)

Q8-2 2011年日本数学オリンピック予選第3問改題 #シェル芸

8-1の結果を使ってもいいと書いてあるが、実は使わないほうが簡単。
まず、素数ということは計算結果は奇数にならないといけない。 a*b*c*d + e*f*gのように2つグループに分けるときに、
両グループに偶数が分かれると結果は偶数になってしまう。
つまり2,4,6は同じグループになければいけない。
さらに3,6も分かれると結果は3の倍数になってしまうので同じグループにする必要がある。
つまり 2*3*4*6 + 1*5*7 しかない。
結果は179で素数。
とまあ、これで解けてしまうわけだ。
あとは組み合わせ。

% echo $[2*3*4*6 + 1*5*7] | factor
179: 179
% printf "%s\n" {2,3,4,6}{2,3,4,6}{2,3,4,6}{2,3,4,6}+{1,5,7}{1,5,7}{1,5,7} | grep -Pv '(.).*\1' | head
2346+157
2346+175
2346+517
2346+571
2346+715
2346+751
2364+157
2364+175
2364+517
2364+571
% printf "%s\n" {2,3,4,6}{2,3,4,6}{2,3,4,6}{2,3,4,6}+{1,5,7}{1,5,7}{1,5,7} | grep -Pv '(.).*\1' | wc -l
144
% echo $[4*3*2*1 * 3*2*1]
144

全部で144個。

8-1の結果を使う方法もついでに。
「その時のa〜gの数字を全て求めましょう」とあるのでfactorを使うのはあまりいい方法じゃない。
素数かどうかの判断は愚直に余りを求めればいいので結構簡単。
桁数もそれほどじゃないのでエラトステネスのふるいとか考えなくてもok。

% awk -F "" '{for(r=s=a=$1*$2*$3*$4+$5*$6*$7;s%--r;);if(r<2)print $0, a}' tmp | head
2346157 179
2346175 179
2346517 179
2346571 179
2346715 179
2346751 179
2364157 179
2364175 179
2364517 179
2364571 179
% awk -F "" '{for(r=s=a=$1*$2*$3*$4+$5*$6*$7;s%--r;);if(r<2)print $0, a}' tmp | wc -l
144

自分自身よりも小さい整数を順々に試して、1まで行ったら素数決定。


9月上旬の日記 | RDF


WWW を検索 jarp.does.notwork.org を検索

わたなべひろふみ
Key fingerprint = C456 1350 085F A320 C6C8 8A36 0F15 9B2E EB12 3885
Valid HTML 4.01!