Uwaga: w tym wyzwaniu są mniejsze spoilery dla Marsjanina . Czytaj dalej ostrożnie
Marsjanin to powieść science fiction na temat astronauty i botanika, Marka Watneya , który przypadkowo został wyrzucony na Marsa. W pewnym momencie książki Mark próbuje komunikować się z NASA, ale jedynym dostępnym środkiem komunikacji jest kamera. Mark wysyła wiadomości, pisząc na kartach indeksowych, a ponieważ NASA może obracać kamerę o 360 stopni, NASA wysyła odpowiedzi, kierując aparat na karty oznaczone „Tak” lub „Nie”.
Ponieważ jedyne dane, które NASA może wysyłać, to kierunek, w którym skierowana jest kamera, Mark wymyślił system, w którym mogą wskazywać karty z literami alfabetu, aby pisać wiadomości. Ale użycie liter „az” byłoby niepraktyczne. Aby zacytować książkę (od tej odpowiedzi na scifi.se):
Będziemy musieli rozmawiać szybciej niż tak / nie pytania co pół godziny. Kamera może obracać się o 360 stopni, a ja mam mnóstwo części antenowych. Czas na alfabet. Ale nie mogę po prostu użyć liter od A do Z. Dwadzieścia sześć liter plus moja karta pytań to dwadzieścia siedem kart wokół lądownika. Każdy uzyskałby tylko 13 stopni łuku. Nawet jeśli JPL doskonale wskazuje aparat, istnieje duża szansa, że nie będę wiedział, o którą literę chodziło.
Więc będę musiał użyć ASCII. W ten sposób komputery zarządzają postaciami. Każdy znak ma kod numeryczny od 0 do 255. Wartości od 0 do 255 mogą być wyrażone jako 2 cyfry szesnastkowe. Podając mi pary cyfr szesnastkowych, mogą wysyłać dowolne znaki, które im się podobają, w tym cyfry, znaki interpunkcyjne itp.
...
Zrobię więc karty od 0 do 9 oraz od A do F. To daje 16 kart do umieszczenia wokół kamery, plus kartę pytań. Siedemnaście kart oznacza ponad 21 stopni każda. O wiele łatwiej sobie poradzić.
Twoim celem dzisiaj, jako jednego z najlepszych inżynierów oprogramowania w NASA, jest napisanie programu do kodowania różnych ujęć kamery. Siedemnaście kart, które Mark ma dla ciebie wskazać, to (w kolejności):
?0123456789ABCDEF
a każda z tych kart jest oddalona o 21 stopni, więc aby obrócić kamerę od ?
do 0
, należy obrócić kamerę o 21 stopni i 2
do 1
-21 stopni. (To nie jest dokładnie 21, ale zaokrąglimy, aby było prostsze) To się zawija, więc przejście od F
do 3
wynosi 105 stopni (5 obrotów, 5 * 21 = 105). Jest to bardziej wydajne niż przejście do -252, ponieważ kamera nie będzie musiała się poruszać tak daleko.
Oto, co musi zrobić Twój program lub funkcja.
Weź ciąg jako dane wejściowe. Nazwiemy ten ciąg s . Mówiąc prościej, powiemy, że wejście będzie zawsze możliwe do wydrukowania w formacie ASCII. W naszym przykładzie powiedzmy, że dane wejściowe były
STATUS
Konwertuj każdy znak na jego reprezentację szesnastkową. Przekształci się
STATUS
to w53 54 41 54 55 53
.Wydrukuj lub zwróć kolejne obroty, które aparat będzie musiał wykonać, aby wskazać każdą kartę i powrócić do „Karty pytań”. W naszym przykładzie byłoby to:
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-?)
Lub w formacie tablicowym:
[126, -42, 42, -21, 0, -63, 84, -21, 21, 0, 0, -42, -84]
Pamiętaj, że zawsze musisz wykonywać najmniejsze możliwe obroty. Więc jeśli wejście było NO
, to znaczy 4E 4F
, powinieneś wypisać:
5 * 21 = 105
-7 * 21 = -147
7 * 21 = 147
-6 * 21 = -126
1 * 21 = 21
Zamiast:
5 * 21 = 105
10 * 21 = 210
-10 * 21 = -210
11 * 21 = 231
-16 * 21 = -336
Oto kilka sprawdzonych przykładów:
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]
Ponieważ NASA szczyci się wydajnością, Twoim celem jest napisanie możliwie najkrótszego kodu. Obowiązują standardowe luki. Teraz przyprowadź go do domu!
źródło
Odpowiedzi:
JavaScript (ES6),
10399 bajtówPrzypadki testowe
Pokaż fragment kodu
źródło
s.replace(/./g,
->[...s].map(
...s.replace(/./g,
daje np"4","8","6","5","6","c"...
. while....[...s.map(
dałby"48","65","6c",...
C,
212202199187 bajtów3 bajty zapisane dzięki @KritixiLithos!
Wypróbuj online!
źródło
8>i?i:17-i
zamiast17-i>i?...
Python,
187178 bajtówPrzypadki testowe
źródło
Python 2 ,
135112 bajtówWypróbuj online!
źródło
Galaretka ,
2119 bajtówWypróbuj online!
W jaki sposób?
źródło
Ohm ,
2019 bajtów (CP437), niekonkurująceEDYCJA : Zapisano 1 bajt, zmieniając blok mapy na powtarzające się mapy jednoskładnikowe.
Byłbym prawdopodobnie nieco krótszy, gdybym miał w domyśle wektoryzację.
Wyjaśnienie:
źródło
PHP,
125116 bajtów:awaria
Oczywiście
21
jest dość niedokładny i może zawieść w przypadku ciągów dłuższych niż 14 znaków; ale wtedy ...360/17
byłyby cztery bajty dłużej.źródło