朝日新聞2006年1月13日のパズル横丁問題

問題

以下の計算式の結果が2と6のみの数になるように□内の数を求める。

       2006
×  □□□□□□□□
----------------------
      □□□□□
      □□□□
    □□□□
   □□□□
 □□□□
□□□□
----------------------
□□□□□□□□□□□

解答への道(ヒント)

一見難しそうに見えるが星一つ問題。頭で解くと簡単なんだろうな。

単純に解こうとすると,以下のように強引に求めるやり方がある。

for( int i=20000000; i< 100000000; i++) {
  R = 2006 x i
  if( R に2と6だけを含むなら) Rは解候補
}

最初何も考えずこれでプログラムを作ってしまった。ちょっと反省。

実は結果の数が2と6しか含まないのだから,以下のような211(2048)回のループを作ることが出来る。

int no[] = { 2, 6};           // 結果は2と6だけ
for( int a=0; a< 2; a++) {
  for( int b=0; b< 2; b++) {
    for( int c=0; c< 2; c++) {
      for( int d=0; d< 2; d++) {
        for( int e=0; e< 2; e++) {
          for( int f=0; f< 2; f++) {
            for( int g=0; g< 2; g++) {
              for( int h=0; h< 2; h++) {
                for( int i=0; i< 2; i++) {
                  for( int j=0; j< 2; j++) {
                    for( int k=0; k< 2; k++) {
                      int64 R = no[k]+10*(no[j]+10*(no[i]+10*(no[h]+10*(no[g]+10*(no[f]+10*(no[e]+10*(no[d]+10*(no[c]+10*(no[b]+10*(no[a]*(int64)1))))))))));
                      if( (R % 2006) == 0) { // 2006で割り切れれば
                        Rは解候補
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

こちらの方法の方が断然高速。プログラムも設計一つで全然違ったものになる。速度は1万倍以上違う。

プログラムって結果が同じでも作り方で全然異なるものになるのが面白いところ。

解候補だがプログラムを作ってみると,実際には1件しか出力されない。

あとはうまくフォーマットして出力する。むしろフォーマットして出力する方のコーディングに工数の大部分を掛けることになってしまう。

 

ダイエットしているとどうしてもお菓子が食べたくなってしまう。

お菓子も同じものばかりだと飽きてしまうので,色々悩んで買うことにしている。

今日お菓子を買っていたら,横で「チョコはだめ。にがいにがいだから」と言っている人がいた。

「え!?」

そんな風に言って良いのか?相手は2,3歳くらいの子供だろうか。子供は納得して別のお菓子を選んでいた。

幾ら何でも…

 

今日のパズル横丁には2005年の投稿別年齢構成が載っている。

60代24%,50代22%,70代18%,40代12%。

私からすると結構ビックリな結果。だけど若い人は新聞読まないからこんなものかな?とも思う。

新聞はルビとか振って小学生とかでも簡単に読めるようにしないと読者は減る一方だと思う。

戦前の新聞とかルビが振ってあるのに,戦後はその良さが無くなってしまった。

ルビってすばらしい文化だと思うんだけどなー。

これも結構不思議な話。

 

解速度

上の方法PentiumV500MHzで100秒

下の方法 即