Примечание: второстепенные спойлеры для марсиан в этом вызове. Читайте вперед с осторожностью
«Марсианин» - это научный фантастический роман об экстраординарном астронавте и ботанике Марке Уотни , который случайно оказался на Марсе. В какой-то момент в книге Марк пытается установить связь с НАСА, но единственным средством связи, которое у них есть, является камера. Марк отправляет сообщения, записывая их на учетные карточки, и, поскольку НАСА может поворачивать камеру на 360 градусов, НАСА отправляет ответы обратно, направляя камеру на карточки, помеченные «Да» или «Нет».
Поскольку единственные данные, которые НАСА может отправить, - это направление, в котором находится камера, Марк предлагает систему, в которой они могут указывать на карточки с алфавитными символами для печати сообщений. Но использование букв «az» было бы непрактичным. Процитируем книгу (из этого ответа на scifi.se):
Нам нужно говорить быстрее, чем вопросы да / нет каждые полчаса. Камера может вращаться на 360 градусов, и у меня есть много частей антенны. Время сделать алфавит. Но я не могу просто использовать буквы от A до Z. Двадцать шесть букв плюс моя карточка с вопросом - это двадцать семь карточек вокруг посадочного модуля. Каждый получил бы только 13 градусов дуги. Даже если JPL направит камеру идеально, есть большая вероятность, что я не буду знать, какую букву они имели в виду.
Поэтому мне придется использовать ASCII. Вот так компьютеры управляют персонажами. Каждый символ имеет числовой код от 0 до 255. Значения от 0 до 255 могут быть выражены в виде 2 шестнадцатеричных цифр. Предоставляя мне пары шестнадцатеричных цифр, они могут отправлять любые символы, которые им нравятся, включая цифры, знаки препинания и т. Д.
...
Поэтому я буду делать карточки от 0 до 9 и от А до F. Это позволит разместить 16 карточек вокруг камеры плюс карточку с вопросом. Семнадцать карт означают более 21 градуса каждая. Намного легче иметь дело с.
Ваша цель сегодня, как одного из ведущих разработчиков программного обеспечения в НАСА, - написать программу для кодирования различных ракурсов камеры. Семнадцать карт, на которые Марк должен вам указать: (по порядку):
?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]
Поскольку НАСА гордится эффективностью, ваша цель - написать максимально короткий код. Применяются стандартные лазейки. А теперь отвези его домой!