Problem:
Problem B: High & Low Cube

僕は近所の小学生たちと一緒に夏祭りに来ていた。有り体に言えば保護者役だが、出店の焼きそばやたこ焼きなんかが焼ける匂い、時折聞こえる打ち上げ花火の音などは、この歳になっても心が踊るものがある。が、好奇心旺盛な子供たちがはぐれないように、今日はしっかり見守っていないと。

子供たちはとある出店に興味を持ったようだった。覗き込んでみると、そこでは出店のおじさんとサイコロを使ったゲームをして、勝てば景品が貰えることになっていた。そのゲームは、 High & Low と呼ばれる単純なものだ。参加者とおじさんは1個ずつサイコロを振るが、その前に参加者は、自分の出目がおじさんの出目より大きいか小さいかを予想する。予想が当たれば勝利であり、同じ目が出た場合はどちらもサイコロを振り直す。

このゲームの少し厄介なところは、参加者のサイコロとおじさんのサイコロが違うものであるかもしれない、という点だ。参加者はあらかじめ両者のサイコロの展開図を見ることができるので、それをヒントに予想することになる。

つまり、簡単な確率の計算だ。とはいえ確率は高校数学の範囲で、小学生にはちょっと荷が重いかもしれない。子供たちの中で一番利発そうな子でさえ、三つ編みにした髪を揺らしながら考え込んでいる。もうすぐ僕に助けを求めてくることだろう。さて、たまにはオトナらしいところを見せてあげようではないか。

Input

入力は複数のケースからなる。

各ケースでは、サイコロの展開図が21×57のグリッドで与えられる。

最初の21×28（(0,0)が左上,(20,27)が右下）のグリッドが参加者のサイコロを表す。

最後の21×28（(0,29)が左上,(20,56)が右下）がおじさんのサイコロを表す。

参加者のサイコロの各面は(0,7)、(7,0)、(7,7)、(7,14)、(7,21)、(14,7)を左上とする7×7のサブグリッドで与えられている。

展開図に書かれている数字は、それぞれ元の数字を

左右反転

左右反転、そのあとで反時計回りに90度回転

左右反転

左右反転、そのあとで反時計回りに270度回転

左右反転

上下反転、そのあとで左右反転

させたものである。

おじさんのサイコロの各面は(0,36)、(7,29)、(7,36)、(7,43)、(7,50)、(14,36)を左上とする７×７のサブグリッドで与えられている。

おじさんのサイコロの展開図に書かれている数字は参加者のサイコロと同じ規則で描かれている。

サイコロの各面には1から9までの中のどれかが書かれている。
数字は以下のような7x7のグリッドで与えられる。
#######
#.....#
#...|.#
#.....#
#...|.#
#..-..#
#######

#######
#..-..#
#...|.#
#..-..#
#.|...#
#..-..#
#######

#######
#..-..#
#...|.#
#..-..#
#...|.#
#..-..#
#######

#######
#.....#
#.|.|.#
#..-..#
#...|.#
#.....#
#######

#######
#..-..#
#.|...#
#..-..#
#...|.#
#..-..#
#######

#######
#..-..#
#.|...#
#..-..#
#.|.|.#
#..-..#
#######

#######
#..-..#
#...|.#
#.....#
#...|.#
#.....#
#######

#######
#..-..#
#.|.|.#
#..-..#
#.|.|.#
#..-..#
#######

#######
#..-..#
#.|.|.#
#..-..#
#...|.#
#..-..#
#######

ただし上記の数字を90度、または270度回転させた時、"|"と"-"は入れ替わっている。

入力の終わりは1つの0からなる行によって与えられる

入力として与えられるサイコロは必ず正しい物である。
また決着がつかないようなサイコロは与えられない。

Output

"HIGH"になる場合と"LOW"になる場合で確率が高いほうを1行に出力せよ。
両者の確率が同じ場合は"HIGH"を出力せよ。

Sample input

