みしょのねこごや

Diary - 2009年6月

FeynMF/FeynMPでgauginoを書く方法

今日はtetrisの25th anniversaryらしいので,Feynman diagramを書いていた。するとgauginoが突然現れたのだけど,これを書く術をあいにく僕は知らなかった。

ググっても良い資料が見つからなかったので,書く方法をここに書き残しておく。

以下はFeynMPの場合だけど,FeynMFでも同じだとおもう。


方法は簡単で,texmf-local/metapost/あたりにあるはずのfeynmp.mpに,次のようなcodeを追加すればよい。

style_def plain_wiggly_arrow expr p =
  cdraw p;
  save oldpen;              % 細い線を引くためのおまじない
  pen oldpen;
  oldpen := currentpen;
  pickup oldpen scaled .6;
  cdraw (wiggly p);         % 細い波線を引く
  pickup oldpen;            % おまじない終わり
  cfill (arrow p);
enddef;
style_def gaugino expr p = draw_plain_wiggly_arrow p enddef;

feynmp.mpのcodeをざっと見れば,どこに書いたらいいか分かるはず。最初のは730行目あたり,次のは840行目あたり。

ちなみに僕は,既存のaliasesが気に入らなかったので,840行目付近を次のようにざっくり書き換えた。

style_def vanilla  expr p = draw_plain p enddef;                 % ORIGINAL
style_def heavy    expr p = draw_dbl_plain_arrow p enddef;       % ORIGINAL
% General
style_def fermion  expr p = draw_plain_arrow p enddef;           % ORIGINAL
style_def boson    expr p = draw_wiggly p enddef;                % ORIGINAL
style_def gluon    expr p = draw_curly p enddef;                 % ORIGINAL
style_def ghost    expr p = draw_dots_arrow p enddef;            % ORIGINAL
style_def scalar   expr p = draw_dashes_arrow p enddef;          % ORIGINAL
% Standard Model
style_def quark    expr p = draw_plain_arrow p enddef;           % ORIGINAL
style_def photon   expr p = draw_wiggly p enddef;                % ORIGINAL
style_def electron expr p = draw_plain_arrow p enddef;           % ORIGINAL
style_def lepton   expr p = draw_plain_arrow p enddef;           % ORIGINAL
style_def higgs    expr p = draw_dashes p enddef;
% SUSY
style_def sfermion expr p = draw_dashes_arrow p enddef;
style_def squark   expr p = draw_dashes_arrow p enddef;
style_def slepton  expr p = draw_dashes_arrow p enddef;
style_def higgsino expr p = draw_plain_arrow p enddef;
style_def gaugino  expr p = draw_plain_wiggly_arrow p enddef;

% With Arrow
style_def aboson    expr p = draw_wiggly_arrow p enddef;
style_def ahiggs   expr p = draw_dashes_arrow p enddef;

% Without Arrow
style_def xhiggs   expr p = draw_dashes p enddef;
style_def xfermion  expr p = draw_plain p enddef;
style_def xghost    expr p = draw_dots p enddef;
style_def xquark    expr p = draw_plain p enddef;
style_def xelectron expr p = draw_plain p enddef;
style_def xlepton   expr p = draw_plain p enddef;
style_def xscalar   expr p = draw_dashes p enddef;
style_def xsfermion expr p = draw_dashes p enddef;
style_def xsquark   expr p = draw_dashes p enddef;
style_def xslepton  expr p = draw_dashes p enddef;
style_def xhiggsino expr p = draw_plain p enddef;
style_def xgaugino  expr p = draw_plain_wiggly p enddef;

6月9日:aliasesをざっくり変更した。Originalのaliasは残しつつ,矢印の有無を明示的に指定することにした。

QCDな人は,このノリで3本線のprotonを定義しても良いかもしれない。

るびまゴルフ【第6回】

Rubyist Magazine最新号(26号)に載っていた「るびまゴルフ【第6回】」が何かおもしろそうだったので挑戦してみた。

お題は,Unixで言うところのseqを実装しろ,というもの。標準入力から

5,9

のような文字列を入力したときに,きちんと

5
6
7
8
9

みたいな出力を返しなさいよ,というもの。

色々頑張ったけど,結局

gets[/,/]='..';$><<eval($_).to_a*$/ # 35bytes for problem 1&2

までしか縮められなかった。Rangeだとevalしたりto_aしたりするから長くなってしまうんだけど,かといって制御構造でuptoとかするのはsplitが必要になるから……。。。。

gets.to_iで初期値は取得できるけど,じゃあ終端は,と言われると$_.sub(/.*,/,"").to_iと長くなってしまう。結局Rangeが一番楽そうだった。


7月1日追記

2bytes 短くすることができた。

gets[/,/]='..';$><<[*eval($_)]*$/ # 33bytes for problem 1&2

7月2日追記

maraigueさん(っていうか@h_hiro)の成果パクって参考にして,更に短縮してみた。

puts *eval(gets.sub",","..") # 28bytes for problem 1&2 (unofficial)

括弧の省略とかwwwwきめぇwwww。あとputsって配列渡すとそれ順番にputsしてくれんのな。良い奴。

参考文献:Maraigue. [Ruby] Rubyist Magazine 0026号 るびまゴルフ第6回に挑戦. (2009.07.01)


7月2日追記

ついでに,seqと同様に標準入力から与えた場合についてもやってみた。

puts *eval($**'..') # 19bytes for problem 3 (unofficial)

Maraigueさんのputs techniqueを用いている。

~:> ruby seq.rb 8 12
8
9
10
11
12