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

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

Find
\ :  A   B   C   D  
A :  −  グー  チョキ パー  
B : チョキ  −  パー  グー  
C : パー  グー   −  チョキ 
D : グー  チョキ パー   −  

CはDにチョキを出して1勝したことが判る。

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

#include "puzutl.h"

#define G 1                     // グー
#define C 2                     // チョキ
#define P 3                     // パー

int gcp[6][3] = {               // グー,チョキ,パーの出し方(6通り)
  {G,C,P},
  {G,P,C},
  {C,G,P},
  {C,P,G},
  {P,G,C},
  {P,C,G}
};

int judge( int x, int y) {
  if( x == y) return 0;         // あいこ
  if( abs(x-y) == 1) return -(x-y); // 差が1の時は小さい方が勝ち
  if( abs(x-y) == 2) return (x-y);  // 差が2の時は大きい方が勝ち(グーとパー)
  pe( "ProgramError(x:%d,y:%d)\n");
  return 0;
}

int abcd[4][4];                 // 対戦表
cstring sgcp[] = { " − ","グー ","チョキ","パー "}; // 解の出力用

int main( int argc, cstring argv[])
{
  for( int a=0; a< 6; a++) {
    abcd[0][1] = gcp[a][0];
    abcd[0][2] = gcp[a][1];
    abcd[0][3] = gcp[a][2];
    for( int b=0; b< 6; b++) {
      abcd[1][0] = gcp[b][0];
      abcd[1][2] = gcp[b][1];
      abcd[1][3] = gcp[b][2];
      for( int c=0; c< 6; c++) {
        abcd[2][0] = gcp[c][0];
        abcd[2][1] = gcp[c][1];
        abcd[2][3] = gcp[c][2];
        for( int d=0; d< 6; d++) {
          abcd[3][0] = gcp[d][0];
          abcd[3][1] = gcp[d][1];
          abcd[3][2] = gcp[d][2];
          //------------------------------------------------------------
          // abcd[][] がa,b,c,dがじゃんけんをした結果表になる。
          // 勝ち負けを判定する。
          //------------------------------------------------------------
          if( abcd[0][1] == G && abcd[1][0] == C &&// AはBにグーで勝ち
              judge( abcd[0][2], abcd[2][0]) > 0 && judge( abcd[0][3], abcd[3][0]) > 0) { // C,Dにも勝ってAは全勝
            int bwin = 0;
            for( int ib=0; ib< 4; ib++) {
              if( ib != 1 && judge( abcd[1][ib], abcd[ib][1]) > 0) bwin++;
            }
            int cwin = 0;
            for( int ic=0; ic< 4; ic++) {
              if( ic != 2 && judge( abcd[2][ic], abcd[ic][2]) > 0) cwin++;
            }
            int dwin = 0;
            for( int id=0; id< 4; id++) {
              //if( id != 3 && judge( abcd[3][id], abcd[id][3]) > 0) dwin++;
            }
            if( bwin == 2 && cwin == 1 && dwin == 0) {
              ps( "Find\n");
              ps( "\ :  A   B   C   D  \n");
              for( int x=0; x< 4; x++) {
                ps( "%.2s : ", "ABCD"+2*x);
                for( int y=0; y< 4; y++) {
                  ps( "%s ", sgcp[abcd[x][y]]);
                }
                ps( "\n");
              }
            }
          }
        }
      }
    }
  }
  return    0;
}