## Step 1: Define the symbolic variables and the optimization problem

Let's define the symbolic variables:
- $x_1$ represents the number of slow shots
- $x_2$ represents the number of quick shots

The objective is to maximize the score, where a slow shot is worth 3 points and a quick shot is worth 6 points. Therefore, the objective function can be represented as $3x_1 + 6x_2$.

## Step 2: List the constraints

The constraints based on the problem description are:
1. Tom can take at most 20 shots: $x_1 + x_2 \leq 20$
2. Tom must take at least 8 slow shots: $x_1 \geq 8$
3. Tom must take at least 5 quick shots: $x_2 \geq 5$
4. Tom can take at most 12 slow shots: $x_1 \leq 12$
5. Tom can take at most 12 quick shots: $x_2 \leq 12$

## 3: Symbolic representation of the problem

The symbolic representation of the problem is:
```json
{
    'sym_variables': [('x1', 'slow shots'), ('x2', 'quick shots')],
    'objective_function': '3*x1 + 6*x2',
    'constraints': [
        'x1 + x2 <= 20',
        'x1 >= 8',
        'x2 >= 5',
        'x1 <= 12',
        'x2 <= 12'
    ]
}
```

## 4: Convert the problem into Gurobi code

Now, let's convert this problem into Gurobi code in Python:
```python
import gurobi

def solve_optimization_problem():
    # Create a new model
    model = gurobi.Model()

    # Define the variables
    x1 = model.addVar(lb=0, ub=None, name="slow_shots", vtype=gurobi.GRB.INTEGER)
    x2 = model.addVar(lb=0, ub=None, name="quick_shots", vtype=gurobi.GRB.INTEGER)

    # Set bounds according to constraints
    x1.lb = 8
    x2.lb = 5
    x1.ub = 12
    x2.ub = 12

    # Objective function
    model.setObjective(3 * x1 + 6 * x2, gurobi.GRB.MAXIMIZE)

    # Additional constraint: x1 + x2 <= 20
    model.addConstr(x1 + x2 <= 20)

    # Optimize the model
    model.optimize()

    # Print the solution
    if model.status == gurobi.GRB.OPTIMAL:
        print("Optimal solution found.")
        print(f"Slow shots: {x1.varValue}")
        print(f"Quick shots: {x2.varValue}")
        print(f"Max score: {3 * x1.varValue + 6 * x2.varValue}")
    else:
        print("No optimal solution found.")

solve_optimization_problem()
```