Code Golf自体は以前「Matzにっき」からリンクを辿って、ページの構成が
わかりにくいのもあってちょっと眺めただけでしたが。
>最近Pythonを覚えて、Code Golf(
http://codegolf.com/)
>というコンペにはまっているのですが、Brainfuck問題というのがあり、(ぱ)さんのソースを参考にさせて頂いたのですが、最後の問題が4秒以内という制限にTime outでパスしません。恐らくあと1秒くらい短縮しないとダメみたいです。
ええと、Brainfuck問題というのは
http://codegolf.com/brainfuck
ここのことで、「最後の問題」というのは、このページの一番下のところにある
Rot-13の問題のことですか?
WikipediaのRot-13のページ:
http://ja.wikipedia.org/wiki/ROT13
で、課題は、
・マスタングさんがPythonで書いたBrainfuckの処理系に、
・課題のページで与えられているBrainfuckのコードを食わせて、
・正しい解答が、4秒以内に得られること
ですよね? (「4秒以内」という制限がどこに書いてあるのか、見つけられていませんが)
>ネックは、入力の1文字1文字をループで回しているところだと思うのですが、3百万回のループが問題になっていそうです。スクリプトはループに弱いので。
うちの処理系をベースにしたのであれば、実行部分は、アルゴリズム的に小手先で
最適化できる余地はあんまりないのではないでしょうか(Brainfuck処理系には、
「]」が来たとき実行時に「[」を検索しているようなものもありますが、うちの
処理系はそのへんは読み込み時に済ませていますし)。
Pythonの実装に依存するチューニングの余地はあるかもしれません。読み込んだ
Brainfuckプログラムをどのような内部形式で保持するか、とか。
>何か一般的に早くアウトプットを得る方法はあるのですか?とりあえず、'++++'などを'+4'のようにすればループ回数が劇的に減るかなと思っているのですが、まだ試していません。うまい文字列変換が思いつかないので。
5秒を4秒にする程度のことであれば、「++++」を「+4」のようなひとつのコードに
するというアイディアで十分かとは思いますが、それをすべきタイミングは
Brainfuckソースを読み込んで内部形式に変換するところでしょうから、
「文字列変換」ではないですよね。
>あと(ぱ)さんはスクリプトは勉強とかされていますか?
(「スクリプト」が何なのかが不明ですが)いろいろな言語の本やら解説ページやら
読んではいますが、簡単なチュートリアルの例題とかではなく、実際に日頃から
自分の問題を解くために使っていないと、「身に付く」ことにはならないようですね。