プログラムの実行結果は以下の通り。
---------- − | | − | ---------- − | − | − ---------- − | | − | | ---------- − | | − ---------- − | − | −
問題風に図示すると以下のようになる。
プログラムは以下の通り。
#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に読めるなんて気づかなかったよ。問題のタイトルに「デジタル数字で暗号」ってあるけど,こういうことだったのね。色々考えているんだ。