public String toString() {
    StringBuilder sb = new StringBuilder();
    int c1 = 18;
    int sc = 6;
    // Print header
    sb.append(String.format("%" + c1 + "s |", "Category"));
    for (Player player : players) {
      sb.append(String.format(" %-" + (sc * 3 + 4) + "s  |", player.getName()));
    }
    sb.append("\n");
    for (Category category : Category.allCategories) {
      sb.append(String.format("%" + c1 + "s |", category.getTitle() + (category.isComputed() ? "=" : ":")));
      for (Player player : players) {
        for (int i = 0; i < 3; i++) {
          Integer score = category.getScore(player, i);
          sb.append(String.format(" %" + sc + "s ", score == null ? "" : score.toString()));
        }
        sb.append(" |");
      }
      sb.append("\n");
    }
    sb.append(String.format("%" + c1 + "s |", "Grand Total"));
    for (Player player : players) {
      sb.append(String.format(" %" + (sc * 3 + 4) + "s  |", player.getGrandTotal()));
    }
    sb.append("\n");
    return sb.toString();
  }