Dans ce défi, vous recevrez une entrée, la convertirez en hexadécimal, apporterez quelques modifications et produirez le résultat.
Comme ils ne comportent que 16 caractères hexadécimaux, votre code devra être aussi court que possible.
Exemples
Les exemples sont séparés par une ligne vide. La première ligne est entrée, la deuxième ligne montre les étapes, la troisième montre la sortie
234589
234589 -> 3945D -> 39454 -> 9A1E -> 9115 -> 239B -> 2392 -> 958
958
435234
435234 -> 6A422 -> 61422 -> EFEE -> 5655 -> 1617
1617
153
153 -> 99 -> 99 -> 63
1617
Pas
L'entrée sera toujours un entier positif
Afin de générer la sortie, vous devrez suivre les étapes suivantes:
- Convertir l'entrée en hexadécimal
- Remplacez les lettres par leur index dans l'alphabet (par exemple
a -> 1, b -> 2
) - Reconvertir le résultat en hexadécimal
- Si le résultat contient des lettres, passez à l'étape 2. Sinon, indiquez le résultat.
C'est du code-golf, donc le code le plus court en octets gagne!
code-golf
math
number
base-conversion
hexadecimal
Downgoat
la source
la source
749699 -> B7083 -> 27083 -> 69CB -> 6932 -> 1B14 -> 1214 -> 4BE -> 425 -> 1A9 -> 119 -> 77
Réponses:
Gelée , 18 octets
Essayez-le en ligne!
La version binaire de 18 octets du code source a le vidage xxd
et fonctionne avec cette version de l'interprète Jelly .
Comment ça marche
Ḍ
(décimal à entier) aurait dû fonctionner comme un raccourci pourḅ⁵
, mais la dernière version de Jelly au moment de ce post avait un bogue qui m'a empêché de l'utiliser.la source
JavaScript ES6,
98926764 octets3 octets sauvés grâce à @Downgoat, 3 autres grâce à @ user81655
J'ai trouvé une version beaucoup plus courte amerrant la boucle pour la récursion:
La partie la plus intéressante de ce programme est probablement la
replace
fonction:Extrait de test
(pris d' ici )
la source
.toString(16)
:x=>eval("for(x=(j=n=>n.toString(16))(x);/\\D/.test(x);)x=j(+x.replace(/\\D/g,z=>+('0x'+z)-9))")
. Il pourrait également économiser quelques octets en utilisant la récursivité.replace
cordage avant de l'évaluer, mais cela s'est avéré plus long.h=
CJam,
2119 octetsTestez-le ici.
Explication
Un cas très rare de résultats modulo négatifs est utile. :)
la source
Rubis, 35 + 1 = 36
Avec un indicateur de ligne de commande
p
, exécutezExplication:
L'indicateur -p crée une boucle, stockant l'entrée et la sortie éventuelle dans la variable
$_
.'%x'
effectue la conversion hexadécimale,tr!
effectue la substitution de chiffre et renvoie une valeur de falsey s'il n'y a rien à changer. refaire recommence avec le nouveau$_
.la source
Julia,
7874 octetsC'est une fonction récursive qui accepte un entier et retourne une chaîne.
Ungolfed:
la source
MATL , 23
25octetsAvertissement
En écrivant cette réponse, j'ai remarqué un bogue dans la
dec2base
fonction de MATL, je l'ai corrigé et j'ai publié une nouvelle version avec la correction (ainsi que quelques autres modifications accumulées et non liées) .Puisque j'utilise une version postérieure à ce défi, selon le consensus sur Meta, cette réponse n'est pas éligible pour gagner .
Code
Exemple
Explication
la source
Dyalog APL,
373633 octetsMerci à Adám et ngn pour leurs suggestions. Je garde
16⊥⍣¯1⊢⍵
au lieu de⍵⊤⍨⍴⍨16
- c'est un octet supplémentaire, mais nous permet d'opérer sur des nombres de taille arbitraire plutôt que sur 64 bits.la source
{∧/9≥X←16⊥⍣¯1⊢⍵:10⊥X⋄∇10⊥10|X+9<X}
10⊥10|X+10≤X
->10(⊣⊥|+≤)X
(techniquement non équivalent, mais fonctionne pour les chiffres hexadécimaux)16⊥⍣¯1⊢⍵
->⍵⊤⍨⍴⍨16
Python,
118105 octetsla source
PHP,
14012612211411287 ou 84 octets (inclus-r
)Pas tout à fait sûr de la façon dont les règles autour de ceci car c'est ma première tentative de codegolf, mais le code peut être exécuté avec
php -r
sans besoin<?
et?>
Code
Formaté
Code de remplacement (en utilisant argv au lieu de stdin)
Formaté
Remarques
Edit 1: Je coupe un appel pour
intval()
enregistrer 14 caractères, car PHP traitera avec plaisir les chaînes numériques comme des nombres.Edit 2: J'ai supprimé
\n
de la sortie ce que j'avais oublié de supprimer après le test et supprimé les guillemets de l'écho final pour enregistrer un total de 4 caractères.Edit 3: Suppression du dernier appel à
intval()
Edit 4: 2 octets enregistrées en enlevant les guillemets de la ligne regex
Edit 5: Changement
[a-f]
de\D
sauver 3 caractères, enlevéstrval
appelpreg_replace
pour plus 8; version ajoutée qui utilise à laargv[]
place de STDIN, a déplacé le terminateur de boucle dans l'instruction while (oops!) en enregistrant 11 caractères supplémentaires et a déplacé l'appel dechex dans lasubject
partie depreg_replace
pour 3 autres, soit un total de 25; a également ajouté une version non stdin en tant que version alternative qui utilise 3 caractères de moins. Merci pour l'aide, @Blackholela source
-r
option). Mais un leader;
est toujours plus court qu'un leader?>
, alors ne l'oubliez pas. À propos, voici un code plus court:for($a=$argv[1];$b!=$a;)$a=preg_replace('#\D#e','ord($0)-96',$b=dechex($a));echo$b;
(-29 octets).153
devrait donner63
, pas99
. Mais-r
c'est gratuit. (voir codegolf.meta.stackexchange.com/a/2428/55735 )R ,
106103102 octets-3 octets en utilisant
if
au lieu dewhile
-1 octet grâce à Giuseppe utilisant
as.double
au lieu deas.integer
Essayez-le en ligne!
Ajoutez simplement
a(your_integer_here)
à la TIO pour voir le résultat.J'ai utilisé la récursivité pour réappliquer la fonction à chaque itération successive, à condition qu'elle ne trouve aucune des lettres "abcdef" dans la chaîne. Lorsque cette condition est False, le résultat est affiché sous forme de chaîne. La meilleure partie a été ma découverte de la
chartr
fonction, ce qui me permet d’échanger des éléments avec les éléments correspondants d’une chaîne. Cette chaîne provient de la fonction contraignant l'hexadécimal dans un format de chaîne.Edit: J'ai essayé d'utiliser à la
sprint("%x",y)
place deas.hexmode(as.double(y))
, mais je dois quand même utiliseras.double
quelque part dans le code, qui était de21 octet de plus.la source
as.double
est plus court queas.integer
05AB1E , 12 octets
Essayez-le en ligne ou vérifiez tous les cas de test .
Explication:
ÐþQ
pourrait également êtreD.ï
(D
: Duplicate.ï
;: is_int?) pour le même nombre d'octets.la source
[hÐþQ#Au₂L‡
ne fonctionne pas toujours malheureusement. Le défi consiste à convertir en hexadécimal une première fois, puis à chaque itération. Si je colle votre code dans ma suite de tests, les trois premiers cas de test sont corrects, mais les deux derniers échouent.C # (compilateur interactif Visual C #) , 92 octets
Essayez-le en ligne!
Code moins golfé:
la source
Mathematica, 107 octets
Impossible de trouver plus de moyens de jouer au golf ...
la source
Mathematica, 80 octets
Cela utilise une astuce intéressante pour les boucles while-loops que j'ai apprises de l'alephalpha. Le
//.
est "appliquer cette règle de substitution aussi souvent que possible". Ensuite, nous utilisons un modèle,l_/;Max@l>9
qui ne correspond que si la liste de chiffres hexadécimaux contient toujours des chiffres supérieurs à 9.la source
Japt,
4540 octetsBasé sur ma réponse JS:
Assez pathétique pour une langue de golf, hein? Il semble que beaucoup de gens se rendent compte au cours de ce défi que leurs interprètes ont des bogues, et je suis maintenant inclus parmi eux. Cela devrait pouvoir être fait en 30 octets ou moins, mais un bogue rend cela impossible.
Cela crée une fonction
H
qui peut être appelée comme suit:Alternativement, voici un programme complet, prenant les informations de STDIN:
Essayez-le en ligne!
la source
GNU Sed (avec extension eval), 44
Je souhaiterais
sed
permettrey/A-F/1-6/
. Mais ce n'est pas le cas.la source
Python 3,
10189 octetsGlobalement, cela ressemble beaucoup à la solution de Boomerang , mais il faut adopter différentes approches pour différents aspects.
Ceci est la version développée de mon code original:
11 octets ont été perdus grâce à @pacholik (en remplaçant les entrailles de la
join
par une seule opération qui a fonctionné pour les chiffres et les lettres). Un autre octet a été ajusté en remplaçant lejoin
par un truc de coupe de cordes qui m’a frappé dans l’ampoule (mais qui existe déjà dans les astuces de golf de Python , bien que sous un en-tête spécifiant Python 2).la source
join
peut être raccourci àstr(ord(c)%12)for c in n
.Java, 201 octets
la source
Japt , 21 octets
Essayez-le en ligne!
Une amélioration significative par rapport à la réponse Japt existante. Il ne traite pas le
153 -> 63
cas proposé dans un commentaire, mais aucune des autres réponses ne semble l'être non plus, donc je le laisserai à moins que le PO ne clarifie.Sortie sous forme de liste de chiffres décimaux, peut être changé en sortie d'un nombre décimal pour 1 octet
Explication:
la source
APL (NARS) 104 caractères, 208 octets
tester:
Je ne sais pas si ça va ... Peut-être que ce n'est pas suffisant pour une réponse de qualité standard ...
la source
Sérieusement, 42 octets
Décharge Hex:
Essayez-le en ligne
Il doit y avoir un chemin plus court que cela, mais ce que je suis ... (C'est là où je me trouve souhaitant
W
réellement sauté, car il est plus court de mettre un;
juste avant le dernier lorsque vous ne le souhaitez que mettre unX
après CHAQUEW
Ici, avoirW
pop au lieu de peek économiserait trois octets.)la source
Japt, 18 octets
L'essayer
la source
PHP, 71 octets
Exécuter en pipe
-nR
ou essayer en ligne .Renvoie un avertissement pour certaines entrées dans PHP 7.1 et versions ultérieures; remplacer
-
par!=
pour réparer.Donne un autre avertissement en PHP 7.2; mettre
abcdef
entre guillemets pour corriger.la source