Навигация на Piet

Предадени решения

Краен срок:
25.10.2022 18:00
Точки:
10

Срокът за предаване на решения е отминал

Вдъхновени от езотеричният език за програмиране Piet, днешната задача ще е да си направим "навигационна" система, базирана на цветове.
Piet Mondrian е рисувал картини, които са изглеждали по следния начин:

Сега си представете, че се движим последователно по "пикселите/квадратите" (however big or small, няма значение) на картина на Piet Mondrian, която съдържа информация за стигане от точка А до точка Б. Нюансът (hue) и наситеността (saturation) на всеки пиксел носят информация за определена посока в която се движим. За нашите цели ще опростим "картината" до едномерна последователност от цветове.

Имаме следните правила:

  1. Нюансът определя посоката по следната таблица:
    • Зелено - надясно
    • Жълто - нагоре
    • Червено - наляво
    • Синьо - надолу
  2. Наситеността на пиксела определя магнитуда на движението:
    • Светло - стъпка -1 по посоката на движение
    • Тъмно - стъпка +1 по посоката на движение
  3. Има два специални цвята:
    • Черно - '000000' - означава "край" (не е задължително да присъства, в някои случаи ще го има, в други случаи изпълнението продължава до изчерпване на "пикселите")
    • Бяло - 'ffffff' - означава "нищо"... Тоест нищо не се случва с координатите.

Целта на занятието е написването на функцията calculate_final_vector, която приема:

  • Начална точка, под формата на вектор в равнина - (x1, y1)
  • Списък с hex кодове на цветове във формат:
    ['ffc0c0', '00ff00', etc.]
    Забележка: Цветовете могат да бъдат както 'ffc0c0', така и 'FFC0C0'. С други думи - погрижете се функцията да работи независимо от case-а на цветовете.

На базата на подадените hex кодове на цветове от функцията се очаква да изчисли движението от началната точка и да върне като резултат вектор (x2, y2).
Ето ви и пример:
>>> calculate_final_vector((1, 1), ['00C000', 'C0FFC0', 'C00000', 'FFFFFF', 'C0C000'])
(0, 2)

Обяснение:

  1. '00C000' - нюанс-зелено, наситеност-тъмно. Следователно посоката ни на движение е надясно, а стъпката - +1. Получаваме вектор (не забравяйте, началният ни такъв е (1, 1)) (2, 1).
  2. 'C0FFC0' - отново зелено, този път - светло. Посоката на движение отново е надясно, стъпката, обаче, е -1. Резултат - (1, 1).
  3. 'C00000' - тъмно червено, посоката е наляво, стъпката е 1. Резултат - (0, 1).
  4. 'FFFFFF' - бяло, не правим нищо. Векторът остава (0, 1).
  5. 'C0C000' - тъмно жълто, най-накрая движение по y координатата. Посоката е нагоре, стъпката е 1. Резултат - (0, 2).

Дефиниция на цветовете, които функцията трябва да поддържа, се намират в следната таблица: