Learn Interfaces by Building an Equation Solver - Step 36

Tell us what’s happening:

in regards to other responses to this step, where people have struggled i came across the response of don’t remove anything before the 1 which i never did, however i am still confused on why this gives me an TypeError

Your code so far

from abc import ABC, abstractmethod
import re


class Equation(ABC):
    degree: int
  
    def __init__(self, *args):
        if (self.degree + 1) != len(args):
            raise TypeError(
                f"'Equation' object takes {self.degree + 1} positional arguments but {len(args)} were given"
            )
        if any(not isinstance(arg, (int, float)) for arg in args):
            raise TypeError("Coefficients must be of type 'int' or 'float'")
        if args[0] == 0:
            raise ValueError("Highest degree coefficient must be different from zero")
        self.coefficients = {(len(args) - n - 1): arg for n, arg in enumerate(args)}

    def __init_subclass__(cls):
        if not hasattr(cls, "degree"):
            raise AttributeError(
                f"Cannot create '{cls.__name__}' class: missing required attribute 'degree'"
            )

    def __str__(self):
        terms = []
        for n, coefficient in self.coefficients.items():
            if not coefficient:
                continue
            if n == 0:
                terms.append(f'{coefficient:+}')
            elif n == 1:
                terms.append(f'{coefficient:+}x')
            else:
                terms.append(f"{coefficient:+}x**{n}")
        equation_string = ' '.join(terms) + ' = 0'

# User Editable Region

        return re.sub(r'(?<!\d)1','1(?=x)','', equation_string.strip('+'))        

# User Editable Region

    @abstractmethod
    def solve(self):
        pass
        
    @abstractmethod
    def analyze(self):
        pass
        
class LinearEquation(Equation):
    degree = 1
    
    def solve(self):
        a, b = self.coefficients.values()
        x = -b / a
        return x

    def analyze(self):
        slope, intercept = self.coefficients.values()
        return {'slope': slope, 'intercept': intercept}

class QuadraticEquation(Equation):
    degree = 2

    def __init__(self, *args):
        super().__init__(*args)
        a, b, c = self.coefficients.values()
        self.delta = b**2 - 4 * a * c
   
    def solve(self):
        pass
    
    def analyze(self):
        pass


lin_eq = LinearEquation(2, 3)
print(lin_eq)
quadr_eq = QuadraticEquation(11, -1, 1)
print(quadr_eq)

Your browser information:

User Agent is: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36

Challenge Information:

Learn Interfaces by Building an Equation Solver - Step 36

You’ve added an argument to sub which is of the wrong type

Read more here https://www.pythontutorial.net/python-regex/python-regex-sub/

Add a positive lookahead to your regex pattern

Add to the existing regex.

but it says in the instructions this In the example above, the pattern a(?=t) contains a positive lookahead, which is used to match the a c this positive lookahead is in the format

my formatt is '1(?=x)' so i don’t see how it isn’t positive

That’s correct, read my advice above. Ask me if there’s something you don’t understand.

becuase how can it be of the wrong type when all it’s telling me to do is add the positive lookahead with character 1 and followed by x, i mean it seems like a obvious step

How many arguments does sub() take?

What type of arguments should they be?

yeah but i’ve not added anything to that i wasn’t suppose to, this instruction doesn’t tell me to remove/modify anything is that what i should do ?

If you’re getting a a Type Error you can be confident that you’ve added something of the wrong type somewhere.

Look at the example code again, and see how you are giving a different set of arguments to the sub() function.

3-4 arguments and they should be a pattern, a replacement a string and one or more regx flags to modify function

The instructions literally tell you to modify your regex:

Add a positive lookahead to your regex pattern

no what i mean by modify is change it, not add, this whole python lingo with add and stuff is new

You need to add to the existing regex. You’ve added another argument with an additional regex.

1 Like

do you mean like this ?

return re.sub(r'(?<!\d)1'+'1(?=x)', '', equation_string.strip('+')

make it a single string, not multiple ones