## Step 1: Define the symbolic variables
Let's define the symbolic variables as follows:
- $x_1$ represents the number of newspaper ads.
- $x_2$ represents the number of radio ads.
- $x_3$ represents the number of television ads.

## Step 2: Convert the natural language description into a symbolic representation
The objective is to maximize the total number of viewers. The total number of viewers can be represented as $5000x_1 + 1000x_2 + 8000x_3$.

## 3: Define the constraints
1. The cost constraint: $1200x_1 + 500x_2 + 2000x_3 \leq 100000$.
2. The radio ad constraint: $x_2 \leq 10$.
3. The television ad constraint: $x_3 \leq \frac{1}{3}(x_1 + x_2 + x_3)$.
4. The newspaper ad constraint: $x_1 \geq 0.2(x_1 + x_2 + x_3)$.
5. Non-negativity constraints: $x_1 \geq 0, x_2 \geq 0, x_3 \geq 0$.

## 4: Simplify the constraints
1. The cost constraint remains: $1200x_1 + 500x_2 + 2000x_3 \leq 100000$.
2. The radio ad constraint remains: $x_2 \leq 10$.
3. The television ad constraint simplifies to: $3x_3 \leq x_1 + x_2 + x_3$ or $2x_3 \leq x_1 + x_2$.
4. The newspaper ad constraint simplifies to: $x_1 \geq 0.2x_1 + 0.2x_2 + 0.2x_3$ or $0.8x_1 \geq 0.2x_2 + 0.2x_3$ or $4x_1 \geq x_2 + x_3$.

## 5: Symbolic representation
```json
{
'sym_variables': [('x1', 'newspaper ads'), ('x2', 'radio ads'), ('x3', 'television ads')],
'objective_function': '5000*x1 + 1000*x2 + 8000*x3',
'constraints': [
    '1200*x1 + 500*x2 + 2000*x3 <= 100000',
    'x2 <= 10',
    '2*x3 <= x1 + x2',
    '4*x1 >= x2 + x3',
    'x1 >= 0',
    'x2 >= 0',
    'x3 >= 0'
]
}
```

## 6: Gurobi code
```python
import gurobipy as gp

# Create a new model
m = gp.Model("Theta_Sandwich_Ads")

# Define the variables
x1 = m.addVar(name="newspaper_ads", lb=0, vtype=gp.GRB.INTEGER)  # Number of newspaper ads
x2 = m.addVar(name="radio_ads", lb=0, vtype=gp.GRB.INTEGER)    # Number of radio ads
x3 = m.addVar(name="television_ads", lb=0, vtype=gp.GRB.INTEGER)  # Number of television ads

# Objective function: Maximize the total number of viewers
m.setObjective(5000*x1 + 1000*x2 + 8000*x3, gp.GRB.MAXIMIZE)

# Constraints
m.addConstr(1200*x1 + 500*x2 + 2000*x3 <= 100000, name="budget_constraint")  # Budget constraint
m.addConstr(x2 <= 10, name="radio_ads_constraint")  # Radio ads constraint
m.addConstr(2*x3 <= x1 + x2, name="television_ads_constraint")  # Television ads constraint
m.addConstr(4*x1 >= x2 + x3, name="newspaper_ads_constraint")  # Newspaper ads constraint

# Solve the model
m.solve()

# Print the results
if m.status == gp.GRB.OPTIMAL:
    print("Optimal solution found.")
    print(f"Number of newspaper ads: {x1.varValue}")
    print(f"Number of radio ads: {x2.varValue}")
    print(f"Number of television ads: {x3.varValue}")
    print(f"Total viewers: {5000*x1.varValue + 1000*x2.varValue + 8000*x3.varValue}")
else:
    print("No optimal solution found.")
```