Hexadecimal y el alfabeto

45

En este desafío, recibirá una entrada, la convertirá a hexadecimal, hará un par de cambios y generará el resultado.

Debido a que solo tienen 16 caracteres en hexadecimal, su código deberá ser lo más corto posible.


Ejemplos

Los ejemplos están separados por una línea en blanco. La primera línea es de entrada, la segunda línea muestra los pasos, la tercera muestra la salida

234589
234589 -> 3945D -> 39454 -> 9A1E -> 9115 -> 239B -> 2392 -> 958
958

435234
435234 -> 6A422 -> 61422 -> EFEE -> 5655 -> 1617
1617

153
153 -> 99 -> 99 -> 63
1617

Pasos

La entrada siempre será un número entero positivo.


Para generar la salida, deberá seguir los siguientes pasos:

  1. Convierta la entrada a hexadecimal
  2. Reemplace cualquier letra con su índice en el alfabeto (por ejemplo a -> 1, b -> 2)
  3. Convertir el resultado nuevamente a hexadecimal
  4. Si el resultado contiene letras, vaya al paso 2. Si no, envíe el resultado

Este es el código más corto en bytes gana!

Downgoat
fuente
27
+1 para la justificación "Debido a que solo tienen 16 caracteres en hexadecimal, su código deberá ser lo más corto posible".
gato
1
Un caso de prueba que pasa por un dígito cero (que es un caso marginal importante para mi enfoque actual):749699 -> B7083 -> 27083 -> 69CB -> 6932 -> 1B14 -> 1214 -> 4BE -> 425 -> 1A9 -> 119 -> 77
Martin Ender
55
Caso de prueba 153. Paso 1> 99, Paso 2 -> 99, Paso 3 -> 63, salida 63. ¿Correcto?
edc65
Sí, para 153 no había visto la explicación del código Flow ...
RosLuP
Por lo que vale ... 3 de las 4 respuestas principales devuelven 99 en la entrada 153 y las fallas seg de Dennis en la versión actual de Jelly. Voy a dejar de probar mientras estoy adelante :) ¿Estamos seguros de que ese ejemplo es correcto?
dana

Respuestas:

13

Jalea , 18 bytes

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

Pruébalo en línea!

La versión binaria de 18 bytes del código fuente tiene el volcado xxd

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

y funciona con esta versión del intérprete Jelly .

Cómo funciona

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.

(decimal a entero) debería haber funcionado como una abreviatura ḅ⁵, pero la última versión de Jelly en el momento de esta publicación tenía un error que me impedía usarlo.

Dennis
fuente
3
Que es eso....?
J Atkin
1
¿Qué codificación usa esto? No se parece a UTF-8 o ISO-8859
Downgoat
2
@Downgoat No lo es. Jelly usa su propia codificación personalizada. El código fuente se puede proporcionar en UTF-8 o como un archivo binario.
Dennis
2
@Timwi lo suficientemente justo. He agregado ambos a la publicación.
Dennis
2
En defensa de Dennis: dado que Jelly usa menos de 256 caracteres, uno podría definir trivialmente una bifurcación de Jelly que solo usa caracteres ANSI. La única diferencia sería la legibilidad y la facilidad de recordar lo que hace cada función.
Adám
8

JavaScript ES6, 98 92 67 64 bytes

Guardado 3 bytes gracias a @Downgoat, 3 más gracias a @ user81655

Encontré una versión mucho, mucho más corta, abandonando el ciclo de recursión:

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

Probablemente la parte más interesante de este programa es la replacefunción:

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.

Fragmento de prueba

(tomado de aquí )

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>

ETHproducciones
fuente
Se va a ahorrar unos pocos bytes de utilizar una función para .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))"). También podría ahorrar algunos bytes usando recursividad
Downgoat
@Downgoat Gracias! Probé un .replaceen la cadena antes de evaluarlo, pero resultó más largo.
ETHproductions
También recuerde que puede convertirlo en una función anónima, omitiendoh=
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ Gracias por las sugerencias, pero eso no funcionará, porque necesita llamarse a sí mismo.
ETHproductions
Gah! No vi la recursión. Soy un idiota> _ <
Conor O'Brien
6

CJam, 21 19 bytes

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

Pruébalo aquí.

Explicación

Un caso muy raro de módulo negativo resulta útil. :)

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
fuente
¿Parece que otro podría estar fallando por 153? ¿Parece extraño que 3 de las 4 respuestas principales tengan el mismo problema? cjam.aditsu.net/…
dana
4

Rubí, 35 + 1 = 36

Con el indicador de línea de comando p, ejecute

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

Explicación:

El indicador -p crea un bucle, almacenando la entrada y la salida eventual en la variable $_. '%x'realiza la conversión hexadecimal, tr!realiza la sustitución de dígitos y devuelve un valor falsey si no hubiera nada que cambiar. rehacer comienza de nuevo con lo nuevo $_.

