朝日新聞2004年12月4日パズルパーク解答

プログラムの実行結果は以下の通り。

----------
 −
| |
 −
|  
  
----------
 −
|  
 −
|  
 −
----------
 −
| |
 −
| |
  
----------
 −
|  
  
|  
 −
----------
 −
|  
 −
|  
 −

問題風に図示すると以下のようになる。

プログラムは以下の通り。

#include "puzutl.h"

typedef struct struct_a5 { byte v[5];} a5;

byte n2b( char c)
{
  // デジタル数字をビットに変換する。数字とビットの位置関係は以下の通り。
  // −      0
  //| |  3   4
  // −      1
  //| |  5   6
  // −      2
  //
  // 数字をビット位置に変換するためのテーブル。
  //                   6543210
  cstring bit[10] = { "xxxxx x",
                      "x x    ", // 例えば1は4,6がONになっている
                      " xx xxx",
                      "x x xxx",
                      "x xx x ",
                      "x  xxxx",
                      "xx xxxx",
                      "x xx  x",
                      "xxxxxxx",
                      "x xxxxx"};
  if( c == ' ') return 0;       // Blankは全ビットがOFF
  cstring s = bit[c-'0'];
  byte v = 0;
  while( *s) {
    v <<= 1;
    if( *s == 'x') v |= 1;
    s++;
  }
  return v;
}
a5 n2b( cstring s)
{
  // 5桁の数字列をそれぞれデジタル数字のビットに変換する。
  a5 v;
  for( int i=0; i< 5; i++) {
    v.v[i] = n2b(*s++);
  }
  return v;
}
a5 xor( a5 a, a5 b)
{
  // 5桁のデジタル数字のビット列をxorする。
  for( int i=0; i< 5; i++) {
    a.v[i] = a.v[i] ^ b.v[i];
  }
  return a;
}
void pr( byte a)
{
  // 一応見た目判りやすいように表示する。
  // 例えば,7は
  //  −
  // | |
  //   
  //   |
  // というように表示する。
  ps( "----------\n");
  ps( " ");
  if( a&1) ps( "−"); else ps( " ");
  ps( "\n");
  if( a&8) ps( "|"); else ps( " ");
  ps( " ");
  if( a&16) ps( "|"); else ps( " ");
  ps( "\n");
  ps( " ");
  if( a&2) ps( "−"); else ps( " ");
  ps( "\n");
  if( a&32) ps( "|"); else ps( " ");
  ps( " ");
  if( a&64) ps( "|"); else ps( " ");
  ps( "\n");
  ps( " ");
  if( a&4) ps( "−"); else ps( " ");
  ps( "\n");
}
void pr( a5 a)
{
  // 5桁のデジタル数字を出力する。
  for( int i=0; i< 5; i++) {
    pr( a.v[i]);
  }
}
int main( int argc, cstring argv[])
{
  a5 r = n2b( "35742");
  r = xor( r, n2b( "4891 "));
  r = xor( r, n2b( "75 05"));
  r = xor( r, n2b( "61043"));
  pr(r);
  return    0;
}

(2004.12.18)私はXORで計算したけど,新聞の答えでは棒の数を足して,偶数なら棒が0,奇数なら棒が1になるという考えだった。結果的には同じなんだけど,プログラマはXORだー。
それと,18日の問題を外出先でじっと見ていて,下にある答えがPEACEと読めることに気づいた。上の図だとぎらぎらし過ぎてPEACEに読めるなんて気づかなかったよ。問題のタイトルに「デジタル数字で暗号」ってあるけど,こういうことだったのね。色々考えているんだ。