Not: Marslı için küçük spoiler bu sorunla karşı karşıya. Dikkatle okuyun
Marslı , yanlışlıkla Mars'ta mahsur kalan astronot ve botanikçi olağanüstü Mark Markney hakkında bir Bilim Kurgu romanı . Kitabın bir noktasında, Mark NASA ile iletişim kurmaya çalışıyor, ancak sahip oldukları tek iletişim aracı bir kamera. Mark, indeks kartlarına yazarak mesaj gönderir ve NASA kamerayı 360 derece döndüğü için NASA, kamerayı "Evet" veya "Hayır" etiketli kartlara işaretleyerek geri gönderir.
NASA'nın gönderebileceği tek veri, kameranın karşı karşıya olduğu yön olduğundan, Mark mesaj yazmak için üzerlerinde alfabe karakterli kartlara işaret edebilecekleri bir sistem ile gelir. Ancak 'az' harflerini kullanmak pratik değildir. Kitabı alıntılamak için ( bu cevaptan scifi.se'ye kadar):
Her yarım saatte bir evet / hayır sorularından daha hızlı konuşmamız gerekecek. Kamera 360 derece dönebilir ve çok fazla anten parçam var. Alfabe yapma zamanı. Fakat sadece A'dan Z'ye kadar olan harfleri kullanamıyorum. Yirmi altı harf artı soru kartım toprak sahibinin etrafında yirmi yedi kart olacak. Her biri yalnızca 13 derece yay alır. JPL kamerayı mükemmel bir şekilde işaret etse bile, hangi harfi kastettiklerini bilemem iyi bir şans.
Bu yüzden ASCII kullanmak zorunda kalacağım. Bilgisayarların karakterleri bu şekilde yönetmesi. Her karakter 0 ile 255 arasında sayısal bir koda sahiptir. 0 ile 255 arasındaki değerler 2 onaltılık basamak olarak ifade edilebilir. Bana altıgen basamak çiftleri vererek, sayılar, noktalama işaretleri, vb. Gibi istedikleri karakteri gönderebilirler.
...
Bu yüzden 0'dan 9'a kadar, A'dan F'ye kadar kartlar yapacağım. Bu, kamera etrafına yerleştirilecek 16 kart artı soru kartı. 17 kart, her biri 21 derecenin üzerinde anlamına gelir. Başa çıkmak çok daha kolay.
NASA'nın en iyi yazılım mühendislerinden biri olarak bugün hedefiniz, kameranın çeşitli açılarını kodlayacak bir program yazmak. Mark'ın işaret ettiği on yedi kart (sırayla):
?0123456789ABCDEF
ve bu kartların her biri bu yüzden kamerayı döndürmek için, ayrı 21 derecedir ?
için 0
,, kamerayı 21 derece döndürmek gerektiğini ve 2
hiç 1
-21 derecedir. (O değil tam 21 ama daha basit tutmak yuvarlanacak edeceğiz) bu yüzden gitmek için, bu sargıları F
için 3
105 derece (5 turlu, 5 * 21 = 105) 'dir. Bu kamera -252'den daha verimli, çünkü kamera uzaklaşmak zorunda kalmayacak.
Programınızın veya fonksiyonunuzun yapması gerekenler.
Giriş olarak bir dize atın. Bu dizgeye s diyelim . Basitleştirmek için, girişin yalnızca yazdırılabilir ASCII olacağını söyleyeceğiz. Örneğimize göre, girdi girdiydi.
STATUS
Her karakteri onaltılık gösterime dönüştürün. Bu dönüştürmek istiyorum
STATUS
için53 54 41 54 55 53
.Her karta işaret etmek ve “Soru Kartına” geri dönmek için fotoğraf makinesinin yapması gereken ardışık derece dönüşleri yazdırın veya iade edin. Örneğimiz için bu şöyle olurdu:
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-?)
Veya, dizi biçiminde:
[126, -42, 42, -21, 0, -63, 84, -21, 21, 0, 0, -42, -84]
Her zaman olası dönüşlerden en küçüğünü almanız gerektiğini unutmayın. Eğer girdi buysa NO
, ki şu şekilde 4E 4F
çıktı almalısınız:
5 * 21 = 105
-7 * 21 = -147
7 * 21 = 147
-6 * 21 = -126
1 * 21 = 21
Ziyade:
5 * 21 = 105
10 * 21 = 210
-10 * 21 = -210
11 * 21 = 231
-16 * 21 = -336
İşte biraz daha çalışılmış örnekler:
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 verimlilikten gurur duyduğundan, hedefiniz mümkün olan en kısa kodu yazmaktır. Standart boşluklar uygulanır. Şimdi onu eve getir!