histocrat
fuente
4

Julia, 78 74 bytes

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

Esta es una función recursiva que acepta un número entero y devuelve una cadena.

Sin golf:

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.
fuente
4

MATL , 23 25 bytes

Descargo de responsabilidad

Mientras escribía esta respuesta, noté un error en la dec2basefunción de MATL , lo corregí y lancé una nueva versión con la corrección (así como un par de otros cambios acumulados y no relacionados) .

Como estoy usando una versión posterior a este desafío, según el consenso sobre Meta, esta respuesta no es elegible para ganar .

Código

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

Ejemplo

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

Explicación

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
fuente
¡Podrías escribir una respuesta en la versión anterior del idioma!
lirtosiast el
@ThomasKwa El problema es que en la versión anterior el compilador tiene un error. Lo corregí en la nueva versión, que tangencialmente incluye algunas características nuevas (no relacionadas)
Luis Mendo
3

Dyalog APL, 37 36 33 bytes

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

Gracias a Adám y ngn por sus sugerencias. Me quedo en 16⊥⍣¯1⊢⍵lugar de ⍵⊤⍨⍴⍨16: es un byte adicional, pero nos permite operar con números de tamaño arbitrario en lugar de 64 bits.

halcón vacío
fuente
-2 eligiendo las funciones de desigualdad adecuadas:{∧/9≥X←16⊥⍣¯1⊢⍵:10⊥X⋄∇10⊥10|X+9<X}
Adám
1
o incluso más corto: 10⊥10|X+10≤X-> 10(⊣⊥|+≤)X(técnicamente no es equivalente, pero funciona para dígitos hexadecimales)
ngn
1
16⊥⍣¯1⊢⍵->⍵⊤⍨⍴⍨16
NGN
2

Python, 118105 bytes

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
fuente
2

PHP, 140 126 122 114 112 87 o 84 bytes (incluyendo -r)

No estoy completamente seguro de cómo funcionan las reglas en torno a esto, ya que este es mi primer intento de codegolf, pero el código se puede ejecutar php -rsin necesidad <?y?>

Código

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

Formateado

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

Código alternativo (usando argv en lugar de stdin)

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

Formateado

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

Notas

Edición 1: corté una llamada para intval()guardar 14 caracteres ya que PHP felizmente tratará las cadenas numéricas como números.
Edición 2: eliminé \nde la salida que olvidé eliminar después de la prueba, y eliminé las comillas del eco final para guardar un total de 4 caracteres.
Datos 3: Se ha eliminado la última llamada a intval()
editar 4: Guardado 2 bytes mediante la eliminación de las comillas de la línea de expresiones regulares
Editar 5: Se ha cambiado [a-f]a \Dahorrar 3 caracteres, se quitó strvalllamada desde preg_replacehace 8 más; Se agregó una versión que usa en argv[]lugar de STDIN, movió el terminador de bucle a la instrucción while (¡Uy!) guardando 11 caracteres más, y movió la llamada de Dechex a la subjectpartepreg_replacepara otros 3, haciendo un total de 25; También se agregó una versión sin stdin como una versión alternativa que usa 3 caracteres menos. Gracias por la ayuda, @Blackhole

Jase
fuente
Bienvenido a Code Golf! Dado que los archivos sin etiquetas de apertura son archivos PHP válidos, siempre contamos las etiquetas en PHP (o, alternativamente, contamos los dos bytes para la -ropción). Pero un líder ;siempre es más corto que un líder ?>, así que no lo olvide. Por cierto, aquí hay un código más corto: for($a=$argv[1];$b!=$a;)$a=preg_replace('#\D#e','ord($0)-96',$b=dechex($a));echo$b;(-29 bytes).
Blackhole
La entrada 153debe dar 63, no 99. Pero -res gratis. (ver codegolf.meta.stackexchange.com/a/2428/55735 )
Tito
2

R , 106 103 102 bytes

-3 bytes usando en iflugar dewhile

-1 byte gracias a Giuseppe usando en as.doublelugar 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}

Pruébalo en línea!

Simplemente agregue a(your_integer_here)al TIO para ver el resultado.

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

Utilicé la recursión para volver a aplicar la función a cada iteración sucesiva, con la condición de que no encuentre ninguna de las letras 'abcdef' dentro de la cadena, cuando esta condición es False, genera el resultado como una cadena. La mejor parte fue mi descubrimiento de la chartrfunción, que me permite intercambiar elementos con los elementos correspondientes en una cadena. Esta cadena proviene de la función que obliga al hexadecimal a un formato de cadena.

Editar: intenté usar en sprint("%x",y)lugar de as.hexmode(as.double(y)), pero todavía tengo que usar as.doubleen algún lugar del código, que era 2 1 byte más.

