import itertools


# Solució 1

def batched(iterable, n, *, strict=False):
    # batched('ABCDEFG', 3) → ABC DEF G
    if n < 1:
        raise ValueError('n must be at least one')
    iterator = iter(iterable)
    while batch := tuple(itertools.islice(iterator, n)):
        if strict and len(batch) != n:
            raise ValueError('batched(): incomplete batch')
        yield batch


itertools.batched = batched


def posicions_fresa_1(origen, desp):
    ternes = itertools.batched(desp, 3)
    posicions = itertools.accumulate(
        ternes,
        lambda p, d: tuple(a+b for a, b in zip(p, d)),
        initial=origen
    )
    return posicions


# Solució 2

def posicions_fresa_2(origen, desp):
    p = origen
    yield p
    d = tuple(itertools.islice(desp, 3))
    while len(d) != 0:
        p = tuple(a+b for a, b in zip(p, d))
        yield p
        d = tuple(itertools.islice(desp, 3))

        
# Solució 3
        
def posicions_fresa_3(origen, desp):
    yield origen
    p = list(origen)
    itidx = itertools.cycle(range(3))
    for i, d in zip(itidx, desp):
        p[i] += d   
        if i == 2:
            yield tuple(p)
            
    
# Tria la solució que vols provar

# posicions_fresa = posicions_fresa_1
posicions_fresa = posicions_fresa_3
