Learn Interfaces by Building an Equation Solver - Step 52

Tell us what’s happening:

the instruction is to create a new string. then add that string to output_string.
string =f’\n\n{equation!s:-^24}\n\n’. The format use ‘!s’ and str().
the instruction:
Create a string containing the string representation of your equation centered in a width of `24` characters. Make the string begin and end with two newline characters, and add your new string to the current value of `output_string` .
the new output is:
----Linear Equation-----

-------2x +3 = 0--------
The check code returns ’ The `solver` function should return a different string.’
Not understanding the comment returned or for that matter what’s wrong.
is there something wrong with the output ? or do I need to create and return a thrid variable?

``````from abc import ABC, abstractmethod
import re

class Equation(ABC):
degree: int
type: str

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'"
)
if not hasattr(cls, "type"):
raise AttributeError(
f"Cannot create '{cls.__name__}' class: missing required attribute 'type'"
)

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'
return re.sub(r"(?<!\d)1(?=x)", "", equation_string.strip("+"))

@abstractmethod
def solve(self):
pass

@abstractmethod
def analyze(self):
pass

class LinearEquation(Equation):
degree = 1
type = 'Linear Equation'

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}

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):
if self.delta < 0:
return []
a, b, _ = self.coefficients.values()
x1 = (-b + (self.delta) ** 0.5) / (2 * a)
x2 = (-b - (self.delta) ** 0.5) / (2 * a)
if self.delta == 0:
return [x1]

return [x1, x2]

def analyze(self):
a, b, c = self.coefficients.values()
x = -b / (2 * a)
y = a * x**2 + b * x + c
if a > 0:
concavity = 'upwards'
min_max = 'min'
else:
concavity = 'downwards'
min_max = 'max'
return {'x': x, 'y': y, 'min_max': min_max, 'concavity': concavity}

def solver(equation):
if not isinstance(equation, Equation):
raise TypeError("Argument must be an Equation object")

# User Editable Region

string =f'\n\n{equation!s:-^24}\n\n'
output_string = f'\n{equation.type:-^24}'+ string

# User Editable Region

return output_string

lin_eq = LinearEquation(2, 3)
print(solver(lin_eq))

``````

User Agent is: `Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36`

Challenge Information:

Learn Interfaces by Building an Equation Solver - Step 52

keep building the output by concatenating strings to `output_string`

Can you think of a different operator to use here that will add to an existing variable?

Create a string

You’ve taken this to mean “Create a variable named `string`” but that’s not what it says to do, exactly

EDIT: Disregard this, you can use an intermediate variable like `string` and concatenate like this

The problem here is not how the string is concatenated but the string itself.

Instructions do not mention to use any character to fill the space around the equation.

1 Like

thanks - that was the issue. Bad assumption on my part.

Thank you very much for your very nice guidance.