• + 0 comments

    Python: Semi-short looping solution…

    def workbook(_, k, arr):
      p = s = 0
      for i in arr:
        for j in range(0, i, k):
          p, s = ((p + 1, s + 1)
            if j < p + 1 <= min(i, j + k)
            else (p + 1, s)) 
      return s
    

    Here's a semi-short, non-looping functional solution…

    def workbook(_, k, arr):
        pg = lambda m: m[0]
        prob1 = lambda m: m[1][0]
        probN = lambda m: m[1][1]
        return sum(map(
            lambda pgProbs: int(prob1(pgProbs) < pg(pgProbs) <= probN(pgProbs)), 
            enumerate(sum(map(
                lambda chNumProb: list(map(
                    lambda pgProb1: (pgProb1, min(chNumProb, pgProb1 + k)), 
                    range(0, chNumProb, k))), 
                arr), []), start=1))) 
    

    It could be shorter, but I've seen people complain about the readability of functional code. So, I tried to make this descriptive. I used verbose names for lambda arguments. I also added lambdas for accessing the members of tuples returned from the inner map levels.

    Here's a terse version of the same code…

    def workbook(_, k, arr):
        return sum(map(lambda m: int(m[1][0] < m[0] <= m[1][1]),
                enumerate(sum(map(lambda i:
                    list(map(lambda j: (j, min(i, j + k)), 
                    range(0, i, k))), 
                arr), []), 1)))