Home > Archives > 2007年09月

2007年09月

SRM 367 DIV 1

またとちった.

250点問題:BigInteger で舜殺可能.

500点問題:よくあるDPだけど微妙に形を間違え… さらに事前のソート処理が必要なのをあとで思い出したが挿入位置を間違え… なんてやってたら時間無くなった.

1000点問題:DAGから枝を抜いてけばいいのだけどどうやって抜いていけばよいのやら?

g++ のインライン展開

どうやら g++ は varargs な関数を展開できないらしい.

#include <iostream>
 
struct h {};
struct k : h {};
 
namespace g {
  inline bool f(...) { return false; }
  inline bool f(h* ) { return true;  }
}
namespace v {
  template <typename A>
  inline bool f(A)   { return false; }
  inline bool f(h* ) { return true;  }
}
 
int main(int argc, char *argv[])
{
  h *ph; k *pk; int *pi;
  std::cout << g::f(pi) << std::endl;
  std::cout << g::f(ph) << std::endl;
  std::cout << g::f(pk) << std::endl;
  std::cout << v::f(pi) << std::endl;
  std::cout << v::f(ph) << std::endl;
  std::cout << v::f(pk) << std::endl;
}

g::f(pi) は inline bool f(int* ) なので展開される.g::f(h()) は inline bool f(...) なので展開されない.他は全部展開.ついでに,(...) を使わずに単純にテンプレート変数を一つ用意すればいいかなと思ったけど(...)とテンプレートを用いた場合とでオーバーロードの解決優先度が違うのでだめらしい.

古いソースだとbool boost::detail::function::has_empty_targetはvarargsを使ってないのになぜ最近の実装では varargs を使うようになったのだろう?

boost::function で…

インライン展開失敗するなぁ.

#include <iostream>
#include <boost/function.hpp>
 
struct F_t {
  double operator()(const double & x) const { return 1.5 * x; }
} F;
 
inline double G(const double & x) { return 1.5 * x; }
 
int main(int argc, char *argv[])
{
  boost::function <double(const double &)> f = F;
  boost::function <double(const double &)> g = G;
  std::cout << f(2.0) << std::endl;
  std::cout << g(2.0) << std::endl;
}

ただの関数 g の場合はインライン展開されるけど関数オブジェクト f のときは bool boost::detail::function::has_empty_target(...) が展開できないといわれる.さてどうしたものか?

Pyramid-Quine@sed その3

エスケープの仕方を変えてみたら小さくなった.スコア 17 .

                ;
               ;;;
              s|^|\
             DDDh;s\
            /[BnD]//\
           g;y/bcde/B\
          BBnDE/CDDx;s\
         /$/BB/mg;s/^/;\
        Bn;;;BnsE^E/CD:;\
       s/^[^DBn]*BnB(DB+B\
      )/DB1B0/m;tCs/.$/E/p\
     ;x;s/[`-Bx66]/BUB0/gDD\
    DD;                     |
   h;s/[\n ]//g;y/BCDE/\\\n |/
  x;s/$/\\/mg;s/^/;\n;;;\ns|^|/
 :;s/^[^ \n]*\n\( \+\)/ \1\0/m;t
s/.$/|/p;x;s/[`-\x66]/\U\0/g    ;

ソース:pyramid-quine.17.sed

真中に空白があるのでまだ小さくなりそう.

Pyramid-Quine@sed その2

無駄を省いて小さくしてみた.スコア 19 .

                  ;
                 ;;;
                s|^|\
               QQh;s/\
              $/YY/mg;\
             s/^/;Yn;;;\
            YnsP^P/NQSs/\
           Y([^Yn]*YnY)Y(\
          SY+Y)/SY2Y1Y2/;N\
         Qs//SY2Y1Y2/;s//SY\
        2Y1Y2/;s/.$/P/p;NSx;\
       s/YnYPS//g;s/Yx59/YY/g\
      ;s/Yx53/S/gNs/Yx4E/Yn/g;\
     s/Yx50/P/g;s/Yx51/Q/gQ;   |
    h;s/$/\\/mg;s/^/;\n;;;\ns|^|/
   s/\([^\n]*\n\)\( \+\)/ \2\1\2/;
  s// \2\1\2/;s// \2\1\2/;s/.$/|/p;
 x;s/\n\| //g;s/\x59/\\/g;s/\x53/ /g
