| f | from fractions import Fraction | f | from fractions import Fraction | 
            |  |  |  |  | 
            |  | class Sausage: |  | class Sausage: | 
            |  |  |  |  | 
            | n | def __init__(self, meat='pork!', volume=1): | n | def __init__(self, ground='pork!', volume=1): | 
            |  | self.meat = meat |  | self.ground = ground | 
            |  | self.volume = Fraction(volume) |  | self.volume = Fraction(volume) | 
            |  |  |  |  | 
            |  | def __abs__(self): |  | def __abs__(self): | 
            |  | return self.volume |  | return self.volume | 
            |  |  |  |  | 
            |  | def __add__(self, other): |  | def __add__(self, other): | 
            | n | return Sausage(self.meat, self.volume + other.volume) | n | return Sausage(self.ground, self.volume + other.volume) | 
            |  |  |  |  | 
            |  | def __sub__(self, other): |  | def __sub__(self, other): | 
            | n | return Sausage(self.meat, max(self.volume - other.volume, 0)) | n | return Sausage(self.ground, max(self.volume - other.volume, 0)) | 
            |  |  |  |  | 
            |  | def __mul__(self, factor): |  | def __mul__(self, factor): | 
            | n | return Sausage(self.meat, self.volume * factor) | n | return Sausage(self.ground, self.volume * factor) | 
            |  |  |  |  | 
            |  | def __rmul__(self, factor): |  | def __rmul__(self, factor): | 
            |  | return self * factor |  | return self * factor | 
            |  |  |  |  | 
            |  | def __truediv__(self, divisor): |  | def __truediv__(self, divisor): | 
            | n | return Sausage(self.meat, self.volume / divisor) | n | return Sausage(self.ground, self.volume / divisor) | 
            |  |  |  |  | 
            |  | def __bool__(self): |  | def __bool__(self): | 
            |  | return self.volume > 0 |  | return self.volume > 0 | 
            |  |  |  |  | 
            |  | def __str__(self): |  | def __str__(self): | 
            |  | if self.volume == 0: |  | if self.volume == 0: | 
            |  | return '/|\n||\n||\n||\n\\|' |  | return '/|\n||\n||\n||\n\\|' | 
            |  | full_loafs = int(self.volume) |  | full_loafs = int(self.volume) | 
            | n | rems = self.volume - full_loafs | n | remaining_fraction = self.volume - full_loafs | 
            |  | str1, str2, str3 = ('', '', '') |  | top_border, ground_line, bottom_border = ('', '', '') | 
            |  | for i in range(full_loafs): |  | for _ in range(full_loafs): | 
            |  | border1, filling, border2 = self.full() |  | a, b, c = self._create_full_loaf() | 
            |  | str1 += border1 |  | top_border += a | 
            |  | str2 += filling |  | ground_line += b | 
            |  | str3 += border2 |  | bottom_border += c | 
            |  | if rems > 0: |  | if remaining_fraction > 0: | 
            |  | border1, filling, border2 = self.partial(rems) |  | a, b, c = self._create_partial_loaf(remaining_fraction) | 
            |  | str1 += border1 |  | top_border += a | 
            |  | str2 += filling |  | ground_line += b | 
            |  | str3 += border2 |  | bottom_border += c | 
            |  | return str1 + '\n' + (str2 + '\n') * 3 + str3 |  | return top_border + '\n' + (ground_line + '\n') * 3 + bottom_bor | 
            |  |  |  | der | 
            |  |  |  |  | 
            | n | def full(self): | n | def _create_full_loaf(self): | 
            |  |  |  | ground_remainder = 12 % len(self.ground) | 
            |  | main = 12 // len(self.meat) |  | ground_main = 12 // len(self.ground) | 
            |  | remain = 12 % len(self.meat) |  |  | 
            |  | border1 = '/------------\\' |  | top_border = '/------------\\' | 
            |  | filling = f'|{self.meat * main + self.meat[:remain]}|' |  | ground_line = f'|{self.ground * ground_main + self.ground[:groun | 
            |  |  |  | d_remainder]}|' | 
            |  | border2 = '\\------------/' |  | bottom_border = '\\------------/' | 
            |  | return (border1, filling, border2) |  | return (top_border, ground_line, bottom_border) | 
            |  |  |  |  | 
            | t | def partial(self, fraction): | t | def _create_partial_loaf(self, fraction): | 
            |  | remaining_length = fraction.numerator * (12 // fraction.denomina |  | total_ground_length = fraction.numerator * (12 // fraction.denom | 
            |  | tor) |  | inator) | 
            |  | count_of_meat = remaining_length // len(self.meat) |  | ground_count = total_ground_length // len(self.ground) | 
            |  | remaining_meat_length = remaining_length - count_of_meat * len(s |  | leftover_ground_length = total_ground_length - ground_count * le | 
            |  | elf.meat) |  | n(self.ground) | 
            |  | border1 = '/' + '-' * remaining_length + '|' |  | top_border = '/' + '-' * total_ground_length + '|' | 
            |  | filling = f'|{self.meat * count_of_meat + self.meat[:remaining_m |  | ground_line = f'|{self.ground * ground_count + self.ground[:left | 
            |  | eat_length]}|' |  | over_ground_length]}|' | 
            |  | border2 = '\\' + '-' * remaining_length + '|' |  | bottom_border = '\\' + '-' * total_ground_length + '|' | 
            |  | return (border1, filling, border2) |  | return (top_border, ground_line, bottom_border) |