To solve Nolan's optimization problem, we first need to convert the natural language description into a symbolic representation. This involves defining variables and translating the objective and constraints into mathematical terms.

Let's define:
- $x_1$ as the number of multiple choice questions answered,
- $x_2$ as the number of short answer questions answered.

The objective function, which represents Nolan's total score, is to maximize $2x_1 + 5x_2$, since each multiple choice question is worth 2 points and each short answer question is worth 5 points.

The constraints are:
1. $x_1 \leq 20$ (at most 20 multiple choice questions),
2. $x_2 \leq 20$ (at most 20 short answer questions),
3. $x_1 \geq 15$ (at least 15 multiple choice questions),
4. $x_2 \geq 10$ (at least 10 short answer questions),
5. $x_1 + x_2 \leq 30$ (at most 30 questions in total).

Thus, the symbolic representation of Nolan's problem is:
```json
{
    'sym_variables': [('x1', 'number of multiple choice questions'), ('x2', 'number of short answer questions')],
    'objective_function': 'maximize 2*x1 + 5*x2',
    'constraints': ['x1 <= 20', 'x2 <= 20', 'x1 >= 15', 'x2 >= 10', 'x1 + x2 <= 30']
}
```

To solve this problem using Gurobi in Python, we can write the following code:

```python
from gurobipy import *

# Create a new model
m = Model("Nolan's Contest")

# Define variables
x1 = m.addVar(vtype=GRB.INTEGER, name="multiple_choice_questions")
x2 = m.addVar(vtype=GRB.INTEGER, name="short_answer_questions")

# Set objective function
m.setObjective(2*x1 + 5*x2, GRB.MAXIMIZE)

# Add constraints
m.addConstr(x1 <= 20, "max_multiple_choice")
m.addConstr(x2 <= 20, "max_short_answer")
m.addConstr(x1 >= 15, "min_multiple_choice")
m.addConstr(x2 >= 10, "min_short_answer")
m.addConstr(x1 + x2 <= 30, "total_questions")

# Optimize model
m.optimize()

# Print solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Multiple Choice Questions: {x1.x}")
    print(f"Short Answer Questions: {x2.x}")
    print(f"Total Score: {m.ObjVal}")
else:
    print("No optimal solution found")
```