clean this up?

```python
import re
import random

# roll result enum
class Fail():
    def __repr__(self):
        return "FAIL"
FAIL = Fail()

class Partial():
    def __repr__(self):
        return "PARTIAL"
PARTIAL = Partial()

class Success():
    def __repr__(self):
        return "SUCCESS"
SUCCESS = Success()

class Critical():
    def __repr__(self):
        return "CRITICAL"
CRITICAL = Critical()


def roll(n):
    """Roll nD6 and return a list of rolls"""
    return [random.randint(1, 6) for _ in range(n)]

def determine_result(rolls):
    """Determine the result based on the rolls"""
    if rolls.count(6) >= 3:
        return CRITICAL
    if 6 in rolls:
        return SUCCESS
    if rolls.count(5) >= 3:
        return SUCCESS
    if 5  in rolls:
        return PARTIAL
    if 4 in rolls:
        return PARTIAL
    return FAIL

def make_roll(skill = 0, stat = 0, difficulty = 0, help = False, bargain = False):
    """Make a roll with the given skill, stat, and difficulty"""
    n = skill + stat + difficulty + (1 if help else 0) + (1 if bargain else 0)
    if n < 1:
        return [min(roll(2))]
    return roll(n)

def make_roll(roll):
    """Make a roll with the given skill, stat, and difficulty"""
    make_roll(roll.skill, roll.stat, roll.difficulty, roll.help, roll.bargain)


rolls = make_roll(2, 2, -2, True, False)
result = determine_result(rolls)
print(rolls)
print(result)

# roll 3D6 10000 times and print the number of each result
rolls = [determine_result(make_roll(2, 2, -2, True, False)) for _ in range(10000)]


# estimate the probability of each result
print("FAIL: ", rolls.count(FAIL) / len(rolls))
print("PARTIAL: ", rolls.count(PARTIAL) / len(rolls))
print("SUCCESS: ", rolls.count(SUCCESS) / len(rolls))
print("CRITICAL: ", rolls.count(CRITICAL) / len(rolls))
```