简单有趣#191:和普通的数字【难度:2级】:
答案1:
from itertools import groupby
from operator import itemgetter
def sum_of_regular_numbers(arr):
xs = [(i, x-y) for i, (x, y) in enumerate(zip(arr, arr[1:]))]
it = (list(grp) for key, grp in groupby(xs, key=itemgetter(1)))
it = ((grp[0][0], len(grp)) for grp in it if len(grp) > 1)
return sum(sum(arr[i:i+n+1]) for i, n in it)
答案2:
def sum_of_regular_numbers(arr):
# (step size, step count, sequence base)
grouped = [(b - a, 1, a) for a, b in zip(arr[:-1], arr[1:])]
# Collate the groups by step size
i = 0
while i < len(grouped) - 1:
if grouped[i][0] == grouped[i + 1][0]:
grouped[i] = (grouped[i][0], grouped[i][1] + 1, grouped[i][2])
del grouped[i + 1]
else:
i += 1
# Use (first + last) * elements / 2 to find sum of each sequence longer than 2 elements long
return sum((2 * base + step * steps) * ((steps + 1) / 2) for step, steps, base in grouped if steps >= 2)
答案3:
def sum_of_regular_numbers(arr):
i, s = 0, 0
while i < len(arr)-2:
n, step = 1, arr[i]-arr[i+1]
while i+1+n < len(arr) and arr[i+n]-arr[i+1+n] == step: n += 1
if n >= 2: s += sum(arr[i:i+n+1])
i += n
return s
答案4:
from itertools import groupby
def sum_of_regular_numbers(arr):
dif = [list(g) for c, g in groupby(b - a for a, b in zip(arr, arr[1:]))]
res = 0
i = 0
for cons in dif:
if len(cons) > 1:
res += sum(arr[i:i + len(cons) + 1])
i += len(cons)
return res
答案5:
from itertools import groupby
from operator import itemgetter
def sum_of_regular_numbers(arr):
result = 0
xs = [(i, x-y) for i, (x, y) in enumerate(zip(arr, arr[1:]))]
it = (list(grp) for key, grp in groupby(xs, key=itemgetter(1)))
it = ((grp[0][0], len(grp)) for grp in it if len(grp) > 1)
return sum(sum(arr[i:i+n+1]) for i, n in it)
答案6:
def sum_of_regular_numbers(arr):
answer = 0
counter = 1
first, last, diff = arr[0], arr[0], None
for number in arr[1:]:
thisDiff = number - last
if counter == 1:
last, diff = number, thisDiff
counter += 1
elif thisDiff == diff:
last = number
counter += 1
else:
if counter >= 3:
answer += (first + last) * counter // 2
counter = 2
first, last, diff = last, number, thisDiff
if counter >= 3:
answer += (first + last) * counter // 2
return answer
答案7:
from itertools import groupby, chain
def sum_of_regular_numbers(arr):
lst = (list(list(i[0]) for i in k ) for _, k in groupby((zip((zip(arr, arr[1:])), (abs(x[0]-x[1]) for x in zip(arr, arr[1:])))), lambda z: z[1]))
return sum(map(sum, filter(lambda z: len(z)>2, map(lambda z: set(chain(*z)), filter(lambda z: len(z)>1, lst)))))
答案8:
def sum_of_regular_numbers(a):
s = 0; b = 0; t = 0
while b < len(a)-2:
s = a[b] - a[b+1]
i = b+2
while i < len(a) and a[i-1]-a[i] == s:
i += 1
if i-b >= 3:
t += sum(a[b:i])
b = i-1
return t
答案9:
def sum_of_regular_numbers(a):
s = 0
b = 0
t = 0
while b < len(a)-2:
l = a[b:b+2]
s = a[b] - a[b+1]
i = b+2
while i < len(a) and a[i-1]-a[i] == s:
l.append(a[i])
i += 1
if len(l) > 2:
t += sum(l)
b = i-1
else:
b += 1
return t
答案10:
from itertools import groupby
from operator import sub
def sum_of_regular_numbers(arr):
grouped = [list(g[1]) for g in groupby(zip(arr, arr[1:]), lambda pair: sub(*pair))]
unpaired = [[x[0] for x in y] + [y[-1][1]] for y in grouped]
return sum(sum(seq) for seq in unpaired if len(seq) > 2)
欢迎各位同学加群讨论,一起学习,共同成长!