s/\x4E/\n/g;s/\x50/|/g;s/\x51/  /g  ;

ソース:pyramid-quine.19.sed 動かすには echo で改行だけ入れてやる必要あり.

 echo | sed -f pyramid-quine.19.sed | diff - pyramid-quine.19.sed

その他ソース:loose-expand.sedcloose-omp.sedreformatter.sed

Pyramid-Quine@sed

合宿のときに時間がなくて作れなかったのを思い出したので作ってみた.かなりの無駄をしているのでスコアは 38 とのこと.

                                     ;
                                    ;;;
                                   s|^|\
                                  SSSSSS\
                                 SSs/%yn%\
                                y%pS//g;h;\
                               s/^/S/;x;s/^\
                              /%P%yn/;s/^%P/\
                             %a%a%a%a%a%a/;:1\
                            ;s/%P*/%a%yn%a/;:N\
                           SSSSSSS/^%P/{s///;x;\
                          /S%y(.%y)/!{G;s/%y(.*%\
                         y)%yn%P.*/%y1/;s/%P%y%pS\
                        %yn/S/g;s/$/%p/NSSSSSSb2};\
                       s//%y1S/;x;b};s/^%yn/%P%P/;x\
                      ;s/S/%y%y%ynS/;/S$/{s/..S$/%p/\
                     ;b2};x;b1NSSSSS:2;s/^/;%yn;;;%yn\
                    s%p^%p%y%y%yn/;;:3;/%y(.*%y)%yn/!b\
                   4;s//%y1%P/;s/^/S/mg;b3;:4NSSSSs/%P/\
                  %yn/g;s/^/SSSSSSSSS/mgp;x;s/%P*%yn%P*%\
                 yn//;s/$/%P/;s/%P$/%a%a%a%a%a/;:BSSS;NSS\
                S/^%P%y{5%y}/{s///;bA};/^%%P%y(.*%y)/{s//%\
               y1%P/;bB};/^%%s%y(.*%y)/{s//%y1%s/;bB}SS;NSS\
              /^%s%y(.*%y)/{s//%y1S/;bB};/^%%%N%y(.*%y)/{s//\
             %y1%N/;bB};/^%N%y(.*%y)/{s//%y1%yn/;bB};NS/^%%p%\
            y(.*%y)/{s//%y1%p/;bB};/^%%y%y(.*%y)/{s//%y1%y%y/;\
           bB};/^%%%%%y(.*%y)/{s//%y1%%/;bB};N/^%%a%y(.*%y)/{s/\
          /%y1%y%a/;bB};/^%%i%y(.*%y)/{s//%y1/;bB};s/%y(.%y)%y(.\
         *%y)/%y2%y1/;tB;:AS;                                    |
        s/\n\| //g;h;s/^/ /;x;s/^/#\n/;s/^#/&&&&&&/;:1;s/#*/&\n&/;:
       /^#/{s///;x;/ \(.\)/!{G;s/\(.*\)\n#.*/\1/;s/#\| \n/ /g;s/$/|/
      b2};s//\1 /;x;b};s/^\n/##/;x;s/ /\\\n /;/ $/{s/.. $/|/;b2};x;b1
     :2;s/^/;\n;;;\ns|^|\\\n/;;:3;/\(.*\)\n/!b4;s//\1#/;s/^/ /mg;b3;:4
    s/#/\n/g;s/^/         /mgp;x;s/#*\n#*\n//;s/$/#/;s/#$/&&&&&/;:B   ;
   /^#\{5\}/{s///;bA};/^%P\(.*\)/{s//\1#/;bB};/^%s\(.*\)/{s//\1S/;bB}  ;
  /^S\(.*\)/{s//\1 /;bB};/^%N\(.*\)/{s//\1N/;bB};/^N\(.*\)/{s//\1\n/;bB};
 /^%p\(.*\)/{s//\1|/;bB};/^%y\(.*\)/{s//\1\\/;bB};/^%%\(.*\)/{s//\1%/;bB};
/^%a\(.*\)/{s//\1\&/;bB};/^%i\(.*\)/{s//\1/;bB};s/\(.\)\(.*\)/\2\1/;tB;:A ;

ソース:pyramid-quine.sed

動かすには echo で改行だけ入れてやる必要あり.

 echo | sed -f pyramid-quine.sed | diff - pyramid-quine.sed

作成メモ: 任意の文字列を改行・空白無し文字列に変換・復元するプログラムを書く.ついでに,s コマンドで特別な意味を持つ記号もエスケープしておく.ソース:expand.sedcomp.sed

次いで,エスケープされた文字列を三角に表示するプログラムを書く.ソース:formatter.sed

あとは,復元するプログラムと三角に表示するプログラムをくっつけたプログラムを作り,さらにそいつを変換して三角形に成形した文字列をそのプログラムの頭にくっつける.最後に形を微調整して出来上がり.

結構ナイーブに作ったのでいろいろと無駄が多いきがする.少なくとも,quine プログラム中では文字列が最初から三角形の形をしているので,文字列フォーマット部分を単純化することができるはず.あと,特定の文字を使わないとかいう縛りにしておくと復元部分が単純化できるはず.

SRM 366 DIV 1

とりあえず存在を忘れてたので飯を食べたり洗濯したりしながらの参加.でも久々にスコアを稼いだ気がする… でも500点問題で無駄に凝ったことしようとして時間食い過ぎたのはよくなかった.おかげで1000点問題を解こうとする時間がなかった.やれやれ.

250点問題:普通にDPで 1000x50 くらいの表を埋めるだけ.

500点問題:総当たりで2^10試せば終わる.あとは適当に辞書順でソートとか.

1000点問題:見てない.

Java の D&D の続き

http://java.sun.com/docs/books/tutorial/uiswing/dnd/intro.html

をざっと読んだが以下のようになるのだろうか?

TransferHandler とやらがD&Dやクリップボードへのコピー時のデータの受け渡しを受け持つ.データは,Transferable というインターフェースを継承したものに包まれる.具体的なデータ形式の変換はTransferable にデータ型を表す DataFlavor を指定し変換させる.

つーことで,ここらの3つを実装しつつ,ドラッグの開始を担当するリスナを作っておけばよいと.リスナは単に TransferHandler#exportAsDrag(JComponent c, InputEvent e, int action) を呼べばいいらしい.

Java の D&D

Swing コンポーネントにはデフォルトの D&D の動作が実装されている.が,JTree に関しては用意されている機能が少なすぎる… というより,JTreeのアイテムをドラッグ(コピー)することはできるけど,構造を変化させるドロップ(ペースト)動作が実装されていない.ついでに,そのコピーもサブツリーのコピーではなくノード一個のみな気がする.そのため,木の構造を変えるようなD&D操作は自前で実装しないとならんみたい.めんどくさ.

SRM 365 DIV 1

あが~  零点…

300点問題:r^2 の約数を素でループまわして時間がない.r の約数を求めて掛け合わせたものが r^2 の約数だっちゅうに.

500点問題:アルゴリズム間違ってない.速度も本来なら問題ない.だが,デバッグ出力の行を消し忘れてて時間オーバーでシステムテストでけられた.いやぁ,Java の String って遅いねぇ.ちくしょー

1000点問題:トポロジカルソート+αでできるかなと思ったけどだめらしい.よく考えると結構面倒だよなぁ,辞書順で最小って.

まあ,あほな結果だなぁ.

Home > Archives > 2007年09月

Search
Feeds

Page Top