Remarque: des spoilers mineurs pour The Martian sont dans ce défi. À lire avec prudence
Le Martien est un roman de science-fiction sur l'astronaute et botaniste extraordinaire, Mark Watney , qui a été accidentellement échoué sur Mars. À un moment donné dans le livre, Mark essaie de communiquer avec la NASA, mais le seul moyen de communication dont ils disposent est une caméra. Mark envoie des messages en écrivant sur des fiches et, comme la NASA peut faire pivoter la caméra de 360 degrés, la NASA renvoie les réponses en pointant la caméra vers des cartes étiquetées "Oui" ou "Non".
Étant donné que les seules données que la NASA peut envoyer sont la direction à laquelle la caméra est confrontée, Mark propose un système permettant de pointer des cartes avec des caractères alphabétiques dessus pour taper des messages. Mais l'utilisation des lettres «az» serait peu pratique. Pour citer le livre (à partir de cette réponse , sur scifi.se):
Nous devrons parler plus rapidement que les questions oui / non toutes les demi-heures. La caméra peut pivoter à 360 degrés et j'ai de nombreuses pièces d'antenne. Il est temps de faire un alphabet. Mais je ne peux pas simplement utiliser les lettres de A à Z. Vingt-six lettres et ma carte de question correspondraient à vingt-sept cartes autour de l'atterrisseur. Chacun n'obtiendrait que 13 degrés d'arc. Même si JPL pointe parfaitement la caméra, il y a de fortes chances que je ne sache pas de quelle lettre il s'agit.
Je vais donc devoir utiliser ASCII. C'est ainsi que les ordinateurs gèrent les personnages. Chaque caractère a un code numérique compris entre 0 et 255. Les valeurs comprises entre 0 et 255 peuvent être exprimées en 2 chiffres hexadécimaux. En me donnant des paires de chiffres hexadécimaux, ils peuvent envoyer n'importe quel caractère qu'ils aiment, y compris les chiffres, la ponctuation, etc.
...
Je vais donc faire des cartes de 0 à 9 et de A à F. Cela fait 16 cartes à placer autour de la caméra, plus la carte de question. Dix-sept cartes signifie plus de 21 degrés chacune. Beaucoup plus facile à gérer.
Votre objectif aujourd'hui, en tant que l'un des meilleurs ingénieurs logiciels de la NASA, est d'écrire un programme pour coder les différents angles de la caméra. Les dix-sept cartes que Mark a à vous montrer sont (dans l'ordre):
?0123456789ABCDEF
et chacune de ces cartes est distante de 21 degrés, donc pour faire pivoter l'appareil photo de ?
à 0
, vous devez faire pivoter l'appareil photo de 21 degrés et 2
jusqu'à 1
-21 degrés. (Ce n'est pas exactement 21, mais nous arrondirons pour le garder plus simple) Cela s'enroule, donc pour aller de F
à 3
105 degrés (5 tours, 5 * 21 = 105). C'est plus efficace que d'aller à -252, car la caméra n'aura pas à aller aussi loin.
Voici ce que votre programme ou votre fonction doit faire.
Prenez une chaîne en entrée. Nous appellerons cette chaîne s . Pour rester simple, nous dirons que l'entrée ne sera jamais imprimable en ASCII. Pour notre exemple, disons que l'entrée était
STATUS
Convertissez chaque caractère en sa représentation hexadécimale. Cela se convertirait
STATUS
en53 54 41 54 55 53
.Imprimez ou retournez les tours de degrés consécutifs que l'appareil photo devra effectuer pour pointer sur chaque carte et revenir à la "Carte Question". Pour notre exemple, ce serait:
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-?)
Ou, au format tableau:
[126, -42, 42, -21, 0, -63, 84, -21, 21, 0, 0, -42, -84]
Notez que vous devez toujours effectuer la plus petite rotation possible. Donc, si l'entrée était NO
, ce qui est 4E 4F
, vous devriez sortir:
5 * 21 = 105
-7 * 21 = -147
7 * 21 = 147
-6 * 21 = -126
1 * 21 = 21
Plutôt que:
5 * 21 = 105
10 * 21 = 210
-10 * 21 = -210
11 * 21 = 231
-16 * 21 = -336
Voici quelques exemples plus travaillés:
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]
La NASA étant fière de son efficacité, votre objectif est d'écrire le code le plus court possible. Des échappatoires standard s'appliquent. Ramenez-le maintenant à la maison!
la source
Réponses:
JavaScript (ES6),
10399 octetsCas de test
Afficher l'extrait de code
la source
s.replace(/./g,
->[...s].map(
...s.replace(/./g,
donne par exemple"4","8","6","5","6","c"...
, tandis que....[...s.map(
donnerait"48","65","6c",...
C,
212202199187 octets3 octets enregistrés grâce à @KritixiLithos!
Essayez-le en ligne!
la source
8>i?i:17-i
place de17-i>i?...
Python,
187178 octetsCas de test
la source
Python 2 ,
135112 octetsEssayez-le en ligne!
la source
Gelée ,
2119 octetsEssayez-le en ligne!
Comment?
la source
Ohm ,
2019 octets (CP437), non concurrentEDIT : enregistré 1 octet en changeant un bloc de carte en cartes répétées à un composant.
Serait probablement un peu plus court si j'avais une vectorisation implicite.
Explication:
la source
PHP,
125116 octets:panne
Bien sûr,
21
est assez inexact et peut échouer pour les chaînes de plus de 14 caractères; mais alors ...360/17
serait quatre octets de plus.la source