Задача о раскраске поверхности и подсчета площади, занимаемой каждым цветом

Пытаюсь решить задачу, но не получается.

Задача:

Кондитер украшает огромный торт, покрывая прямоугольную поверхность разноцветной глазурью. Для приготовления глазури он смешивает сахарную пудру с лимонным и черничным соком в разных пропорциях, чтобы получить три оттенка синего цвета: светлый, средний и насыщенный. Эти цвета обозначаются числами: 0 для светлого, 1 для среднего и 2 для насыщенного синего.

Чтобы получить красивый узор, он разделяет поверхность торта на вертикальные полосы шириной A1, A2, ..., An сантиметров и горизонтальные полосы высоты B1, B2, ..., Bn сантиметров. В результате полосы делят поверхность торта на n × n прямоугольников. Пересечение вертикальной полосы i и горизонтальной полосы j имеет цветовой номер (i + j) mod 3 для всех 1 ≤ i, j ≤ n.

Меня сбивает с толку формулировка "он разделяет поверхность торта на вертикальные полосы шириной A1, A2, ..., An сантиметров и горизонтальные полосы высоты B1, B2, ..., Bn сантиметров", либо ширину самих полос отобразить, как на первом рисунке, либо ширину и высоту прямоугольников изобразить, как на втором рисунке. Также программа неправильно работает. Что я мог не так сделать?

Рисунок 1

Торт с узорами 1

Рисунок 2

Торт с узорами 2

Мой код:

def get_pattern(n, a, b):
  colors = [0, 1, 2]
  for j in range(len(b)):
    for i in range(1, len(a)):
      if i == 1:
        if (i + j) % 3 == 0:
          print(colors[((i + j) % 3) - 1], end = ' ')
        elif (i + j) % 3 == 1:
          print(colors[((i + j) % 3) - 1], end = ' ')
        elif (i + j) % 3 == 2:
          print(colors[((i + j) % 3) - 1], end = ' ')
      print((i + j) % 3, end = ' ')
    print()
get_pattern(int(input('Введите n: ')), list(map(int, input('A: ').split())), list(map(int, input('B: ').split())))

# Неправильно выводит цвета
# Введите n: 5
# A: 1 1 1 1 1
# B: 1 1 1 1 1
# 0 1 2 0 1 
# 1 2 0 1 2 
# 1 0 1 2 0 
# 0 1 2 0 1 
# 1 2 0 1 2 

# Должно быть
# Введите n: 5
# A: 1 1 1 1 1
# B: 1 1 1 1 1
# 0 1 2 0 1 
# 2 0 1 2 0
# 1 2 0 1 2
# 0 1 2 0 1
# 2 0 1 2 0

Дополнение от автора, данное в комментариях под первым ответом. С ним становится ясно, для чего даётся ширина полос:

мне такое задание в институте дали, текст задания, в интернете нашёл такую же задачу, и оказалось, что в тексте задания, которую нам дали в институте, отсутствует ещё одно предложение: Помогите кондитеру определить площадь каждого из трех цветов в квадратных сантиметрах. Программа получает на вход целое положительное число n, и две строки, в которых перечисляется ширина и высота полос.


Ответы (3 шт):

Автор решения: Solt

По условию у нас диапазоны от 1, следовательно первый элемент будет (1+1)%3 = 2. А ваша логика от 0 пляшет. Кроме того, раз по условию длины одинаковые, то нам никакие a и b не нужны, и уж тем более их неиспользуемые значения.

def get_pattern(n):
  colors = [0, 1, 2]
  print()
  for j in range(1,n+1):
    for i in range(1,n+1):
        print(colors[((i + j) % 3)], end=' ')
    print()
get_pattern(int(input('Введите n: ')))

https://godbolt.org/z/xhnzscrzT

→ Ссылка
Автор решения: Solt

Решение, включающее подсчет площадей и отрисовку раскладки пропорционально заданным размерам.

И ещё простите за жертвование наглядностью, но так как индексы удобнее использовать начиная с нуля, условие о диапазоне 1 - N будем учитывать только в определении цвета, а циклы оставим 0 - N-1. Привычка в программировании по возможности считать от 0 на мой взгляд - хорошая привычка.

Сразу вангую ещё одну придирку. Я убрал из ввода n, так как теперь она не особо нужна, если задаются размеры. Кроме того отсутствует проверка на равенство размеров, что противоречит условию, но даёт большую гибкость. При необходимости такую проверку легко добавить.

def get_pattern(a, b):
    colors = [0, 1, 2]
    square = [0,0,0]
    print()
    a_total=sum(a)
    b_total=sum(b)

    #Размеры раскладки
    W=80
    H=30
    matrix=''

    for j in range(len(b)):
        line=''
        for i in range(len(a)):
            c=(i+j+2) % 3 # тут учитываем условия о нумерации с 1 и прибавляем 2
            print(colors[c], end = ' ')
            square[c]+=a[i]*b[j]
            line+=str(colors[c])*int(W/a_total*a[i])
        line=(line+'\n')*int(H/b_total*b[j])
        matrix+=line
        print()
    print('Площади:', square)
    print('Раскладка:\n', matrix, sep='')

get_pattern(list(map(int, input('A: ').split())), list(map(int, input('B: ').split())))

https://godbolt.org/z/WYT4drs37

→ Ссылка
Автор решения: MBo

Для полноты картины приведу решение для площадей, закрашенных каждым цветом, линейное от n - т.е. оно будет работать за малое время и при n > 100000

def areas(n, A, B):
    sumA = [0, 0, 0]
    sumB = [0, 0, 0]
    for i in range(n):
        sumA[i % 3] += A[i]
        sumB[i % 3] += B[i]
    print(sumA[0] * sumB[1] + sumA[1] * sumB[0] + sumA[2] * sumB[2])
    print(sumA[0] * sumB[2] + sumA[1] * sumB[1] + sumA[2] * sumB[0])
    print(sumA[0] * sumB[0] + sumA[1] * sumB[2] + sumA[2] * sumB[1])

areas(5, [2,5,4,3,7], [3,1,2,5,6])
areas(7, [7,5,2,4,4,4,2],[5,3,6,5,3,3,3])

139
126
92

249
249
286
→ Ссылка