ange1のブログスマートフォン用の表示で見るange1のブログこの広告は、90日以上更新していないブログに表示しています。Brainf**kはじめにCodeIQという所で週次で出題される「今週のお題」シリーズに解答しましたので、ネタバレです。今回は次のような問題でした。個の点を直線で結んで一筆書きする時、結んだ直線同士の交点の数を全ての一筆書きのやり方について合計した数を出力する。ようなものがあげられます。一筆書きは向きありで考えるため、同じ経路でも逆順は別として扱います。いう上限が設けられていました。下限は特に書いていませんが、一応ケース的には3以上でした。解説まず、一筆書きってどれだけやり方があるんだろう...というところから考えてみます。先ほどのn=5の図で、各点に番号を振ってみました。対応していることが分かります。いうことで、円順列と同じ考え方で、全部で$(n-1)!$通りあることが分かります。すると、一筆書きの方法をまず全て挙げることはできるのですが...。そこから1つ1つ交点を調べていくとすると結構大変です。ここで発想を転換します。先に交点を見るのです。4点が絡む交点は、この4点を頂点とする四角形の対角線の交点1つのみです。それ以外の点の順序の決め方が$(n-4)!$通りありますから、結局この交点が現れる一筆書きは$4(n-3)\times(n-4)!$通りだと分かります。これで1交点での状況が分かりましたが、1の絡まない分も含めて、他の交点での状況が全て同じということもすぐに分かります。$$が最終的に求める答えです。...n=3のときはそもそも交点0個なのですが、同じ数式で表現できています。$\frac{1}{6}$の部分は、階乗の計算から1,2,3を除くことで対処できるので、次のRuby(33)で実装できます。reduceの呼び出し、カッコ無くてもいけるので32文字でいけましたね。(4..n=gets.to_i).reduce(n-3,:*)このような計算であれば、Brainf**kでもいけますね。nの上限が9なので、繰り上がりを1桁分だけケアした10進掛け算で実装できます。※これで263文字です終わりにここのところBrainf**kで組んでなかったのでちょうど良かったかな...という感じで。)月別アーカイブはてなブログをはじめよう!ange1さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。