Comme la plupart d'entre vous le savent probablement, les mémoires matérielles (adressables en octets) peuvent être divisées en deux catégories - petit-boutien et gros-boutiste . Dans les mémoires little-endian, les octets sont numérotés en commençant par 0 à la petite extrémité (la moins significative) et dans les mémoires big-endian dans l'autre sens.
Fait amusant : ces termes sont basés sur le livre de Jonathan Swift , Gulliver's Travels, dans lequel le roi lilliputien a ordonné à ses citoyens de casser leurs œufs sur le petit bout (donc les petits-bouts) et les rebelles cassaient le leur sur le grand bout.
Comment fonctionne l'échange
Supposons que nous ayons un entier non signé (32 bits) 12648430
en mémoire, dans une machine big-endian qui pourrait ressembler à ceci:
addr: 0 1 2 3
memory: 00 C0 FF EE
En inversant l'ordre des octets, nous obtenons l'entier hexadécimal 0xEEFFC000
qui est 4009738240
en décimal.
Ta tâche
Écrivez un programme / fonction qui reçoit un entier 32 bits non signé en décimal et sort l'entier résultant lors de l'échange de l'endianité comme décrit ci-dessus.
Règles
- L'entrée sera toujours dans la plage
0
de4294967295
- La sortie peut être imprimée sur STDOUT (les sauts de ligne / espaces sont très bien) ou retournés
- L'entrée et la sortie sont en décimal
- Le comportement sur une entrée non valide n'est pas défini
Cas de test
0 -> 0
1 -> 16777216
42 -> 704643072
128 -> 2147483648
12648430 -> 4009738240
16885952 -> 3232235777
704643072 -> 42
3735928559 -> 4022250974
4009738240 -> 12648430
4026531839 -> 4294967279
4294967295 -> 4294967295
42
est donné en décimal mais techniquement c'est en binaire en C par exemple. Vous pouvez bien sûr taper0x2a
, ce que je voulais éviter, c'est de prendre l'entrée comme une chaîne similaire"2a"
ou similaire.Réponses:
langage machine x86_32, 3 octets
C'est un peu une triche. La convention d'appel Pascal registre (voir Wikipedia ) est un peu comme __fastcall, sauf qu'elle passe le premier paramètre dans eax, et eax contient également la valeur de retour. Il s'agit également d'un nettoyage de l'appel, mais comme nous n'utilisons la pile pour rien d'autre que le pointeur de retour, nous n'avons rien à faire. Cela nous permet d'éviter un mov ou un xchg et d'utiliser directement bswap.
la source
bswap
nécessite un 80486 ou supérieur :)x86_64 langage machine Linux,
54 octetsMerci à @peter ferrie pour -1.
Essayez-le en ligne!
la source
C (gcc),
20,2917 octetsLa suggestion de @ hvd.
Essayez-le en ligne!
Ancienne réponse;
inclure doit être importé.
la source
Japt ,
1014 octetsEssayez-le
Explication
Convertir un entier d'entrée en une chaîne de base-16 (
sG
), utiliser0
pour remplir le début à la longueur 8 (ùT8
), diviser en un tableau de 2 chaînes de caractères (ò
), inverser (w
), rejoindre à une chaîne (¬
) et reconvertir en base- 10 (nG
).la source
y
celle-ci, lorsqu'une fonction est affectée à une fonction, appliquer sa transformation normale, exécuter la fonction, puis inverser la transformation. Dans ce cas, je pense que cela permettrait de le raccourcir àsG_ò w ¬
8 octets. Ou siò
c'était le cas aussi, ça pourrait même êtresG_ò2_w
pour 7 ...&.
adverbe de J le fait et il est parfois très utile pour jouer au golf. Le codage dans toutes les inversions pourrait cependant être fastidieux.sG_òw...
, je ne pouvais pas, pour la vie de moi, comprendre pourquoi cela ne fonctionnerait pas! J'ai finalement réalisé mes erreurs!Gelée , 10 octets
Essayez-le en ligne!
la source
d⁹²¤d⁹FUḅ⁹
Python 2 , 44 octets
Essayez-le en ligne!
la source
i*8
plutôt quei
, à partir dei=24
.x%256
ne sont pas nécessaires.APL + WIN 14 octets
Explication
la source
256⊥⌽⎕⊤⍨4⍴256
pour -1 octet?C # ,
7068 octetsCe n'est probablement pas optimal.
68:
70:
Essayez-le en ligne!
la source
return
expression, puis utiliser la syntaxe des membres avec corps d'expression:uint e(uint n)=>((n=n>>16|n<<16)&0xFF00FF00)>>8|(n&0xFF00FF)<<8;
pour 64 octets.0xFF00FF
deux fois en>>
ing avant&
ing, puis vous pouvez raccourcir0xFF00FF
à~0u/257
:uint e(uint n)=>((n=n>>16|n<<16)>>8&~0u/257)|(n&~0u/257)<<8;
pour 60. Lien TIOWolfram Language (Mathematica) , 24 octets
Essayez-le en ligne!
Inverse l'entrée interprétée comme un entier en base 256 avec 4 chiffres.
la source
05AB1E ,
1210 octetsEssayez-le en ligne! Explication:
la source
JavaScript (ES6),
4543 octetsla source
t=0
enregistre 2 octets:f=(n,p=t=0)=>t++<4?f(n>>>8,p*256+n%256):p
05AB1E , 9 octets
Essayez-le en ligne!
-1 merci à Neil .
Port de ma réponse Jelly.
la source
MATL ,
1210 octetsEssayez-le en ligne! Ou vérifiez tous les cas de test .
Explication
la source
JavaScript (ES6),
5145 octets6 octets enregistrés avec l'aide de @ Neil
Cas de test
Afficher l'extrait de code
la source
f=(n,p=0,t=4)=>t?f(n/256|0,p*256+n%256,t-1):p
.n=>(n>>>24|n>>8&65280|n<<8&16711680|n<<24)>>>0
J, 16 octets
Essayez-le en ligne!
Travailler à raccourcir l'expression de droite. Je pense que je peux raser quelques octets en faisant cela avec une version beta J. Je jure que j'ai vu ici que vous pouvez terminer un train avec un nom dans une nouvelle version bêta ...
Explication
Convertissez en 4 chiffres base 256, inversez les chiffres, puis reconvertissez en décimal. Fondamentalement, exécutez l'algorithme fourni dans l'OP. C'est peut-être la seule fois où il est utile que la conversion de base mixte de J vous oblige à spécifier le nombre de chiffres, bien que ce serait 2 octets de moins si je pouvais terminer le train dans un nom (à la
(#:~4#256)
place).la source
Excel VBA,
10392 octetsFonction de fenêtre immédiate VBE anonyme qui prend les entrées de la plage
[A1]
convertit en hexadécimal, inverse les octets et sort dans la fenêtre immédiate VBEla source
Assemblage PPC (32 bits), 8 octets
Comment cela fonctionne:
Malheureusement, il n'y a pas d'émulateurs d'assemblage PPC en ligne que je puisse trouver pour démontrer. Pardon!
la source
Befunge,
6261 ou 49 octetsEssayez-le en ligne!
Il s'agit de Befunge standard sur l'interpréteur de référence, et nous devons donc tenir compte du fait que les cellules de mémoire sont signées sur 8 bits et corriger tout débordement signé possible.
Sur les implémentations avec des cellules de mémoire non signées (par exemple PyFunge), ou lorsque la plage est supérieure à 8 bits (par exemple FBBI), nous pouvons nous en passer sans ces vérifications, en économisant 12 octets.
Essayez FBBI en ligne!
Essayez PyFunge en ligne!
Bien que notez que PyFunge a une entrée entière de traitement des bogues, donc lors des tests sur TIO, vous devez suivre le nombre dans le champ de saisie avec un espace ou un saut de ligne.
la source
Octave , 10 octets
Essayez-le en ligne!
C'est peut-être la première fois qu'Octave obtient exactement le même score que son dérivé du golf, MATL. Bien sûr, dans ce cas, c'est Octave qui a le intégré, plutôt que MATL, ce qui le rend beaucoup plus facile.
Définit un handle vers le intégré
swapbytes
, qui prend n'importe quel type de données, échange l'endianité et génère le résultat. Dans ce cas, l'entrée est un entier non signé 32 bits.la source
C #,
4436 octetsEssayez-le en ligne!
Cela était à l'origine basé sur la réponse C # de Polynomial , qui m'a suggéré de publier une nouvelle réponse avec mes améliorations, mais l'approche adoptée dans la réponse JavaScript d'Arnauld s'est avérée encore plus courte en C #.
la source
R , 86 octets
Je pensais qu'il y avait déjà une réponse (ou deux) dans R pour cette question, mais je devais me tromper ou ils avaient les mêmes problèmes que moi avec R ne faisant pas de signature. Ce problème a supprimé tous les éléments intégrés qui auraient pu aider. J'ai essayé la conversion de base 256, mais cela a fini par être trop long, mais je pense qu'il y a encore de la place pour quelqu'un de plus intelligent que moi pour le faire. Ensuite, je me suis retrouvé avec ce qui suit, une conversion en base 2 échangeant l'ordre dans une fonction récursive.
Essayez-le en ligne!
la source
R , 41 octets
Essayez-le en ligne!
Vérifiez tous les cas de test!
Utilise une conversion en base 256 comme MickyT l'a suggéré ici . R n'a pas d'entiers 32 bits non signés, pas plus qu'il n'a d'entiers 64 bits. Cela nous empêche d'utiliser des opérations au niveau du bit mais cette approche (et probablement celle de MickyT) est probablement encore plus courte car les opérateurs au niveau du bit de R sont assez verbeux.
Utilise le numéro 4 de cette astuce , en tenant compte du fait que nous n'obtenons jamais un nombre aussi grand que
256^4
.n%/%256^(0:3)%%256
extrait les octets et%*%
, le produit matriciel, est le produit scalaire dans cette situation, avec256^(3:0)
effet de l'ordre inversé des octets.%*%
renverra un 1x1matrix
contenant la valeur endian-inversée.la source
CP-1610Assemblage , 6 DECLEs = 8 octets
Ce code est destiné à être exécuté sur une Intellivision .
Un opcode CP-1610 est codé avec une valeur de 10 bits, connue sous le nom de «DECLE». Cette fonction est longue de 6 DECLEs, commençant à 480C $ et se terminant à 4811 $.
Le CP-1610 possède des registres 16 bits, nous utilisons donc deux d'entre eux (R0 et R1) pour stocker une valeur 32 bits.
Dump d'exécution
la source
C # (.NET Core) , 72 + 31 = 103 octets
Essayez-le en ligne!
+31 pour
using System;using System.Linq;
J'espérais utiliser
Array.Reverse
ligne, mais ce n'était pas le cas (voir alternative ci-dessous).C # (.NET Core) , 87 + 13 = 100 octets
Essayez-le en ligne!
+13 pour
using System;
Cette solution prend soin de @JeppeStigNielsen; supprimer la restriction d'avoir tout en ligne enregistré 3 octets.
la source
using System.Linq;
, il peut être encore moins cher à utiliserx=>{var a=BitConverter.GetBytes(x);Array.Reverse(a);return BitConverter.ToUInt32(a,0);}
.REXX , 42 octets
Essayez-le en ligne!
Non golfé:
la source
Swift, 28 octets
la source
Langage machine ARM Linux, 8 octets
Pour essayer vous-même, compilez et exécutez ce qui suit sur un appareil Raspberry Pi ou Android exécutant GNUroot
la source
Perl 5 , 27 octets
Essayez-le en ligne!
la source
Perl 5
-p
, 21 octetsEssayez-le en ligne!
la source
K4 , 18 octets
Solution:
Exemples:
Explication:
Il n'y a pas d'entiers non signés, donc la saisie est longue.
Convertir en tableau booléen (64 bits), remodeler, inverser, prendre les 8 premiers octets, reconvertir en long.
Prime:
Version 19 octets en oK que vous pouvez essayer en ligne!
la source