Learn Interfaces by Building an Equation Solver - Step 58

Tell us what’s happening:

I don’t understand the instruction. After your match/case block, iterate through result_list and concatenate each element to output_string. Keep aligning the text to the center and make each result string end with a new line character. i understand the iterate through but even then it doesn’t specify the loop variable, now concatenate means add variable so how does concatenate each element to output_string make sense?

Your code so far

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}


class QuadraticEquation(Equation):
    degree = 2
    type = 'Quadratic Equation'

    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")

    output_string = f'\n{equation.type:-^24}'
    output_string += f'\n\n{equation!s:^24}\n\n'
    output_string += f'{"Solutions":-^24}\n\n'
    results = equation.solve()

# User Editable Region

    match len(results):
        case 0:
            result_list = ['No real roots']
        case 1:
            result_list = [f'x = {results[0]:+}']
        case 2:
            result_list = [f'x1 = {results[0]:+}', f'x2 = {results[1]:+}']
    for results in result_list:
        
        


# User Editable Region

    return output_string

lin_eq = LinearEquation(2, 3)
quadr_eq = QuadraticEquation(1, 2, 1)
print(solver(lin_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 58

i dont understand how i could add each element of the results list, when there are multiple results_list

i was thinking of using the.join() function but i still got errors

output_string.join(f'{output_string:^24}/n/n') 

that is what i’ve got and this the only one with an error

just realised my newlines were wrong lol

still getting error tho The solver function should return a different string.

result_list would be a list of results, so if you iterate through that each item would be 1 result so it would make sense to use result.

output_string.join(f'{output_string:^24}/n/n')

Look up how join works. This would not work the way you think it will. There is a specific way to “concatenate” a string, which is to add on to it.

If you can remember this project, you are concatenating the encrypted_text and char
strings.

EDIT: forgot to link the step I was referring to:
https://www.freecodecamp.org/learn/scientific-computing-with-python/learn-string-manipulation-by-building-a-cipher/step-56

Print out the result so you can see what string you are returning.

at the end there is only one, as only one of the cases execute

Python String Concatenation [Using Different Ways] at this article and came up with this

for result in result_list:
        "".join([result_list,output_string])
    print(result)
        
for result in result_list:
        "".join([result_list,output_string])
    print(result)

i’ve got this

Don’t use join, just use the += operator, as you did here:

for char in message.lower():
        if char == ' ':
            encrypted_text += char

This is not being stored in any variable, and it’s not evening using the result variable of the loop?

i am just confused, i type up on google how to concatenate strings and it comes up with join, and you are telling me to use the plus or equal to, this is my code now based off what you have said

for result in result_list:
        result+=output_string
    print(result_list)

i’m still stuck on the Keep aligning the text to the center and make each result string end with a new line character. part

You could use join(), I believe, but you weren’t using it correctly and I think it’s simpler to use +=

print(result_list)

This line is not printing the final result. It’s printing the input, result_list. The output is a string called output_string, so you want to print that. This is just so we can see the effect of our code.

You can see it’s currently printing this:

['x = -1.5']

Change it to print output_string

iterate through result_list and concatenate each element to output_string

What you have is close, but you want to start with output_string and then add result on to the end of it.

Keep aligning the text to the center and make each result string end with a new line character.

This means you’ll be using the formatting characters you learned previously in this project, very similar to this:

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

but using a loop this time.

okay very helpful sir i’ve got this

 for result in result_list:
        output_string+= f'{result:-^24}\n'
    print(output_string)

would i be right in saying the issue is after the +=

You have two formatting things to do:

  • center align
  • end with a newline

Can you sort out what each character in your formatting is doing?
What does the output look like, is it centered and on new lines?
Does anything look weird or out of place in the printed output?

this is what i’m looking at.
-------Solutions--------

--------x = -1.5--------

i don’t think anything looks weird maybe in between the - and -1.5

oh the thing on the sides, lol the dashes i took them out, tbh i was just playing about with the code n i passed, thanks my friend

1 Like