Défi
En voici une simple.
Écrivez une fonction ou un programme lorsque vous lui donnez un nombre en base 10 en entrée, il retournera ou imprimera la valeur de ce nombre en hexadécimal .
Exemples
15 -> F
1000 -> 3E8
256 -> 100
Règles
- Aucune fonction hexadécimale intégrée
- Les lettres peuvent être en minuscules ou en majuscules
- Vous n'aurez qu'à vous soucier des entiers non négatifs, pas de négatifs ou de décimales embêtantes
- Il devrait fonctionner avec n'importe quel nombre arbitrairement grand jusqu'à la limite du type par défaut de la langue.
- Newline non obligatoire
- Comme d'habitude, c'est le code-golf , donc le code le plus court mesuré en octets gagne!
code-golf
math
base-conversion
hexadecimal
Type au hasard
la source
la source
000003E8
?Réponses:
APL (Dyalog APL) , 17 octets
Doit être exécuté avec
⎕IO←0
, ce qui est par défaut sur de nombreux systèmes APL.Essayez-le en ligne!
(⎕D,⎕A)[
...]
D igits concaténer A lphabet, puis indexés par ...16⊥⍣¯1
l'inverse de 16-Base-to-Number, c'est-à-dire Number-to-Base-16⊢
appliqué à⎕
entrée numériquela source
Code machine de Turing, 412 octets
Comme d'habitude, j'utilise la syntaxe de table de règles définie ici. Vous pouvez le tester sur ce site ou, en variante, en utilisant cette implémentation java.
Compte à rebours à partir de l'entrée en base 10 en comptant à partir de 0 en base 16. En décrémentant zéro, il efface le bloc d'entrée et se termine.
la source
10*n + 33
instructions à remplir pour tout arbitrairen
. Je ne comprends pas le code cependant.Java,
9289 octetsla source
Javascript,
4943 octets.6 octets enregistrés par user81655 .
Testez-le ici .
Cela comporte deux zéros non significatifs, ce qui est autorisé par les règles.
Voici une version sans zéros non significatifs: (47 octets).
Testez-le ici .
Ces deux utilisent exactement la même approche que ma réponse Python .
la source
i&15
sera automatiquement converti en entier, en supprimant les décimales. Pas besoin de~~
h=i=>i&&h(i>>4)+"0123456789abcdef"[i&15]
CJam,
2221 octetsMerci à @ MartinBüttner pour avoir joué au golf sur 1 octet!
Essayez-le en ligne!
Comment ça marche
la source
ri{Gmd_9>7*sc+\}h;]W%
Pyth,
33262120 octetsC'était amusant.
Essayez-le en ligne.
Expliqué:
la source
C (fonction), 51
La fonction récursive prend un entier en entrée comme paramètre:
Pilote de test:
la source
Haskell,
5958434139 octetsExemple d'utilisation:
sequence(s<$s)!!) $ 1000
->"00000000000003E8"
.Cela crée une liste de tous les nombres hexadécimaux jusqu'à 16 chiffres hexadécimaux. Heureusement, cela se passe dans l'ordre, nous pouvons donc simplement choisir le
n
e.Edit: @Mauris a pressé 2 octets. Merci!
la source
s="0123456789ABCDEF";(sequence(s<$s)!!)
dc, 37
Divmod récursivement par 16, poussant le reste dans la pile jusqu'à ce qu'il ne reste plus rien à diviser. Imprimez ensuite chaque élément de la pile, en utilisant divmod par 10 pour obtenir des chiffres AF. Probablement plus de détails demain ... (et, espérons-le, moins d'octets).
la source
Python,
5958 octets1 octet enregistré par CarpetPython
Courir comme:
print h(15)
Testez-le ici (Ideone.com).
Explication:
la source
h=lambda i:(i>15 and h(i/16)or'')+"0123456789abcdef"[i%16]
.h=lambda i:(i>15 and h(i/16)or'')+chr(48+i%16+i%16/10*7)
C (gcc) ,
4544 octetsEssayez-le en ligne!
la source
Bash (fonction), 62
Merci à @manatwork d'avoir suggéré d'utiliser la récursivité.
la source
h(){ x=({0..9} {A..F});echo `(($1>15))&&h $[$1/16]`${x[$1%16]}; }
()
au lieu de{ ;}
contourner le corps de la fonction permet d'économiser encore plus :)Perl 6 ,
5348 octetsCela crée une séquence de valeurs divisées en entier (
div
), jusqu'à ce que le résultat0
exclue le0
de la séquence.Il traverse ensuite (
X
) cette séquence en utilisant l'opérateur de module (%
) avec16
Il utilise ces valeurs comme index dans une liste aplatie composée de deux plages
0..9
et'A'..'Z'
Enfin, il les concatène (
~
) en utilisant l'R
opérateur méta reverse ( )Si cela se traduit par une valeur False (chaîne vide), retournez
0
Usage:
la source
MATL , 27 octets
Cela utilise la version 5.1.0 du langage / compilateur, qui est antérieure à ce défi.
Exemple
Explication
la source
𝔼𝕊𝕄𝕚𝕟, 31 caractères / 62 octets
Try it here (Firefox only).
D'accord, j'ai trouvé d'autres trucs qui ont joué un rôle.
Explication
C'est essentiellement la même solution que la solution ES6 de @ SuperJedi224 - mais avec quelque chose de différent.
Tu vois
⩥ḊĀⒸª⩥⁽ṁṇ⸩⨝
? C'est une façon d'écrire vraiment fantaisiste"0123456789ABCDEF"
.⩥Ḋ
crée une plage de 0 à 10,Ⓒª⩥⁽ṁṇ⸩
crée une plage de 65 à 71 et la convertit en une chaîne ASCII, etĀ...⨝
concatène les deux plages et les joint en une seule chaîne. C'était probablement la partie la plus cool de ma solution.Version bonus non compétitive, 24 caractères / 45 octets
J'ai décidé d'ajouter une chaîne d'alphabet, comme en Pyth.
la source
sed, 341 octets
Ce n'est pas le langage évident pour ce défi, mais il a l'avantage de prendre en charge des numéros d'entrée allant jusqu'à (selon votre implémentation) entre 4000 chiffres et la limite de la mémoire (virtuelle) disponible de votre système. J'ai converti RSA-1024 en hexadécimal en environ 0,6 seconde, donc il évolue assez bien.
Il fonctionne par division successive par deux, accumulant tous les 4 bits de report en un chiffre hexadécimal. Nous utilisons des caractères non alphabétiques pour représenter notre sortie, de sorte que nous accumulons toujours le report entre l'entrée décimale et la sortie hexadécimale, et nous convertissons en hexadécimal conventionnel à la toute fin.
la source
PHP,
65 66 64 + 1 6259 octetsfonction d'impression récursive, imprime un zéro non significatif (insérer
>16
avant&&
pour le supprimer)programmes, 64 octets +1 pour
-R
(exécuter en tant que canal avec-nR
)nécessite PHP 5.6 ou version ultérieure (5.5 ne peut pas indexer les littéraux de chaîne)
ou
nécessite PHP 5.6 ou 7.0 (7.1 comprend les index de chaîne négatifs)
Exécuter en tant que pipe avec
-nR
ou essayer en ligne .la source
echo+$s
pour l'entrée 0+
signe coupe la sortie à la première lettre ... alors ..?:0
Julia, 55 octets
Il s'agit de l'implémentation de la fonction récursive de base. Il accepte un entier et renvoie une chaîne.
Si l'entrée est inférieure à 15, étage divisez-la par 16 et répétez, sinon prenez la chaîne vide. Fixez-le sur le devant du caractère hexadécimal correctement sélectionné.
la source
Pyre , 98 octets
Faire cela dans une langue sans opérateurs arithmétiques était probablement une erreur.
Utilisez comme ceci:
Non golfé:
la source
Ruby, 48 caractères
(Copie de la réponse Python de Loovjo .)
Exemple d'exécution:
la source
Sérieusement, 35 octets
Vidage hexadécimal:
Essayez-le en ligne
Explication:
Notez que le
;7ªD+@9<7*+c
est équivalent à4ª▀E
, ce qui permettrait d'économiser 8 octets, mais je pensais qu'une fonction qui pousse les chiffres de base b en tant que chaîne pourrait être considérée trop comme un "intégré heaxadécimal".la source
Javascript ES6,
6458 octets6 octets enregistrés grâce à ן nɟuɐɯɹɐ ן oɯ et user81655.
la source
v=>eval('for(z="";v;v=v/16|0)z="0123456789ABCDEF"[v%16]+z')
v=>{for(z="";v>0;v=v/16|0)z=btoa``Ó]·ã»óÐ1``[v%16]+z;return z}
(Les doubles tildes sont des tildes simples) ==> 64 caractères, 71 octets. Pas la peine.v=v/16|0
est juste une façon complexe d'écrirev>>=4
.Befunge-93, 58
La première fois que vous faites un vrai défi de golf à Befunge, je parie qu'il y a une doublure pour cela qui est plus courte car tous ces espaces au milieu de la deuxième ligne semblent inutiles.
Vous pouvez le parcourir ici . Explication partielle:
&
: Prendre une entrée.:88+%
: Prenez le reste modulo 16."0"+
: Ajoutez-le à la valeur ASCII de 0.:"9"`
: Si le résultat est supérieur à la valeur ASCII de 9 ...7*+
: Ajoutez 7 pour le convertir en lettre.\
: Enregistrez le personnage résultant sur la pile.8/2/
: Divisez par 16 en arrondissant.:!#|_
: Quittez la boucle si le résultat est 0.#
: Sinon, revenez à l'étape du module.>:#,_@
(enroulement): Une fois terminé, sortez la pile dans l'ordre LIFO.la source
> <> , 46 + 3 = 49 octets
Cela aurait été plus court si> <> avait une division entière, que nous devons maintenant émuler en soustrayant le modulo 1. Pourtant, je pense que cela utilise un habillage assez soigné autour des astuces!
Essayez-le en ligne!
Explication
Première boucle
La première boucle effectue l'algorithme classique de conversion en hexadécimal. Il fait modulo 16 (
:f1+%
) et vérifie si le résultat est <10 (:a(?
). Si ce n'est pas le cas, nous devons ajouter 7 (7+
) afin de passer des décimales à l'alphabet majuscule dans le tableau ASCII. Sinon, nous pouvons procéder en ajoutant la valeur ASCII pour 0 ("0"+
) et en déplaçant le caractère à afficher au bas de la pile, car nous devrons les sortir dans l'ordre inverse. La valeur supérieure est alors remplacée par son résultat de division entière par 16. Ceci est émulé en calculant a / b - (a / b)% 1 (f1+,:1%-
). Une fois la boucle terminée, la pile contient les caractères hexadécimaux dans l'ordre de sortie inversé et un 0.Deuxième boucle
La deuxième boucle inverse la liste et vérifie si l'élément supérieur est 0. Si tel est le cas, nous savons que tous les éléments non nuls ont été imprimés et nous devons terminer. Sinon, nous sortons le caractère et inversons à nouveau la liste pour préparer la prochaine itération. L'
:
entrée dans la deuxième boucle dupliquera le 0 qui n'a aucun effet.la source
SpecBAS - 110 octets
Cela utilise un algorithme que j'ai trouvé sur WikiHow (2ème méthode).
Les chaînes dans SpecBAS sont basées sur 1, d'où la
+1
sélection de l'élément correct.la source
C (clang) , 83 octets
Essayez-le en ligne!
Solution alternative en C
la source
Rubis, 40 octets
Volé àInspired by manatwork's answer, mais en utilisant une faille intéressante pour la raccourcir.la source
REXX,
8078 octetsla source
C, 48 octets
Ce n'est pas complètement original, j'ai rasé 5 octets de la version Digital Trauma mise en place.
la source
APL (NARS), caractères 34, octets 68
tester:
la source