2

So I wrote a function slanted(grid) which takes in a grid and returns the combination of letters horizontally.

For instance, if grid is

['q','q','d'],
['s','d','e'],
['e','g','h']

then slanted(grid) should return

['d','qe','qdh','sg','e']

I tried to do this by writing up this code for slanted(grid)

def slanted(grid):
    results = []
    for j in range(len(grid)-1):
        tmp = ""
        for i in range(len(grid)):
            tmp += [j+i][i]
            results.append(tmp)
    return results

print(slanted([['q','q','d'],['s','d','e'],['e','g','h']]))

but I'm getting an error message saying:

TypeError: can only concatenate str (not "int") to str

what changes to my code should I make to get the right output as indicated above?

Dave Shah
  • 91
  • 6
  • `[j + i]` is a list containing one element, namely an integer with the value `j + i`. This means `[j + i][i]` is equal to integer `j` if `i` is zero, integer `j - 1` if `i` is `-1`, or causes an error otherwise. I'm sure this is not what you want, but it means your code is trying to append an integer to string `tmp`. – Richard Ambler Feb 12 '22 at 02:25

1 Answers1

1

[j + i][i] creates a singleton list with one integer, and then attempts to access that integer. You should try to access an element of grid, e.g. by doing grid[j + i][i], but this causes an IndexError.

Here is my approach to your task. You can think of this as reading a series of diagonals, each starting from a different start row / column index. For each start index, we extract that given diagonal:

def extract_diagonal(grid, start_row, start_col):
    row = start_row
    col = start_col
    letters = []

    while row < len(grid) and col < len(grid[0]):
        letters.append(grid[row][col])
        row += 1
        col += 1

    return ''.join(letters)

def slanted(grid):
    results = []
    for col in range(len(grid) - 1, -1, -1):
        results.append(extract_diagonal(grid, 0, col))

    for row in range(1, len(grid)):
        results.append(diagonal(grid, row, 0))

    return results

# Prints ['d','qe','qdh','sg','e'].
print(slanted([['q','q','d'],['s','d','e'],['e','g','h']]))

Note that we're using ''.join() rather than repeated string concatenation here, as the former has a better time complexity. For more discussion on this, see this answer.

BrokenBenchmark
  • 18,126
  • 7
  • 21
  • 33