注:The Martianのマイナーネタバレはこの課題にあります。注意して先読みしてください
火星人は、火星に偶然立ち往生した宇宙飛行士であり植物学者でもある並外れたマーク・ワトニーについてのSF小説です。本のある時点で、マークはNASAと通信しようとしますが、彼らが持っている通信の唯一の手段はカメラです。マークはインデックスカードに書き込むことでメッセージを送信します。NASAはカメラを360度回転させることができるため、NASAはカメラを「はい」または「いいえ」とラベル付けして返信します。
NASAが送信できる唯一のデータはカメラが向いている方向であるため、Markはアルファベット文字のあるカードをポイントしてメッセージを入力できるシステムを考え出します。しかし、文字「az」を使用することは実用的ではありません。この本を引用するには(この回答から、scifi.seに):
30分ごとにyes / noの質問よりも速く話す必要があります。カメラは360度回転でき、アンテナパーツがたくさんあります。アルファベットを作る時間。しかし、文字AからZだけを使用することはできません。26文字と質問カードは、着陸機の周りの27枚のカードになります。それぞれがたった13度の円弧を取得します。JPLがカメラを完璧に向けたとしても、どの文字が意味するのかわからない可能性があります。
したがって、ASCIIを使用する必要があります。それがコンピューターがキャラクターを管理する方法です。各文字には0〜255の数値コードがあります。0〜255の値は2桁の16進数で表現できます。16進数のペアを渡すことで、数字や句読点など、好きな文字を送信できます。
...
そこで、0から9、およびAからFのカードを作成します。これにより、カメラの周りに16枚のカードと質問カードが配置されます。17枚のカードはそれぞれ21度以上を意味します。対処がはるかに簡単です。
NASAのトップソフトウェアエンジニアの1人としての今日の目標は、カメラのさまざまな角度をエンコードするプログラムを作成することです。マークが指し示す17枚のカードは次のとおりです(順番に)。
?0123456789ABCDEF
これらのカードはそれぞれ21度離れているため、カメラをから?
に0
回転するには、カメラを21度回転し、2
to 1
を-21度回転する必要があります。(それはないです正確に 21、私たちはそれをシンプルに保つために丸めます)soから行くために、このラップをF
することは3
105度(5ターン、5 * 21 = 105)です。これは、カメラが遠くまで移動する必要がないため、-252よりも効率的です。
プログラムまたは関数が行う必要があることは次のとおりです。
入力として文字列を受け取ります。この文字列をsと呼びます。単純にするために、入力は印刷可能なASCIIのみになります。この例では、入力が
STATUS
各文字を16進表現に変換します。これはに変換さ
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は効率性に誇りを持っているため、あなたの目標は可能な限り短いコードを書くことです。標準の抜け穴が適用されます。今彼を家に連れて行ってください!