.......#######......................#######..............
.......#.....#......................#..-..#..............
.......#.|...#......................#.|.|.#..............
.......#.....#......................#..-..#..............
.......#.|...#......................#.|...#..............
.......#..-..#......................#..-..#..............
.......#######......................#######..............
############################.############################
#.....##..-..##.....##..-..#.#.....##..-..##.....##..-..#
#.-.-.##...|.##.-.-.##.|.|.#.#.....##.|.|.##.-.-.##.|.|.#
#|.|.|##..-..##|.|.|##..-..#.#....|##..-..##|.|.|##..-..#
#...-.##.|...##...-.##.|.|.#.#.-.-.##.|...##...-.##.|...#
#.....##..-..##.....##..-..#.#.....##..-..##.....##..-..#
############################.############################
.......#######......................#######..............
.......#..-..#......................#..-..#..............
.......#.|...#......................#.|...#..............
.......#..-..#......................#..-..#..............
.......#.|.|.#......................#...|.#..............
.......#..-..#......................#..-..#..............
.......#######......................#######..............
.......#######......................#######..............
.......#..-..#......................#..-..#..............
.......#.|...#......................#...|.#..............
.......#..-..#......................#..-..#..............
.......#...|.#......................#.|.|.#..............
.......#..-..#......................#..-..#..............
.......#######......................#######..............
############################.############################
#.....##..-..##.....##..-..#.#.....##..-..##.....##..-..#
#.-.-.##...|.##.-.-.##.|.|.#.#...-.##...|.##.-...##.|.|.#
#|.|.|##..-..##|.|.|##..-..#.#|.|.|##..-..##|.|.|##..-..#
#.-.-.##.|...##...-.##.|...#.#.-...##.|.|.##.-.-.##.|...#
#.....##..-..##.....##..-..#.#.....##..-..##.....##..-..#
############################.############################
.......#######......................#######..............
.......#..-..#......................#..-..#..............
.......#...|.#......................#.|...#..............
.......#..-..#......................#..-..#..............
.......#.|...#......................#...|.#..............
.......#..-..#......................#..-..#..............
.......#######......................#######..............
.......#######......................#######..............
.......#..-..#......................#..-..#..............
.......#.|...#......................#.|.|.#..............
.......#..-..#......................#..-..#..............
.......#...|.#......................#.|...#..............
.......#..-..#......................#..-..#..............
.......#######......................#######..............
############################.############################
#.....##..-..##.....##..-..#.#.....##..-..##.....##.....#
#.-.-.##.|.|.##.-.-.##...|.#.#.....##.|.|.##...-.##.|...#
#|.|.|##..-..##|....##..-..#.#....|##..-..##|.|.|##.....#
#.-.-.##.|.|.##.....##.|.|.#.#.-.-.##.|.|.##.-...##.|...#
#.....##..-..##.....##..-..#.#.....##..-..##.....##..-..#
############################.############################
.......#######......................#######..............
.......#..-..#......................#..-..#..............
.......#.|.|.#......................#.|...#..............
.......#..-..#......................#..-..#..............
.......#...|.#......................#...|.#..............
.......#..-..#......................#..-..#..............
.......#######......................#######..............
.......#######......................#######..............
.......#..-..#......................#..-..#..............
.......#.|...#......................#.|.|.#..............
.......#..-..#......................#..-..#..............
.......#...|.#......................#.|...#..............
.......#..-..#......................#..-..#..............
.......#######......................#######..............
############################.############################
#.....##..-..##.....##..-..#.#.....##..-..##.....##..-..#
#.-.-.##...|.##.-.-.##.|.|.#.#.-...##.|.|.##.-...##.|.|.#
#|.|.|##..-..##|.|.|##..-..#.#|.|.|##..-..##|.|.|##..-..#
#...-.##.|...##.-.-.##.|.|.#.#.-.-.##.|...##.-.-.##.|.|.#
#.....##..-..##.....##..-..#.#.....##..-..##.....##..-..#
############################.############################
.......#######......................#######..............
.......#..-..#......................#..-..#..............
.......#...|.#......................#.|.|.#..............
.......#..-..#......................#..-..#..............
.......#.|...#......................#...|.#..............
.......#..-..#......................#..-..#..............
.......#######......................#######..............
0

Sample output

LOW
HIGH
HIGH
LOW

The University of Aizu Programming Contest 2011 Summer

原案、問題文: Takashi Tayama

Solution in C++11 (judge verdict: Wrong Answer)

#include <iostream>
#include <string>
#include <algorithm>
#include <cstdlib>
#include <cassert>
#include <random>
using namespace std;
int dicea[6],diceb[6];
string str[21];
int mk_num(string *);

void lr_hanten(string a[]){
  for(int i=0;i<7;i++)
    for(int j=0;j<7/2;j++) swap(a[i][j],a[i][6-j]);
}

void ud_hanten(string a[]){
  for(int i=0;i<7;i++) 
    for(int j=0;j<7/2;j++) swap(a[j][i],a[6-j][i]);
}

