Телефонна любов

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

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

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

Ахой, колеги!

Ахой, освен традиционен морски поздрав, е и официалният поздрав, който Александър Бел предлага за новото си изобретение - телефона. От патентът за това изобретение през 1876 е изминало много време и телефоните са преминали през много метаморфози. От проста конфигурация с микрофон и говорител, та чак до устройството в джоба ви, което е по-скоро компютър, отколкото телефон, но името все пак е останало.

За "по-опитните" (няма да кажем по-старите) не е чак толкова странно да използват клавиатура с цифри, за да въведат текстово съобщение.
А "още по-опитните" дори си спомнят въвеждане на телефонен номер с помощта на шайба. Днешната задача има за цел да ви припомни тези времена и междувременно да постави познанията ви по Python на изпитание.

Напишете следните функции:

1) nums_to_text(nums) - Приема списък с цифри и "превежда" този списък в четим текст, използвайки клавиатура на мобилен телефон. Функцията приема list от int и връща str.
2) text_to_nums(text) - Приема текст и "превежда" този текст в комбинация от цифри, които биха били нужни за въвеждане на този текст от телефонната клавиатура. Функцията приема str и връща list от int.
3) nums_to_angle(nums) - Приема списък от цифри и връща нормализиран (0°-359°) ъгъл, който се получава при сбора на всички ъгли, нужни за въвеждане на тези цифри върху телефон с шайба. Функцията приема list от int и връща int.
4) angles_to_nums(angles) - Приема списък от ъгли (може и ненормализирани/незакръглени) и връща цифри, които отговарят на тези ъгли при справка с телефонна шайба. Функцията приема list от int и връща list от int.
5) is_phone_tastic(word) - Приема дума (str) и връща True/False в зависимост дали думата е phone-tastic. Една дума е phone-tastic, ако нормализираният ъгъл, който се получава при транслирането на тази дума към поредица от цифри (виж функция 2) и привеждането на тези цифри към ъгъл (виж функция 3), е кратен на броя букви в думата.

Как работи текстова клавиатура на мобилен телефон?



Всяка цифра се асоциира с букви.
Цифрата 1 не се асоциира с нищо.
Цифрата 0 се асоциира са интервал (показан като '_' по-горе, но е интервал).
Бутоните в долните два ъгъла са празни и не правят нищо в контекста на задачата.
Въвеждане на конкретна буква става при натискане на бутона ѝ съответен брой пъти:

  • За да въведем "А", натискаме бутона "2" веднъж.
  • Ако искаме буквата Y, натискаме бутона "9" три пъти.
  • Ако случайно допуснем грешка и натиснем повече от желания брой пъти, можем просто да продължим да натискаме бутона, а когато стигнем до последната буква в бутона, селекцията ще започне от начало. Например, 5 натискания на бутона "5" ще значи буквата "К" (един път завъртаме през всички три букви и след това се предвиждаме с 2 букви в списъка отначало).
Използвайки истински телефон, процесът на въвеждане с определен бутон има timeout, така че ако искаме да въведем дума, в която има две последователни букви, асоциирани с един и същ бутон, просто трябва да изчакаме курсора да въведе текущата буква, за да започнем въвеждане на следващата. Това не можем да симулираме с timeout, така че въвеждаме специална цифра - "-1", която значи "изчакай", или с други думи, въведи текущата буква и ми позволи да използвам същия бутон отначало.

Пример: "PYTHON" -> 7, 9, 9, 9, 8, 4, 4, 6, 6, 6, -1, 6, 6

Как работи телефон с шайба?

/Опростено, за да не се налага да работим с неприятни стойности за ъглите/


Потребителят поставя пръст върху една от цифрите и завърта шайбата по часовниковата стрелка, докато не стигне до края и пръстът му не опре в котвата, която седи на позиция "5 часа". След което пуска шайбата, а тя се връща автоматично в стартова позиция. Това движение може да се транслира в ротационен ъгъл, който да се използва като инпут за самия телефон. За да въведем цифрата 1, нужно е да преместим шайбата с 30°. За цифрата 2 - 60°... За цифрата 0 - 300°.
Ето защо телефонът за спешни случаи е 112 - отнема малко време.

Уговорки:

  • Приемливо е първата функция да връща както малки, така и главни букви. Няма да следим case-ing.
  • Ако функцията ви очаква входен текст, той може да бъде съставен и от малки, и от главни букви - вземете го предвид.
  • Нормализиран ъгъл е такъв, който приема само стойности от 0° до 359°. В случай, че ъгълът е по-голям от 359, или пък е отрицателен, той може да се сведе до стойност 0°-359°, което вече наричаме нормализиран ъгъл. Например, 400° == 40°, -20° == 340°.
    Можете да си представите стрелка на часовник. Ако началната позиция е нагоре (сочи в 12 часа), завъртане на -30°, както и завъртане на 330°, ще доведе до един и същ резултат - стрелката ще сочи на 11 часа.
  • Понякога при работа с ротационен телефон (т.е. такъв с шайба), пръстът не стига до самия край, или го подминава, така че ъгълът, който получите като инпут, може да не е точно 30°, а примерно 28° или 33°. Приемете, че всеки ъгъл, който не е кратен на 30, се закръглява до най-близката стойност, която е кратна на 30.
  • Въвеждане на ъгъл от 0° (или друг, който се свежда до 0° след нормализиране и закръгляване) се игнорира - не произвежда цифра и този ъгъл все едно не съществува в списъка с инпут ъгли.
  • Въвеждане на ъгъл от 330° (или друг, който се свежда до 330° след нормализиране и закръгляване) се игнорира - не произвежда цифра и този ъгъл все едно не съществува в списъка с инпут ъгли.
  • Да, логично е ъгли, по-големи от 345°, да се закръгляват към 0°.
  • В случай на нужда от закръгляване, при която разликата нагоре и надолу е еднаква, закръгляваме надолу. Например 345° е на еднакво разстояние и от 330°, и от 360° (0°) - закръглява се на 330°.

Примери за input/output на функциите:

>>> nums_to_text([4, 4, 3, 3, 5, 5, 5, -1, 5, 5, 5, 6, 6, 6])
"HELLO"
>>> text_to_nums('asl pls')
[2, 7, 7, 7, 7, 5, 5, 5, 0, 7, 5, 5, 5, 7, 7, 7, 7]
>>> nums_to_angle([1, 5, 9])
90 # (30° + 150° + 270° = 450° == 90°)
>>> angles_to_nums([16, 14, 90, -120])
[1, 3, 8] # 16 се закръглява до 30, 14 се закръглява до 0 и се пропуска, 90 е точен ъгъл, -120 е идентично на 240 след нормализация
>>> is_phone_tastic('GOD')
True # GOD -> 4, 6, 6, 6, 3 -> 120, 180, 180, 180, 90; Сумата от ъглите е 750 (нормализираната стойност е 30°); 30 е кратно на 3

Примерен тест

>>>ТОЧНО ЕТО ТУК<<<