abstract class HexAryt {

  abstract int dzial(int a, int b);
  abstract String nazwa();

  private char cyf1(int licz) {
    if (0<=licz && licz<10)  return (char)((int)('0')+licz);
    else  if (10<=licz && licz<16)  return (char)((int)('A')+licz-10);
    else  return '!';
  }

  private String cyf(int licz) {
    if (0<=licz && licz<16)  return " " + cyf1(licz);
    else  return "" + cyf1(licz/16) + cyf1(licz%16);
  }

  private String znaki(int n, char c) {
    String st="";
    for (int i=0; i<n; i++)  st += c;
    return st;
  }

  private String podkresl(char c) {
    String st = "\n ";
    if (nazwa().length() == 1)  st += ' ';
    st += znaki(nazwa().length()+2, c) + "+";
    for (int i=0; i<16; i++)  st += "+" + znaki(4, c);
    return st;
  }

  private String gornaRamka() {
    String st = "\n  ";
    if (nazwa().length() == 1)  st += ' ';
    st += nazwa() + " |";
    for (int i=0; i<16; i++)
      st += "| " + cyf(i) + ' ';
    return  st + podkresl('=');
  }

  private String wiersz(int w) {
    String st = "\n  ";
    st += znaki(nazwa().length()-2, ' ') + cyf(w) + " |";
    for (int k=0; k<16; k++)
      st += "| " + cyf(dzial(w,k)) + ' ';
    return  st + podkresl('-');
  }

  public String tabelka() {
    String st = gornaRamka();
    for (int w=0; w<16; w++)  st += wiersz(w);
    return st;
  }

}
