朝日新聞2005年11月11日パズル横丁解答

前後にdateコマンドを入れてシェルプログラムを実行した結果は以下の通り。

Fri Nov 11 22:58:53 JST 2005
1010101010101010101010 / 22 = 45913682277318640955
Sat Nov 12 00:01:55 JST 2005

これを吐き出すシェルはちょうど以下の部分。

if [ `dc -e "1010101010101010101010 22 % p"` -eq 0 ] ; then echo 1010101010101010101010 / 22 = `dc -e "1010101010101010101010 22 / p"`; fi

シェルを吐き出すプログラムのソースは以下の通り。

#include "puzutl.h"

int bitcnt( int i)
{
  int n = 0;
  for( int j=0; j< 22; j++) {
    if( i & 1) n++;
    i >>= 1;
  }
  return n;
}

cstring conv( int i) 
{
  static char buf[128];
  astring p = buf;
  for( int j=0; j< 22; j++) {
    if( i&1) *p++ = '1';
    else     *p++ = '0';
    i >>= 1;
  }
  *p = NIL;
  char c;
  for( j=0; j< 11; j++) {
    c = buf[j];
    buf[j] = buf[21-j];
    buf[21-j] = c;
  }
  return buf;
}

int main( int argc, cstring argv[])
{
  for( int i=0x200000; i<= 0x3FFFFF; i+=2) {
    if( (i&1) == 0 && bitcnt(i) == 11) { // 22で割れるということは2でも割れる,ビットがONは11個
      cstring s = conv(i);
      ps( "if [ `dc -e \"%s 22 %% p\"` -eq 0 ] ; then echo %s / 22 = `dc -e \"%s 22 / p\"`; fi\n", s, s);
    }
  }
  return 0;
}