このディレクトリの索引

# # ガリ夫くん:スマ子さん、最近実は数字萌えに目覚めたんです! # # スマ子さん: 藪から棒にアブノーマル宣言をされても困るのだけれども……。 # # ガリ夫くん:特に1ちゃんと0ちゃんは最高っすよ! 長女として他の数字子ちゃん達を一生懸命支える1ちゃん。全てを無に帰す力を持ったミステリアス美少女の0ちゃん。……かわええ〜。 # # スマ子さん:……もう帰っていいかしら。 # # ガリ夫:もう数の世界には1ちゃんと0ちゃん以外要りません! 1ちゃんと0ちゃんさえいれば、それで満足です! # # スマ子さん:あら、それはなかなか鋭い指摘ね。 # # ガリ夫くん:……と言いますと? # # スマ子さん:実は、私たちが普段使っている数は、勝手に0〜9までの数を使いますよと決めているに過ぎないの。実際には0と1だけでも数を表すことは可能なのよ。 # # ガリ夫くん:ほうほう……。 # # スマ子さん:これを2進法って言うんだけれどもね。一の位が1になったら、その次の位は一の位を0に戻して、その上の位を1増やして……ってしていくとあらゆる数を表すことができるわ。例えば、1,10,11,100,101,110,111……ってな具合にね。 # # ガリ夫くん:なるほど! と言うことは全ての数は1ちゃんと0ちゃんのハーレムと化すんですね! ここは天国か! # # スマ子さん:……。ところでガリ夫くん、1ちゃんと0ちゃんはどちらがお好き? # # ガリ夫くん:う〜〜〜ん……甲乙つけ難いですが、やっぱり健気な1ちゃんですかね〜。 # # スマ子さん:じゃあその1ちゃん、ハーレムの中にどれぐらいいるのか、知りたくない? # # ガリ夫くん:知りたい知りたい! 1ちゃんのこと、もっと知りたい! # # スマ子さん:うわあ……。ま、まあいいわ! 1ちゃんの数を数えて、それじゃあ2014年にちなんでこんな問題を解いてみましょう! そう、スマートにね! # # # 【問】 # 1〜2014までの数を2進法で表した時に、連続した2数でその数の中に1の登場する回数が同じであるようなペアは何組存在するか、答えてください。 # # 解答用テキストファイルに問題の答えと、その答えを導出したプロセスを記述して、提出してください。 # また、プログラムを使用した場合はソースコードを解答用テキストファイルに貼り付けてください。言語は問いませんが、ideone(http://ideone.com/)で実行できるものを解答として提出してください。 # '1〜2014までの数を2進法で表した時に、連続した2数でその数の中に1の登場する回数が同じであるようなペアは何組存在するか、答えてください。'('ペアをACCCBのCのペアを2,ACCCCBのCのペアを3と考える場合',_ペアの組数) :- 'ペアをACCCBのCのペアを2,ACCCCBのCのペアを3と考える場合の、1〜2014までの数を2進法で表した時に、連続した2数でその数の中に1の登場する回数が同じであるようなペアは何組存在するか'(_ペアの組数). '1〜2014までの数を2進法で表した時に、連続した2数でその数の中に1の登場する回数が同じであるようなペアは何組存在するか、答えてください。'('ペアをACCCBのCのペアを1,ACCCCBのCのペアを2と考える場合',_ペアの組数) :- 'ペアをACCCBのCのペアを1,ACCCCBのCのペアを2と考える場合の、1〜2014までの数を2進法で表した時に、連続した2数でその数の中に1の登場する回数が同じであるようなペアは何組存在するか'(_ペアの組数). 'ペアをACCCBのCのペアを2,ACCCCBのCのペアを3と考える場合の、1〜2014までの数を2進法で表した時に、連続した2数でその数の中に1の登場する回数が同じであるようなペアは何組存在するか'(_ペアの組数) :- '1〜2014までの数を2進法で表した時に1の登場する回数ならび'(_数を2進法で表した時に1の登場する回数ならび), 度数('ペアをACCCBのCのペアを2,ACCCCBのCのペアを3と考える場合のペア'(_数を2進法で表した時に1の登場する回数ならび),_ペアの組数). 'ペアをACCCBのCのペアを2,ACCCCBのCのペアを3と考える場合のペア'([A,A|R]). 'ペアをACCCBのCのペアを2,ACCCCBのCのペアを3と考える場合のペア'([_|R]) :- 'ペアをACCCBのCのペアを2,ACCCCBのCのペアを3と考える場合のペア'(R). 'ペアをACCCBのCのペアを1,ACCCCBのCのペアを2と考える場合の、1〜2014までの数を2進法で表した時に、連続した2数でその数の中に1の登場する回数が同じであるようなペアは何組存在するか'(_ペアの組数) :- '1〜2014までの数を2進法で表した時に1の登場する回数ならび'(_数を2進法で表した時に1の登場する回数ならび), 度数('ペアをACCCBのCのペアを1,ACCCCBのCのペアを2と考える場合のペア'(_数を2進法で表した時に1の登場する回数ならび),_ペアの組数). 'ペアをACCCBのCのペアを1,ACCCCBのCのペアを2と考える場合のペア'([A,A|R]). 'ペアをACCCBのCのペアを1,ACCCCBのCのペアを2と考える場合のペア'([A,A|R]) :- 'ペアをACCCBのCのペアを1,ACCCCBのCのペアを2と考える場合のペア'(R). 'ペアをACCCBのCのペアを1,ACCCCBのCのペアを2と考える場合のペア'([A,B|R]) :- \+(A=B), 'ペアをACCCBのCのペアを1,ACCCCBのCのペアを2と考える場合のペア'([B|R]). '1〜2014までの数を2進法で表した時に1の登場する回数ならび'(_数を2進法で表した時に1の登場する回数ならび) :- findall(_数を2進法で表した時に1の登場する回数,( between(1,2014,_数), '数を2進法で表した時に1の登場する回数'(_数,_数を2進法で表した時に1の登場する回数)),_数を2進法で表した時に1の登場する回数ならび). '数を2進法で表した時に1の登場する回数'(_数,_数を2進法で表した時に1の登場する回数) :- 度数('桁を2で割った時の剰余が1'(_数),_数を2進法で表した時に1の登場する回数). 桁を2で割った時の剰余が1(N) :- 1 is N mod 2. 桁を2で割った時の剰余が1(N) :- 最上位桁まで剰余が1かどうか調べる(N). 最上位桁まで剰余が1かどうか調べる(N) :- N > 0, N_1 is N // 2, 桁を2で割った時の剰余が1(N_1). 度数(_目標,_度数) :- findall(1,_目標,_度数を示す1のならび), length(_度数を示す1のならび,_度数).