Hexadécimal et l'alphabet

45

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:

  1. Convertir l'entrée en hexadécimal
  2. Remplacez les lettres par leur index dans l'alphabet (par exemple a -> 1, b -> 2)
  3. Reconvertir le résultat en hexadécimal
  4. Si le résultat contient des lettres, passez à l'étape 2. Sinon, indiquez le résultat.

C'est du donc le code le plus court en octets gagne!

Downgoat
la source
27
+1 pour la justification "Comme ils ne comportent que 16 caractères hexadécimaux, votre code devra être aussi court que possible."
Chat
1
Un cas test qui passe par un chiffre zéro (ce qui est un cas important pour mon approche actuelle):749699 -> B7083 -> 27083 -> 69CB -> 6932 -> 1B14 -> 1214 -> 4BE -> 425 -> 1A9 -> 119 -> 77
Martin Ender
5
Cas de test 153. Étape 1> 99, Étape 2 -> 99, Étape 3 -> 63, sortie 63. Correct?
edc65
Oui pour 153 Je n'avais pas vu le code Explication du flux ...
RosLuP
Pour ce que ça vaut ... 3 des 4 réponses les plus fréquentes renvoient 99 sur l'entrée 153 et les erreurs de segmentation de Dennis sur la version actuelle de Jelly. Je vais arrêter les tests pendant que je suis devant :) Sommes-nous sûrs que cet exemple est correct?
Dana

Réponses:

13

Gelée , 18 octets

b⁴µ:⁵©+¹%⁵ḅ⁵ß¹®S¤?

Essayez-le en ligne!

La version binaire de 18 octets du code source a le vidage xxd

0000000: 62 b6 8c 3a b7 85 2b 8e 25 b7 a3 b7 95 8e 88 53 83 3f b..:..+.%......S.?

et fonctionne avec cette version de l'interprète Jelly .

Comment ça marche

b⁴µ:⁵©+¹%⁵ḅ⁵ß¹®S¤?  Define the main link -- Left input: a (number)

b⁴                  Convert from integer to base 16.
  µ                 Start a new, monadic link.
   :⁵               Divide all base 16 digits by 10.
     ©              Save the result in a register.
      +¹            Add the quotients to the base 16 digits.
        %⁵          Take all resulting sums modulo 10.
          ḅ⁵        Convert from base 10 to integer.
              ®S¤   Take the sum of the quotients from the list in the register.
                 ?  If the result is non-zero:
            ß         Recursively call the main link.
             ¹        Else, apply the identity function.

