In case you might be unlucky enough not to know the best dark fantasy franchise ever, Berserk tells the story of a man that, hating gratuitous violence, decided to become a mercenary (thus one who sells violence, no gratuity anymore!) and starts an epic struggle against apparently unsormountable odds, unsure if he really wants to pursue a path of vengeance or to try to focus on his remaining and new loved ones.

*The main character, Gatsu,ready to start yet another Tuesday*

Ok, the first part was a joke, but you can read more about the tale of the main character, a "Byronic hero" for wikipedia, in other pages like [here](https://en.wikipedia.org/wiki/Berserk_(manga%29).

After an insanely long waiting, finally fans got the [follow up](https://en.wikipedia.org/wiki/Berserk_(2016_TV_series%29) of [the acclaimed 90s show](https://en.wikipedia.org/wiki/Berserk_(1997_TV_series%29).

Regrettably, while the first adaption was considerably shortened, the latter was quite butchered, missing entire parts, like the "lost children" arc, but that would have actual children butchered and thus you might get why it was decided to skip it. And fan could somehow cope with it, if it was not for the very meager use of CG (Computer Graphic).

Luckily, I am a simple man and every time Gatsu swings his humongous sword, that is enough to make me forget about everything else.

Your goal is to build a Berserk Rater function that takes an array/list of events of each episode (as strings) and calculate a rating based on that: you start with a score of 0 (hey, it's a work from Miura-sensei, I have great expectations to satisfy!) and you have to:

* subtract 2 each time "CG" is mentioned (case insensitive);
* add 5 every time "Clang" is mentioned (case insensitive);
* if a sentence has both "Clang" and "CG", "Clang" wins (add 5);
* remove 1 every time neither is mentioned (I get bored easily, you know, particularly if you remove important parts and keep side character whining for half an episode).

You should then return a string, structured like this:

* if the finale score is less than 0: "worstest episode ever";
* if the score is between 0 and 10: the score itself, as a string;
* if the finale score is more than 10: "bestest episode ever".

Examples:
```python
berserk_rater(["is this the CG from a P2 game?","Hell, no! Even the CG in the Dreamcast game was more fluid than this!","Well, at least Gatsu does his clang even against a mere rabbit", "Hey, Cosette was not in this part of the story!", "Ops, everybody dead again! Well, how boring..."])=="worstest episode ever"
berserk_rater(["missing the Count arc","lame CG","Gatsu doing its clang against a few henchmen", "even more lame CG"])=="0"
berserk_rater(["Farnese unable to shut the fuck up","awful CG dogs assaulting everybody", "Gatsu clanging the pig apostle!"])=="2"
berserk_rater(["spirits of the dead attacking Gatsu and getting clanged for good", "but the wheel spirits where really made with bad CG", "Isidoro trying to steal the dragon Slayer and getting a sort of clang on his face", "Gatsu vs. the possessed horse: clang!", "Farnese whining again...","a shame the episode ends with that scrappy CG"])=="10"
berserk_rater(["Holy chain knights being dicks", "Serpico almost getting clanged by Gatsu, but without losing his composure","lame CG","Luka getting kicked","Gatsu going clang against the angels", "Gatsu clanging vs Mozgus, big time!"])=="bestest episode ever"
```

Extra cookies if you manage to solve it all using a `reduce/inject` approach.

Oh, and in case you might want a taste of clang to fully understand it, [click](https://www.youtube.com/watch?v=IZgxH8MJFno) (one of the least gory samples I managed to find).

Difficulty: introductory

Starter code:

def berserk_rater(synopsis):
	

Solutions:
def berserk_rater(synopsis):
    n = sum([score(s.upper()) for s in synopsis])
    return 'worstest episode ever' if n < 0 else 'bestest episode ever' if n > 10 else str(n)
    
def score(s):
    return 5 if 'CLANG' in s else -2 if 'CG' in s else -1

import re

CG = re.compile(r"\bcg\b", flags=re.I)
CLANG = re.compile(r"\bclang", flags=re.I)


def berserk_rater(synopsis):
    score = sum(
        (5 if CLANG.search(line) else (-2 if CG.search(line) else -1))
        for line in synopsis
    )
    return (
        "worstest episode ever"
        if score < 0
        else "bestest episode ever"
        if score > 10
        else str(score)
    )

from functools import reduce; berserk_rater=lambda s: (lambda score: "worstest episode ever" if score<0 else "bestest episode ever" if score>10 else str(score))(reduce(lambda a,b: a+(lambda b: 5 if "clang" in b else -2 if "cg" in b else -1)(b.lower()),s,0))

def berserk_rater(synopsis):
    ball = 0
    ball = sum([ball + 5 if "clang" in i.lower() else ball - 2 if "cg" in i.lower() else ball - 1 for i in synopsis])
    return "worstest episode ever" if ball < 0 else str(ball) if ball <=10 else "bestest episode ever"

berserk_rater = lambda x: (lambda x: "worstest episode ever" if x < 0 else "bestest episode ever" if x > 10 else str(x))(sum(map(lambda x: (lambda x: 5 if "clang" in x else -2 if "cg" in x else -1)(x.lower()), x)))

def berserk_rater(synopsis):
    scores = []
    for sentence in synopsis:
        # Remove punctuation
        s = ''.join([c for c in sentence.lower() if c == ' ' or c.isalpha() or c.isdigit()])
        words = s.split()
        # Count the appropriate words
        cg = words.count('cg')
        clang = sum(1 for w in words if w.startswith('clang'))
        # Decide sentence scoore
        if clang:
            scores.append(5)
        elif cg:
            scores.append(-2)
        else:
            scores.append(-1)
        
    score = sum(scores)
    # Decode overall score
    if score < 0:
        return 'worstest episode ever'
    if score > 10:
        return 'bestest episode ever'
    return str(score)

def berserk_rater(a):
    r = 0
    for s in map(str.lower,a):
        if 'clang' in s: r += 5
        elif 'cg' in s: r -=2
        else: r -= 1    
    return 'worstest episode ever' if r<0 else str(r) if 0<=r<=10 else 'bestest episode ever'

def berserk_rater(l):
    score = 0
    for i in l:
        if 'cg' in i.lower() and 'clang' in i.lower(): score += 5
        elif 'clang' in i.lower(): score += 5
        elif 'cg' in i.lower(): score -= 2
        else: score -= 1
    
    if score < 0: return 'worstest episode ever'
    elif score > 10: return 'bestest episode ever'
    else: return str(score)

def berserk_rater(synopsis):
    s=0
    for sentence in synopsis:
        if 'clang' in sentence.lower():
            s+=5
        elif 'cg' in sentence.lower():
            s-=2
        else:
            s-=1
    if s<0:
        return 'worstest episode ever'
    elif s>10:
        return 'bestest episode ever'
    else:
        return str(s)