Sumner18
fuente
as.doublees más corto queas.integer
Giuseppe
Hay algunos campos de golf más por hacer, pero estoy en el móvil en este momento. ¡No dude en unirse a nuestro chat de golf R y no olvide consultar (y contribuir) con consejos para jugar golf en R!
Giuseppe
2

05AB1E , 12 bytes

h[Au₂L‡hÐþQ#

Pruébelo en línea o verifique todos los casos de prueba .

Explicación:

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)

ÐþQalternativamente podría ser D.ï( D: Duplicate ;: is_int?) para el mismo conteo de bytes.

Kevin Cruijssen
fuente
1
@MagicOctopusUrn [hÐþQ#Au₂L‡no siempre funciona desafortunadamente. El desafío establece convertir a hexadecimal una vez primero, y luego en cada iteración. Si pego su código en mi conjunto de pruebas, los primeros tres casos de prueba son correctos, pero los dos últimos fallan.
Kevin Cruijssen
2

C # (compilador interactivo de Visual C #) , 92 bytes

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

Pruébalo en línea!

Menos código de 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
fuente
Siguiendo el algo al final de la publicación de la pregunta, 153 tiene que resultar en 63 y no 99, como me parece que su función regresó hace algún tiempo
RosLuP
1
@RosLuP - Lo hice funcionar con ese 153, aunque ahora mi solución es mucho más larga :) Trabajaré para hacerlo más pequeño, pero por ahora al menos está manejando ese caso correctamente.
dana
1

Mathematica, 107 bytes

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

No puedo pensar en más formas de jugar al golf ...

LegionMammal978
fuente
1

Mathematica, 80 bytes

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

Esto usa un buen truco para los bucles while que aprendí de alephalpha. El //.es "aplicar esta regla de sustitución tan a menudo como sea posible". Luego usamos un patrón, l_/;Max@l>9que solo coincide si la lista de dígitos hexadecimales todavía contiene dígitos mayores que 9.

Martin Ender
fuente
1

Japt, 45 40 bytes

Basado en mi respuesta JS:

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

Bastante patético para un lenguaje de golf, ¿eh? Parece que hay muchas personas que se dan cuenta durante este desafío de que sus intérpretes tienen errores, y ahora estoy incluido entre ellos. Esto debería poder hacerse en 30 bytes o menos, pero un error lo hace imposible.

Esto crea una función Hque se puede llamar así:

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

Alternativamente, aquí hay un programa completo, tomando información de STDIN:

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

Pruébalo en línea!

ETHproducciones
fuente
1

GNU Sed (con extensión eval), 44

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

Desearía sedpermitirlo y/A-F/1-6/. Pero no lo hace.

Trauma digital
fuente
1

Python 3, 101 89 bytes

En general, esto es bastante similar a la solución de Boomerang , pero requiere algunos enfoques diferentes para varios aspectos.

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

Esta es la versión ampliada de mi código 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.

Se arrojaron 11 bytes gracias a @pacholik (reemplazando las entrañas del joincon una sola operación que funcionó tanto para dígitos como para letras). Se ajustó otro byte reemplazando el joincon un truco de corte de cuerda que me golpeó en un momento de bombilla (pero que ya existe en las puntas de golf de Python , aunque bajo un encabezado que especifica Python 2).

Tim Pederick
fuente
El joinpuede ser acortado a str(ord(c)%12)for c in n.
pacholik
1

Java, 201 bytes

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
fuente
1

Japt , 21 bytes

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

Pruébalo en línea!

Una mejora significativa sobre la respuesta existente de Japt. No maneja el 153 -> 63caso propuesto en un comentario, pero ninguna de las otras respuestas parece hacerlo, así que lo dejaré a menos que el OP lo aclare.

La salida como una lista de dígitos decimales, podría cambiarse a la salida de un número decimal para 1 byte

Explicación:

ì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
fuente
1

APL (NARS) 104 caracteres, 208 bytes

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}⍵}

prueba:

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

No sé si está bien ... Posiblemente no sea suficiente para la respuesta de calidad estándar ...

RosLuP
fuente
0

En serio, 42 bytes

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

Hex Dump:

31d1bc34a6bb2c24315758be40a8bd40ad3b60bd40
a83b29be3b285c282b2524604dee6a3b293d595758

Pruébalo en línea

Tiene que haber un camino más corto que este, pero esto es lo que obtuve ... (Aquí es donde me encuentro Wrealmente deseando aparecer, ya que es más corto poner un ;derecho antes del último cuando NO lo quieres que poner un Xdespués de CADA W. Aquí, tener Wpop en lugar de peek ahorraría tres bytes).

quintapia
fuente
0

PHP, 71 bytes

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

Ejecutar como tubería -nRo probarlo en línea .

Produce una advertencia para algunas entradas en PHP 7.1 y posterior; reemplazar -con !=para arreglar.
Produce otra advertencia en PHP 7.2; poner abcdefcomillas para arreglar.

Titus
fuente