naiの日記

ソフトウェアエンジニアから放射線科診断医にジョブチェンジしました。趣味のことを書きます。

307. Wrap Words FIXED

終了しました。

94Bの解。

char*p;main(n,s){for(n=atoi(gets(s));gets(p=s);puts())for(;p<index(s,0);)p+=*p<33?*p=10,n:-1;}
  • forの中でgetsを毎回読み込んでいるのに、nを求めるためだけに最初にgetsを読んでいるのはもったいない。できれば共通化したい。
  • for2つを1つにまとめたい。

ということで、試行錯誤を重ねてできたのが90Bの解です。本質的な差異はindexの第二引数のみ。


indexは第一引数に指定した文字列から第二引数の文字を検索し、見つからなければNULLを返します。
最初はn==0なので、!0、すなわち1を検索します。文字コード1の文字というのはどこにもないのでindexはNULL(==0)を返し、pと比較すれば不等式は必ず不成立。
つまり、nが初期化されるまでの処理を飛ばすことができるというわけ。
nが初期化されると、上記の不等式はpと文字列sの終端との比較となるので、そのまま終了判定に使えます。


ehangcでも使いましたが、indexと否定の!演算子との相性はいいですね。
文字列の終端かNULLが返ってくるのは便利です。

305. Factorization corrected

終了しました。

終了直前までnnさんとほぼ同じ80Bのコードだったのですが、最終日に飲み屋の入り口でなんとなく考えていたらprintfの第三引数を工夫することで1B縮めることを閃きました。そこからは飲みの席でコーディング→テスト→(携帯電話で)サブミットと、あまり空気の読めない行動をとってしまいました。(おかげさまでトップを取ることができましたが……w)
ちなみに最終日まで考えていなかった理由は、「これだけ長い間トップが80Bで並んでいるんだから、もう縮まないだろうな」というアレです。
Open code-statisticsがoffになっているのも、携帯電話で送信したことが原因だったりします。


nnさんの日記に詳しい解説がありますが、ブルートフォースで答えを求める方法はまったく思いつきませんでした。他の言語では有効なようです。
蛇足ながら、「解」と「根」についても一言。中学・高校では「2次方程式の解の公式」と教えられ、ずっと解と根は同じものだと思っていたのですが、http://aozoragakuen.sakura.ne.jp/taiwa/taiwaNch02/node5.htmlを見ると厳密には違うものらしいということを初めて知りました。中高で「根」という言葉を使わなくなったのは、やはり「解」との違いがわかりづらいからなのでしょうか。
ちなみに、変数名にわざわざbとcを使っているのは根の公式との整合性を保つためです。

307. Wrap Words FIXED

文字列を指定された文字数で折り返す問題。


スペース2つがタブ文字に置き換わっているので再出題となりましたが、PerlのText::Wrapを用いるとFIXEDでない方と同じ解答が得られるので、あながち出題ミスともいえないようです。
//もちろん、C GolferとしてはFIXEDの方が助かりますが……w

適当なアルゴリズムで縮めてみましたが、やはり文字列操作系の関数はバイト数が長く、なかなかうまくいきませんね。
現在はアルゴリズムの検討をしているところです。

305. Factorization corrected

a+b=xかつab=yとなるようなa,b(a≦b)を探す問題。
aとbがともに整数になることに優しさを感じますw

いかにも通らなさそうな80BをSubmitしてみたところ、通ってしまいました。


Outputがπであることについさっき気づいた。

301. Palindromic prime

http://golf.shinh.org/p.rb?Palindromic+prime
終了しました。

私のアルゴリズムはnnさんと同じですね。

k,n,p;main(i){for(;p=++i<2e4;k%=i-p||printf("%d\n",i))for(n=i;n?k=k*10+n%10:k%++p;n/=10);}

nが非0の間は10進数で逆にした数字kを作り、nが0になったら2から順に割り素数判定をしています。
このままだとiが10のべき乗のときk=1となり無限ループに陥ってしまいますが、それらの数は一の位が0なので、一回目のループでk=0となりループを抜けます。
「一の位が0の回文数は存在しない」ということを利用しています。


それにしても、3人がほぼ同時に90Bを通し、10日近く更新されずそのまま終了とは。
char pyramidに続きなかなか面白い競技過程でした。

301. Palindromic prime

ひさびさの更新となりました。

現在90Bで3人が並んでいます。
//90Bを通したらあっという間に2人に並ばれたでござる
Statsも実行時間も同じぐらいなので、同じアルゴリズムを用いているのかな?
僕が使っているのは若干直感に反するアルゴリズムです。

とりあえず、今真面目にやっているのはこの問題だけです。
Composition Calculusはちょっとパスで……。