void rol_90(string a[]){
  string b[7];
  for(int i=0;i<7;i++)
    for(int j=0;j<7;j++) {
      b[i] += a[j][6-i];
      if(b[i][j] == '-') b[i][j] = '|';
      else if(b[i][j] =='|') b[i][j] = '-';
    }
  for(int i=0;i<7;i++) a[i] = b[i];
}

void choice(string num[],int x,int y){
  for(int i=0;i<7;i++){
    num[i]="";
    for(int j=0;j<7;j++) num[i]+=str[y+i][x+j];
  }
}

void mk_dice(){
  string num[2][7];
  //ue
  choice(num[0],7,0),choice(num[1],36,0);
  lr_hanten(num[0]),lr_hanten(num[1]);
  dicea[0] = mk_num(num[0]),diceb[0]=mk_num(num[1]);
  
  //hidari
  choice(num[0],0,7),choice(num[1],29,7);
  lr_hanten(num[0]),lr_hanten(num[1]);
  rol_90(num[0]),rol_90(num[1]);
  dicea[1] = mk_num(num[0]),diceb[1] = mk_num(num[1]);

  //mid_hidari
  choice(num[0],7,7),choice(num[1],36,7);
  lr_hanten(num[0]),lr_hanten(num[1]);
  dicea[2] = mk_num(num[0]),diceb[2] = mk_num(num[1]);

  //mid_migi
  choice(num[0],14,7),choice(num[1],43,7);
  lr_hanten(num[0]),lr_hanten(num[1]);
  for(int i=0;i<3;i++)rol_90(num[0]),rol_90(num[1]);
  dicea[3] = mk_num(num[0]),diceb[3] = mk_num(num[1]);

  //migi
  choice(num[0],21,7),choice(num[1],50,7);
  lr_hanten(num[0]),lr_hanten(num[1]);
  dicea[4] = mk_num(num[0]),diceb[4] = mk_num(num[1]);


  //sita
  choice(num[0],7,14),choice(num[1],36,14);
  ud_hanten(num[0]),ud_hanten(num[1]);
  lr_hanten(num[0]),lr_hanten(num[1]);
  dicea[5] = mk_num(num[0]),diceb[5] = mk_num(num[1]);
}

int main(){
  srand((unsigned)time(NULL));
  while(1) {
    for(int i=0;i<21;i++){
      cin >> str[i];
      if(str[i]=="0")break;
    }
    if(str[0]=="0")break;
    mk_dice();
    int a=0,b=0;
    for(int i=0;i<6;i++) assert(dicea[i]!=-1 && diceb[i]!=-1);

    int arr[6]={};
    std::random_device rnd;    
    for(int i=0;i<10000;i++){
      arr[rnd()%6]++;
      if(dicea[rnd()%6] > diceb[rnd()%6]) a++;
      else if(dicea[rnd()%6]<diceb[rnd()%6])b++;
    }
    // for(int i=0;i<6;i++) cout <<arr[i]<<" ";cout<<endl;
    if(a>b-500) cout<<"HIGH"<<endl;
    else cout <<"LOW"<<endl;
  }

}

int mk_num(string a[]){
  if(a[1]=="#.....#" &&
     a[2]=="#...|.#") return 1;

  if(a[1]=="#..-..#" && 
     a[2]=="#...|.#" &&   
     a[3]=="#..-..#" &&
     a[4]=="#.|...#" &&
     a[5]=="#..-..#") return 2;

  if(a[1]=="#..-..#" && 
     a[2]=="#...|.#" &&   
     a[3]=="#..-..#" &&
     a[4]=="#...|.#" &&
     a[5]=="#..-..#") return 3;

  if(a[1]=="#.....#" &&
     a[5]=="#.....#") return 4;

  if(a[1]=="#..-..#" && 
     a[2]=="#.|...#" &&
     a[3]=="#..-..#" &&
     a[4]=="#...|.#" &&
     a[5]=="#..-..#") return 5;

  if(a[1]=="#..-..#" && 
     a[2]=="#.|...#" &&
     a[3]=="#..-..#" &&
     a[4]=="#.|.|.#" &&
     a[5]=="#..-..#") return 6;

  if(a[3]=="#.....#" &&
     a[5]=="#.....#") return 7;

  if(a[1]=="#..-..#" && 
     a[2]=="#.|.|.#" &&
     a[3]=="#..-..#" &&
     a[4]=="#.|.|.#" &&
     a[5]=="#..-..#") return 8;

  if(a[1]=="#..-..#" && 
     a[2]=="#.|.|.#" &&
     a[3]=="#..-..#" &&
     a[4]=="#...|.#" &&
     a[5]=="#..-..#") return 9;
  return -1;
}