Примітка. Невисокі спойлери для марсіанів стоять перед цим викликом. Прочитайте вперед з обережністю
Марсіанець - це науково-фантастичний роман про космонавта та ботаністського екстраординарника Марка Уотні , який випадково опинився на Марсі. У один момент книги Марк намагається спілкуватися з НАСА, але єдиним засобом спілкування у них є камера. Марк надсилає повідомлення, записуючи на індексні картки, і, оскільки NASA може обертати камеру на 360 градусів, NASA надсилає відповіді назад, вказуючи камеру на картки з написом "Так" або "Ні".
Оскільки єдині дані, які NASA може надсилати, - це напрямок, з яким стикається камера, Марк створює систему, де вони можуть вказувати на картки з символами алфавіту для введення повідомлень. Але використовувати букви «аз» було б недоцільно. Цитуючи книгу (з цієї відповіді , на scifi.se):
Нам потрібно буде говорити швидше, ніж так / ні питань кожні півгодини. Камера може обертатися на 360 градусів, і у мене є багато антенних частин. Час скласти алфавіт. Але я не можу просто використовувати літери від A до Z. Двадцять шість листів плюс моя карта запитань буде двадцять сім карток навколо приземлення. Кожен би отримав лише 13 градусних дуг. Навіть якщо JPL ідеально вказує на камеру, є хороший шанс, що я не буду знати, яку букву вони мали на увазі.
Тому мені доведеться використовувати ASCII. Ось як комп’ютери управляють персонажами. Кожен символ має числовий код від 0 до 255. Значення між 0 і 255 можна виразити двома шістнадцятковими цифрами. Надаючи мені пари шістнадцяткових цифр, вони можуть надсилати будь-який символ, який їм подобається, включаючи цифри, пунктуацію тощо.
...
Тож я зроблю картки від 0 до 9, і від A до F. Це робить 16 карт для розміщення навколо камери, плюс карта запитань. Сімнадцять карток означає понад 21 градус. Набагато простіше впоратися.
Ваша мета сьогодні, як одного з найкращих інженерів програмного забезпечення NASA, - написати програму для кодування різних кутів камери. Сімнадцять карток, які Марк має на вас вказати, є (по порядку):
?0123456789ABCDEF
і кожна з цих карт становить 21 градусів друг від друга, так , щоб обертати камеру від ?
до 0
, ви повинні поверніть камеру 21 градусів, а 2
в 1
це -21 градусів. (Це не точно 21 рік, але ми обернемось, щоб зробити його простіше) Це обгортання, так що для переходу F
до 3
- це 105 градусів (5 витків, 5 * 21 = 105). Це більш ефективно, ніж їхати -252, оскільки камері не доведеться рухатись так далеко.
Ось що ваша програма чи функція повинна робити.
Візьміть рядок як вхідний. Ми будемо називати цей рядок s . Щоб зробити це просто, ми скажемо, що вхід буде надрукованим лише ASCII. Для нашого прикладу скажімо, що вхід був
STATUS
Перетворіть кожен символ у його шістнадцяткове зображення. Це перетвориться
STATUS
на53 54 41 54 55 53
.Роздрукувати або повернути послідовні обороти, які потрібно зробити камерою, щоб вказати на кожну карту і повернутися до "Карти запитань". Для нашого прикладу це:
6 * 21 = 126 (?-5) -2 * 21 = -42 (5-3) 2 * 21 = 42 (3-5) -1 * 21 = -21 (5-4) 0 * 21 = 0 (4-4) -3 * 21 = -63 (4-1) 4 * 21 = 84 (1-5) -1 * 21 = -21 (5-4) 1 * 21 = 21 (4-4) 0 * 21 = 0 (5-5) 0 * 21 = 0 (5-5) -2 * 21 = -42 (5-3) -4 * 21 = -84 (3-?)
Або у форматі масиву:
[126, -42, 42, -21, 0, -63, 84, -21, 21, 0, 0, -42, -84]
Зауважте, що ви завжди повинні приймати найменші з можливих обертань. Отже, якщо вхід був NO
, який є 4E 4F
, слід вивести:
5 * 21 = 105
-7 * 21 = -147
7 * 21 = 147
-6 * 21 = -126
1 * 21 = 21
Замість:
5 * 21 = 105
10 * 21 = 210
-10 * 21 = -210
11 * 21 = 231
-16 * 21 = -336
Ось ще кілька опрацьованих прикладів:
Input: CROPS?
ASCII: 43 52 4F 50 53 3F
Worked Example:
5 * 21 = 105
-1 * 21 = -21
2 * 21 = 42
-3 * 21 = -63
2 * 21 = 42
-6 * 21 = -126
7 * 21 = 147
-5 * 21 = -105
5 * 21 = 105
-2 * 21 = -42
0 * 21 = 0
-5 * 21 = -105
1 * 21 = 21
Result: [105 -21 42 -63 42 -126 147 -105 105 -42 0 -105 21]
Input: DDD
ASCII: 44 44 44
Worked Example:
5 * 21 = 105
0 * 21 = 0
0 * 21 = 0
0 * 21 = 0
0 * 21 = 0
0 * 21 = 0
-5 * 21 = -105
Result: [105, 0, 0, 0, 0, 0, -105]
Input: Hello world!
ASCII: 48 65 6c 6c 6f 20 77 6f 72 6c 64 21
Worked example:
5 * 21 = 105
4 * 21 = 84
-2 * 21 = -42
-1 * 21 = -21
1 * 21 = 21
6 * 21 = 126
-6 * 21 = -126
6 * 21 = 126
-6 * 21 = -126
-8 * 21 = -168
4 * 21 = 84
-2 * 21 = -42
7 * 21 = 147
0 * 21 = 0
-1 * 21 = -21
-8 * 21 = -168
-8 * 21 = -168
-5 * 21 = -105
4 * 21 = 84
6 * 21 = 126
-6 * 21 = -126
-2 * 21 = -42
-2 * 21 = -42
-1 * 21 = -21
-2 * 21 = -42
Result: [105 84 -42 -21 21 126 -126 126 -126 -168 84 -42 147 0 -21 -168 -168 -105 84 126 -126 -42 -42 -21 -42]
Оскільки NASA пишається своєю ефективністю, ваша мета - написати найкоротший можливий код. Застосовуються стандартні лазівки. Тепер приведи його додому!