(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.

Dennis
la source
3
Qu'est-ce que c'est....?
J Atkin
1
Quel encodage utilise-t-il? Cela ne ressemble pas à UTF-8, ni à ISO-8859
Réduire le coût
2
@ Downgoat Ce n'est pas. Jelly utilise son propre encodage personnalisé. Le code source peut être fourni au format UTF-8 ou sous forme de fichier binaire.
Dennis
2
@ Timwi assez juste. J'ai ajouté les deux à l'article.
Dennis
2
Dans la défense de Dennis: comme Jelly utilise moins de 256 caractères, on pourrait définir trivialement un fork de Jelly qui utilise uniquement des caractères ANSI. La seule différence serait la lisibilité et la facilité de mémorisation des fonctions de chaque fonction.
Adám
8

JavaScript ES6, 98 92 67 64 octets

3 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:

h=x=>(y=x.toString(16))>(r=y.replace(/\D/g,z=>'0x'+z-9))?h(+r):r

La partie la plus intéressante de ce programme est probablement la replacefonction:

z=>     // Implicit: z = one of "a", "b", "c", "d", "e", "f"
'0x'+z  // Add '0x' to the beginning of z.
        // If z == "a", this results in "0xa".
-9      // Subtract 9. JavaScript automatically coerces the string to a number,
        // and because the prefix "0x" means "convert from hexadecimal",
        // the "a" is converted to 10, which then becomes 1 because of the subtraction.

Extrait de test

(pris d' ici )

h=x=>(y=x.toString(16))>(r=y.replace(/\D/g,z=>'0x'+z-9))?h(+r):r
<!--                               Try the test suite below!                              --><strong id="bytecount" style="display:inline; font-size:32px; font-family:Helvetica"></strong><strong id="bytediff" style="display:inline; margin-left:10px; font-size:32px; font-family:Helvetica; color:lightgray"></strong><br><br><pre style="margin:0">Code:</pre><textarea id="textbox" style="margin-top:5px; margin-bottom:5px"></textarea><br><pre style="margin:0">Input:</pre><textarea id="inputbox" style="margin-top:5px; margin-bottom:5px"></textarea><br><button id="testbtn">Test!</button><button id="resetbtn">Reset</button><br><p><strong id="origheader" style="font-family:Helvetica; display:none">Original Code Output:</strong><p><div id="origoutput" style="margin-left:15px"></div><p><strong id="newheader" style="font-family:Helvetica; display:none">New Code Output:</strong><p><div id="newoutput" style="margin-left:15px"></div><script type="text/javascript" id="golfsnippet">var bytecount=document.getElementById("bytecount");var bytediff=document.getElementById("bytediff");var textbox=document.getElementById("textbox");var inputbox=document.getElementById("inputbox");var testbtn=document.getElementById("testbtn");var resetbtn=document.getElementById("resetbtn");var origheader=document.getElementById("origheader");var newheader=document.getElementById("newheader");var origoutput=document.getElementById("origoutput");var newoutput=document.getElementById("newoutput");inputbox.value="234589";textbox.style.width=inputbox.style.width=window.innerWidth-50+"px";var _originalCode=null;function getOriginalCode(){if(_originalCode!=null)return _originalCode;var allScripts=document.getElementsByTagName("script");for(var i=0;i<allScripts.length;i++){var script=allScripts[i];if(script.id!="golfsnippet"){originalCode=script.textContent.trim();return originalCode}}}function getNewCode(){return textbox.value.trim()}function getInput(){try{var inputText=inputbox.value.trim();var input=eval("["+inputText+"]");return input}catch(e){return null}}function setTextbox(s){textbox.value=s;onTextboxChange()}function setOutput(output,s){output.innerHTML=s}function addOutput(output,data){output.innerHTML+='<pre style="background-color:'+(data.type=="err"?"lightcoral":"lightgray")+'">'+escape(data.content)+"</pre>"}function getByteCount(s){return(new Blob([s],{encoding:"UTF-8",type:"text/plain;charset=UTF-8"})).size}function onTextboxChange(){var newLength=getByteCount(getNewCode());var oldLength=getByteCount(getOriginalCode());bytecount.innerHTML=newLength+" bytes";var diff=newLength-oldLength;if(diff>0){bytediff.innerHTML="(+"+diff+")";bytediff.style.color="lightcoral"}else if(diff<0){bytediff.innerHTML="("+diff+")";bytediff.style.color="lightgreen"}else{bytediff.innerHTML="("+diff+")";bytediff.style.color="lightgray"}}function onTestBtn(evt){origheader.style.display="inline";newheader.style.display="inline";setOutput(newoutput,"");setOutput(origoutput,"");var input=getInput();if(input===null){addOutput(origoutput,{type:"err",content:"Input is malformed. Using no input."});addOutput(newoutput,{type:"err",content:"Input is malformed. Using no input."});input=[]}doInterpret(getNewCode(),input,function(data){addOutput(newoutput,data)});doInterpret(getOriginalCode(),input,function(data){addOutput(origoutput,data)});evt.stopPropagation();return false}function onResetBtn(evt){setTextbox(getOriginalCode());origheader.style.display="none";newheader.style.display="none";setOutput(origoutput,"");setOutput(newoutput,"")}function escape(s){return s.toString().replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}window.alert=function(){};window.prompt=function(){};function doInterpret(code,input,cb){var workerCode=interpret.toString()+";function stdout(s){ self.postMessage( {'type': 'out', 'content': s} ); }"+" function stderr(s){ self.postMessage( {'type': 'err', 'content': s} ); }"+" function kill(){ self.close(); }"+" self.addEventListener('message', function(msg){ interpret(msg.data.code, msg.data.input); });";var interpreter=new Worker(URL.createObjectURL(new Blob([workerCode])));interpreter.addEventListener("message",function(msg){cb(msg.data)});interpreter.postMessage({"code":code,"input":input});setTimeout(function(){interpreter.terminate()},1E4)}setTimeout(function(){getOriginalCode();textbox.addEventListener("input",onTextboxChange);testbtn.addEventListener("click",onTestBtn);resetbtn.addEventListener("click",onResetBtn);setTextbox(getOriginalCode())},100);function interpret(code,input){window={};alert=function(s){stdout(s)};window.alert=alert;console.log=alert;prompt=function(s){if(input.length<1)stderr("not enough input");else{var nextInput=input[0];input=input.slice(1);return nextInput.toString()}};window.prompt=prompt;(function(){try{var evalResult=eval(code);if(typeof evalResult=="function"){var callResult=evalResult.apply(this,input);if(typeof callResult!="undefined")stdout(callResult)}}catch(e){stderr(e.message)}})()};</script>

ETHproductions
la source
Il va économiser quelques octets d'utiliser une fonction pour .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é
Version du
@Downgoat Merci! J'avais essayé un .replacecordage avant de l'évaluer, mais cela s'est avéré plus long.
ETHproductions
Rappelez-vous également que vous pouvez en faire une fonction anonyme, en omettanth=
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ Merci pour les suggestions, mais cela ne fonctionnera pas, car il doit s'appeler lui-même.
ETHproductions
Gah! Je n'ai pas vu la récursion. Je suis et imbécile> _ <
Conor O'Brien
6

CJam, 21 19 octets

r{siGb_{(9%)}%_@#}g

Testez-le ici.

Explication

Un cas très rare de résultats modulo négatifs est utile. :)

r       e# Read input.
{       e# While the condition on top of the stack is truthy...
  s     e#   Convert to string. This is a no-op in the first iteration, but necessary
        e#   on subsequent iterations.
  i     e#   Convert to integer.
  Gb    e#   Get base-16 digits.
  _{    e#   Copy and map over the copy...
    (   e#   Decrement.
    9%  e#   Modulo 9. If the digit was originally in the range 0 to 9, it will remain
        e#   unchanged because -1 % 9 == -1. If the digit was in 10 to 15, it will become
        e#   0 to 5, respectively.
    )   e#   Increment. Undoes the decrement for unchanged digits and fixes the letter
        e#   digits because A corresponds to 1, not 0.
  }%
  _     e#   Duplicate result.
  @#    e#   Pull up original digits and try to find them in the array. This will be zero,
        e#   i.e. falsy, if they are equal and -1, i.e. truthy, if they are not.
}g
Martin Ender
la source
On dirait qu'un autre pourrait échouer pour 153? Il semble étrange que 3 réponses sur 4 aient le même problème? cjam.aditsu.net/…
dana le
4

Rubis, 35 + 1 = 36

Avec un indicateur de ligne de commande p, exécutez

$_='%x'%$_
redo if$_.tr!'a-f','1-6'

Explication:

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 $_.

histocrate
la source
4

Julia, 78 74 octets

f(x)=(h=hex(x);isdigit(h)?h:f(parse(replace(h,r"[a-z]",c->Int(c[1])-96))))

C'est une fonction récursive qui accepte un entier et retourne une chaîne.

Ungolfed:

function f(x::Integer)
    # Get the hexadecimal representation of x as a string
    h = hex(x)

    # Check whether all characters are digits
    if isdigit(h)
        # Return the hexadecimal representation of the input
        h
    else
        # Replace each letter with its position in the alphabet,
        # parse as an integer, and call f on the result
        f(parse(replace(h, r"[a-z]", c -> Int(c[1]) - 96)))
    end
end
Alex A.
la source
4

MATL , 23 25 octets

Avertissement

En écrivant cette réponse, j'ai remarqué un bogue dans la dec2basefonction 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

i`0:15YAt9X\t10ZQbb=~a]

Exemple

>> matl i`0:15YAt9X\t10ZQbb=~a]
> 234589
958

Explication

i             % input number
`             % do...while
  0:15YA      % convert number to representation with base defined by symbols 0,...,15
  t9X\        % duplicate vector. Modulus 9 with 0 replaced by 9      
  t10ZQ       % duplicate vector and convert to number using base 10
  bb=~a       % are second- and third-top stack elements different? (If so, next iteration)
]             % end        
Luis Mendo
la source
Vous pouvez écrire une réponse dans l'ancienne version du langage!
lirtosiast
@ThomasKwa Le problème est que dans la version précédente, le compilateur avait un bogue. Je l'ai corrigé dans la nouvelle version, qui inclut certaines nouvelles fonctionnalités (non liées)
Luis Mendo
3

Dyalog APL, 37 36 33 octets

{∧/9≥X←16⊥⍣¯1⊢⍵:10⊥X⋄∇10(⊣⊥|+≤)X}

Merci à 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.

voidhawk
la source
-2 en choisissant les bonnes fonctions d'inégalité:{∧/9≥X←16⊥⍣¯1⊢⍵:10⊥X⋄∇10⊥10|X+9<X}
Adám le
1
ou même plus court: 10⊥10|X+10≤X-> 10(⊣⊥|+≤)X(techniquement non équivalent, mais fonctionne pour les chiffres hexadécimaux)
ngn le
1
16⊥⍣¯1⊢⍵->⍵⊤⍨⍴⍨16
NDGN le
2

Python, 118 105 octets

def f(n):h=hex(n)[2:];return h if h.isdigit()else f(int(''.join(map(lambda x:chr((ord(x)-47)%48+47),h))))
basile-henry
la source
2

PHP, 140 126 122 114 112 87 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 -rsans besoin <?et?>

Code

$b=readline();while($c!=$b)$b=preg_replace('/\D/e','ord($0)-96',$c=dechex($b));echo$c

Formaté

$b=readline();
while($c!=$b){
  $b=preg_replace('/\D/e','ord($0)-96',$c=dechex($b));
}
echo "$b\n";

Code de remplacement (en utilisant argv au lieu de stdin)

for($b=$argv[1];$c!=$b;)$b=preg_replace('/\D/e','ord($0)-96',$c=dechex($b));echo$b

Formaté

for($b=$argv[1];$c!=$b;) {
  $b=preg_replace('/\D/e','ord($0)-96',$c=dechex($b));
}
echo $b;

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é \nde 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 \Dsauver 3 caractères, enlevé strvalappel preg_replacepour plus 8; version ajoutée qui utilise à la argv[]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 la subjectpartie depreg_replacepour 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, @Blackhole

Jase
la source
Bienvenue sur Code Golf! Comme les fichiers sans balises d'ouverture sont des fichiers PHP valides, nous comptons toujours les balises en PHP (ou alternativement, nous comptons les deux octets pour l' -roption). 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).
Blackhole
L'entrée 153devrait donner 63, pas 99. Mais -rc'est gratuit. (voir codegolf.meta.stackexchange.com/a/2428/55735 )
Titus le
2

R , 106 103 102 octets

-3 octets en utilisant ifau lieu dewhile

-1 octet grâce à Giuseppe utilisant as.doubleau lieu deas.integer

a=function(y){x=as.hexmode(as.double(y))
if(grepl("[a-f]",x)){x=chartr("a-f","1-6",x);return(a(x))};x}

Essayez-le en ligne!

Ajoutez simplement a(your_integer_here)à la TIO pour voir le résultat.

> a(234589)
[1] "958"
> a(435234)
[1] "1617"
> a(99999)
[1] "4908"

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 chartrfonction, 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 de as.hexmode(as.double(y)), mais je dois quand même utiliser as.doublequelque part dans le code, qui était de 2 1 octet de plus.

Sumner18
la source
as.doubleest plus court queas.integer
Giuseppe
Il reste encore quelques golfs à faire mais je suis actuellement sur mobile. N'hésitez pas à rejoindre notre discussion de golf R et n'oubliez pas de consulter (et de contribuer à) des conseils pour jouer au golf dans R!
Giuseppe
2

05AB1E , 12 octets

h[Au₂L‡hÐþQ#

Essayez-le en ligne ou vérifiez tous les cas de test .

Explication:

h              # Convert the (implicit) integer-input to a hexadecimal string
               #  i.e. 234589 → "3945D"
 [             # Start an infinite loop:
  Au           #  Push the uppercase alphabet "ABC...XYZ"
    L         #  Push a list in the range [1,26]
              #  Transliterate: replace all letters with the integers at the same index
               #   i.e. "3945D" → "39454"
               #   i.e. "239B" → "2392"
       h       #  Convert the integer to a hexadecimal string again
               #   i.e. "39454" → "9A1E"
               #   i.e. "2392" → "958"
        Ð      #  Triplicate it
         þ     #  Leave only the digits of the last copy
               #   i.e. "9A1E" → "91"
               #   i.e. "958" → "958"
          Q    #  Check if these digits and the hexadecimal string are equal
               #   i.e. "9A1E" and "91" → 0 (falsey)
               #   i.e. "958" and "958" → 1 (truthy)
           #   #  And if they are: stop the infinite loop
               # (and output the remaining copy from the triplicate implicitly as result)

ÐþQpourrait également être D.ï( D: Duplicate ;: is_int?) pour le même nombre d'octets.

Kevin Cruijssen
la source
1
@MagicOctopusUrn [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.
Kevin Cruijssen le
2

C # (compilateur interactif Visual C #) , 92 octets

n=>{var s=$"{n:x}";for(;(s=$"{s.Aggregate(0,(a,c)=>10*a+c%48):x}").Any(c=>c>57););return s;}

Essayez-le en ligne!

Code moins golfé:

// anonymous function with
// input integer n
// output is a string
n=>{
  // 1) Convert the input to hexadecimal
  var s=$"{n:x}";
  for(;
    (s=$"{
      // 2) replace letters with their index in the alphabet
      s.Aggregate(0,(a,c)=>10*a+c%48)
      // 3) Convert the result back to hexadecimal
      :x}"
    // 4) If the result contains any letters, go to step 2
    ).Any(c=>c>57););
  // If not, output the result
  return s;
}
Dana
la source
À la suite de l’algo à la fin du post de la question, 153 doit donner 63 et non 99 comme il me semble que votre fonction est revenue il ya quelque temps
RosLuP
1
@RosLuP - Il a fonctionné avec ce 153, bien que ma solution soit maintenant beaucoup plus longue :) Je vais travailler à le réduire, mais pour le moment au moins, le cas est traité correctement.
Dana
1

Mathematica, 107 octets

(b=FromDigits)@NestWhile[b[#/.Thread[10~Range~15->Range@6]]~a~16&,#~(a=IntegerDigits)~16,MemberQ[a_/;a>9]]&

Impossible de trouver plus de moyens de jouer au golf ...

LegionMammal978
la source
1

Mathematica, 80 octets

i=IntegerDigits;f=FromDigits;f[#~i~16//.l_/;Max@l>9:>f[If[#>9,#-9,#]&/@l]~i~16]&

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>9qui ne correspond que si la liste de chiffres hexadécimaux contient toujours des chiffres supérieurs à 9.

Martin Ender
la source
1

Japt, 45 40 octets

Basé sur ma réponse JS:

I=_nG -9}H=_=ZsG)f/\D/ ?H$($ÂZr"\\D"I):Z

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 Hqui peut être appelée comme suit:

I=_nG -9}H=_=ZsG)f/\D/ ?H$($ÂZr"\\D"I):Z}
$H(234589)$

Alternativement, voici un programme complet, prenant les informations de STDIN:

I=_nG -9}H=_=ZsG)f/\D/ ?H$($ÂZr"\\D"I):Z}H$(U

Essayez-le en ligne!

ETHproductions
la source
1

GNU Sed (avec extension eval), 44

:
y/ABCDEF/123456/
s/^/printf %X /e
/[A-F]/b

Je souhaiterais sedpermettre y/A-F/1-6/. Mais ce n'est pas le cas.

Trauma numérique
la source
1

Python 3, 101 89 octets

Globalement, cela ressemble beaucoup à la solution de Boomerang , mais il faut adopter différentes approches pour différents aspects.

def d(n):n=hex(int(n))[2:];return n.isdigit()and n or d(str([ord(c)%12for c in n])[1::3])

Ceci est la version développée de mon code original:

def d(n):
    n = int(n)                        # Interpret input as a decimal integer.
    n = hex(n)[2:]                    # Convert it to hex, stripping the '0x'.
    if n.isdigit():                   # If every character is a digit...
        return n                      # ...we're done.
    else:                             # Otherwise...
        n = ''.join(c if c < ':' else # ...don't change digits (':' is after
                    chr(ord(c - 48))  # '9'), but do change letters ('1' is 48
                    for c in n)       # characters before 'a').
        return d(n)                   # Then follow the process again.

11 octets ont été perdus grâce à @pacholik (en remplaçant les entrailles de la joinpar une seule opération qui a fonctionné pour les chiffres et les lettres). Un autre octet a été ajusté en remplaçant le joinpar 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).

Tim Pederick
la source
Le joinpeut être raccourci à str(ord(c)%12)for c in n.
Pacholik
1

Java, 201 octets

String f(int a){String s=Long.toString(a,16);while(s.matches(".*[a-z].*")){char[]b=s.toCharArray();for(int i=0;i<b.length;i++)if(b[i]>96)b[i]-=48;s=Long.toString(new Long("".valueOf(b)),16);}return s;}
SuperJedi224
la source
1

Japt , 21 octets

ìG
®+zA
eV ?U:ßVmuA ì

Essayez-le en ligne!

Une amélioration significative par rapport à la réponse Japt existante. Il ne traite pas le 153 -> 63cas 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:

ìG               #Get a list of base-16 digits, each as a base-10 number
                    e.g. 234589 -> [3,9,4,5,13]

®+zA             #Increment the numbers greater than 10
                    e.g. [3,9,4,5,13] -> [3,9,4,5,14]

eV ?             #If the second step didn't change any digit:
    U            # Output the digits from step 1
     :           #Otherwise
      ß          # Repeat the program with new input:
       V         #  The result of step 2
        muA      #  With each digit modulo 10
            ì    #  Treated as a base-10 number
Kamil Drakari
la source
1

APL (NARS) 104 caractères, 208 octets

f←{k←10⊥{⍵≤9:⍵⋄1+10∣⍵}¨q←{(16⍴⍨⌊1+16⍟⍵)⊤⍵}⍵⋄9≥⌈/q:k,0⋄k,1}
t←{⍵≤0:0⋄0=2⊃v←f⍵:↑f↑v⋄{k←f⍵⋄0=2⊃k:↑k⋄∇↑k}⍵}

tester:

  t 153
63
  t 0
0
  t 234589
958
  t 435234
1617
  t ¯123
0

Je ne sais pas si ça va ... Peut-être que ce n'est pas suffisant pour une réponse de qualité standard ...

RosLuP
la source
0

Sérieusement, 42 octets

1╤╝4ª╗,$1WX╛@¿╜@¡;`╜@¿;)╛;(\(+%$`Mεj;)=YWX

Décharge Hex:

31d1bc34a6bb2c24315758be40a8bd40ad3b60bd40
a83b29be3b285c282b2524604dee6a3b293d595758

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 Wréellement sauté, car il est plus court de mettre un ;juste avant le dernier lorsque vous ne le souhaitez que mettre un Xaprès CHAQUE WIci, avoir Wpop au lieu de peek économiserait trois octets.)

quintopie
la source
0

Japt, 18 octets

Æ=ìG ®%9ª9Ãì)sGÃæÑ

L'essayer

Hirsute
la source
0

PHP, 71 octets

while($n++<2|$b-$a=&$argn)$a=strtr($b=dechex($a),abcdef,123456);echo$a;

Exécuter en pipe -nRou 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 abcdefentre guillemets pour corriger.

Titus
la source