Esadecimale e l'alfabeto


45

In questa sfida, riceverai un input, lo convertirai in esadecimale, apporterai un paio di modifiche e otterrai il risultato.

Poiché sono solo 16 caratteri in esadecimali, il codice dovrà essere il più corto possibile.


Esempi

Gli esempi sono separati da una linea vuota. Viene immessa la prima riga, la seconda riga mostra i passaggi, la terza mostra l'output

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

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

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

passi

L'input sarà sempre un numero intero positivo


Per generare l'output seguirai i seguenti passi:

  1. Converti l'input in esadecimale
  2. Sostituisci le lettere con il loro indice nell'alfabeto (es. a -> 1, b -> 2)
  3. Converti il ​​risultato in esadecimale
  4. Se il risultato contiene lettere, andare al passaggio 2. In caso contrario, emettere il risultato

Questo è quindi vince il codice più breve in byte!


27
+1 per la giustificazione "Poiché sono solo 16 caratteri in formato esadecimale, il codice dovrà essere il più corto possibile."
cat

1
Un caso di test che passa attraverso una cifra zero (che è un importante caso limite per il mio approccio attuale):749699 -> B7083 -> 27083 -> 69CB -> 6932 -> 1B14 -> 1214 -> 4BE -> 425 -> 1A9 -> 119 -> 77
Martin Ender,

5
Caso di prova 153. Passaggio 1> 99, Passaggio 2 -> 99, Passaggio 3 -> 63, uscita 63. Corretto?
edc65,

Sì per 153 non avevo visto la spiegazione del codice Flow ...
RosLuP

Per quello che vale ... 3 delle 4 migliori risposte restituiscono 99 sull'input 153 e i seg-falli di Dennis sull'attuale versione di Jelly. Ho intenzione di abbandonare i test mentre sono avanti :) Siamo sicuri che l'esempio sia corretto?
Dana,

Risposte:


13

Gelatina , 18 byte

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

Provalo online!

La versione binaria a 18 byte del codice sorgente ha il dump xxd

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

e funziona con questa versione dell'interprete Jelly .

Come funziona

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.

(da decimale a intero) avrebbe dovuto funzionare come scorciatoia ḅ⁵, ma l'ultima versione di Jelly al momento di questo post aveva un bug che mi impediva di usarlo.


3
Cos'è quello....?
J Atkin,

1
Quale codifica utilizza? Non sembra UTF-8 o ISO-8859
Downgoat il

2
@Downgoat Non lo è. Jelly utilizza la propria codifica personalizzata. Il codice sorgente può essere fornito in UTF-8 o come file binario.
Dennis,

2
@Timwi abbastanza giusto. Ho aggiunto entrambi al post.
Dennis,

2
A difesa di Dennis: poiché Jelly utilizza meno di 256 caratteri, si potrebbe definire banalmente un fork di Jelly che utilizza solo caratteri ANSI. L'unica differenza sarebbe la leggibilità e la facilità di ricordare cosa fa ogni funzione.
Adám,

8

JavaScript ES6, 98 92 67 64 byte

Salvato 3 byte grazie a @Downgoat, altri 3 grazie a @ user81655

Ho trovato una versione molto, molto più breve, abbandonando il loop per la ricorsione:

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

Probabilmente la parte più interessante di questo programma è la replacefunzione:

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.

Test snippet

(preso da qui )

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>


Sarà risparmiare pochi byte di utilizzare una funzione per .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))"). Potrebbe anche salvare alcuni byte usando la ricorsione
Downgoat

@Downgoat Grazie! Avevo provato a .replacesulla stringa prima di valutarla, ma quello si è rivelato più a lungo.
ETHproductions

Ricorda anche che puoi renderlo una funzione anonima, omettendoh=
Conor O'Brien il

@ CᴏɴᴏʀO'Bʀɪᴇɴ Grazie per i suggerimenti, ma non funzionerà, perché deve chiamarsi.
ETHproductions

Gah! Non ho visto la ricorsione. Sono e idiota> _ <
Conor O'Brien il

6

CJam, 21 19 byte

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

Provalo qui.

Spiegazione

Un caso molto raro di risultati negativi del modulo risulta 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

Sembra che un altro potrebbe non riuscire per 153? Sembra strano che 3 delle 4 migliori risposte abbiano lo stesso problema? cjam.aditsu.net/…
dana

4

Rubino, 35 + 1 = 36

Con flag della riga di comando p, eseguire

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

Spiegazione:

Il flag -p crea un loop, memorizzando l'input e l'eventuale output nella variabile $_. '%x'fa la conversione esadecimale, tr!fa la sostituzione della cifra e restituisce un valore di falso se non c'è nulla da cambiare. rifare ricomincia da capo con il nuovo $_.


4

Julia, 78 74 byte

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

Questa è una funzione ricorsiva che accetta un numero intero e restituisce una stringa.

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

4

MATL , 23 25 byte

Clausola di esclusione della responsabilità

Mentre scrivevo questa risposta ho notato un bug nella dec2basefunzione di MATL , l'ho corretto e rilasciato una nuova versione con la correzione (così come un paio di altre modifiche accumulate, non correlate) .

Dal momento che sto usando una versione successiva a questa sfida, secondo il consenso su Meta questa risposta non è idonea a vincere .

Codice

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

Esempio

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

Spiegazione

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        

Potresti scrivere una risposta nella vecchia versione della lingua!
lirtosiast,

@ThomasKwa Il problema è che nella vecchia versione il compilatore ha un bug. L'ho corretto nella nuova versione, che include tangenzialmente alcune nuove funzionalità (non correlate)
Luis Mendo,

3

Dyalog APL, 37 36 33 byte

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

Grazie ad Adám e ngn per i suggerimenti. Sto mantenendo 16⊥⍣¯1⊢⍵invece ⍵⊤⍨⍴⍨16- è un byte extra, ma ci consente di operare su numeri di dimensioni arbitrarie anziché a 64 bit.


-2 scegliendo le giuste funzioni di disuguaglianza:{∧/9≥X←16⊥⍣¯1⊢⍵:10⊥X⋄∇10⊥10|X+9<X}
Adám

1
o anche più breve: 10⊥10|X+10≤X-> 10(⊣⊥|+≤)X(tecnicamente non equivalente, ma funziona con cifre esadecimali)
ngn

1
16⊥⍣¯1⊢⍵->⍵⊤⍨⍴⍨16
ngn

2

Python, 118 105 byte

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))))

2

PHP, 140 126 122 114 112 87 o 84 byte (incluso -r)

Non sono del tutto sicuro di come le regole intorno a questo in quanto questo è il mio primo tentativo di codegolf, ma il codice può essere eseguito php -rsenza bisogno <?e?>

Codice

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

formattato

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

Codice alternativo (usando argv invece di stdin)

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

formattato

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

Appunti

Modifica 1: ho tagliato una chiamata per intval()salvare 14 caratteri poiché PHP tratterà felicemente le stringhe numeriche come numeri.
Modifica 2: ho rimosso \ndall'output che ho dimenticato di rimuovere dopo il test e rimosso le virgolette dall'eco finale per salvare un totale di 4 caratteri.
Edit 3: Rimosso l'ultima chiamata per intval()
Edit 4: Salvato 2 byte, eliminando virgolette dalla linea regex
Edit 5: cambiato [a-f]per \Dsalvare 3 caratteri, rimosso strvalchiamata da preg_replaceper altri 8; aggiunta la versione che utilizza al argv[]posto di STDIN, spostato il terminatore del ciclo nell'istruzione while (oops!) salvando altri 11 caratteri e spostando la chiamata dechex nella subjectparte dipreg_replaceper altri 3, per un totale di 25; aggiunta anche una versione non stdin come versione alternativa che utilizza 3 caratteri in meno. Grazie per l'aiuto, @Blackhole


Benvenuto su Code Golf! Poiché i file senza tag di apertura sono file PHP validi, contiamo sempre i tag in PHP (o, in alternativa, contiamo i due byte per l' -ropzione). Ma un leader ;è sempre più corto di un leader ?>, quindi non dimenticarlo. A proposito, ecco un codice più breve: for($a=$argv[1];$b!=$a;)$a=preg_replace('#\D#e','ord($0)-96',$b=dechex($a));echo$b;(-29 byte).
Blackhole,

L'input 153dovrebbe dare 63, no 99. Ma -rè gratis. (vedi codegolf.meta.stackexchange.com/a/2428/55735 )
Tito

2

R , 106 103 102 byte

-3 byte usando ifinvece diwhile

-1 byte grazie a Giuseppe che utilizza as.doubleinvece dias.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}

Provalo online!

Basta aggiungere a(your_integer_here)al TIO per vedere il risultato.

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

Ho usato la ricorsione per riapplicare la funzione a ogni iterazione successiva, a condizione che non trovi nessuna delle lettere 'abcdef' all'interno della stringa, quando questa condizione è False, genera il risultato come stringa. La parte migliore è stata la mia scoperta della chartrfunzione, che mi consente di scambiare elementi con elementi corrispondenti in una stringa. Questa stringa deriva dalla funzione che unisce l'esadecimale in un formato stringa.

Modifica: ho provato a utilizzare sprint("%x",y)invece di as.hexmode(as.double(y)), ma mi viene comunque richiesto di utilizzare as.doubleda qualche parte nel codice, che era più lungo di 2 1 byte.


as.doubleè più corto dias.integer
Giuseppe,

Ci sono altri campi da golf da fare, ma al momento sono sul cellulare. Sentiti libero di unirti alla nostra chat di golf R e non dimenticare di dare un'occhiata (e contribuire a) suggerimenti per giocare a golf in R!
Giuseppe,

2

05AB1E , 12 byte

h[Au₂L‡hÐþQ#

Provalo online o verifica tutti i casi di test .

Spiegazione:

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)

ÐþQpotrebbe in alternativa essere D.ï( D: Duplicate ;: is_int?) per lo stesso conteggio byte.


1
@MagicOctopusUrn [hÐþQ#Au₂L‡non sempre funziona purtroppo. La sfida afferma di convertire prima in esadecimale, quindi in ogni iterazione. Se incollo il codice nella mia suite di test, i primi tre casi di test sono corretti, ma gli ultimi due falliscono.
Kevin Cruijssen,

2

C # (compilatore interattivo Visual C #) , 92 byte

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

Provalo online!

Meno codice 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;
}

Seguendo l'algo alla fine del post della domanda, 153 deve risultare in 63 e non in 99 come mi sembra che la tua funzione sia tornata da tempo
RosLuP

1
@RosLuP - Ha funzionato con quel 153, anche se ora la mia soluzione è molto più lunga :) Lavorerò per rimpicciolirla, ma per ora almeno sta gestendo correttamente quel caso.
dana,

1

Mathematica, 107 byte

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

Non riesco a pensare ad altri modi per giocare a golf ...


1

Mathematica, 80 byte

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

Questo usa un trucco accurato per i cicli che ho imparato da alephalpha. Il //.è "applicare questa regola di sostituzione più spesso possibile". Quindi usiamo un modello, l_/;Max@l>9che corrisponde solo se l'elenco delle cifre esadecimali contiene ancora cifre maggiori di 9.


1

Japt, 45 40 byte

Sulla base della mia risposta JS:

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

Abbastanza patetico per un linguaggio da golf, eh? Sembra che ci siano molte persone che si rendono conto durante questa sfida che i loro interpreti hanno dei bug, e ora sono incluso tra loro. Questo dovrebbe essere fatto in 30 byte o meno, ma un errore lo rende impossibile.

Questo crea una funzione Hche può essere chiamata così:

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

In alternativa, ecco un programma completo, prendendo input da STDIN:

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

Provalo online!


1

GNU Sed (con estensione eval), 44

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

Vorrei sedpermettere y/A-F/1-6/. Ma non lo fa.


1

Python 3, 101 89 byte

Nel complesso, questo è abbastanza simile alla soluzione di Boomerang , ma richiede alcuni approcci diversi a vari aspetti.

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

Questa è la versione estesa del mio codice originale:

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 byte sono stati versati grazie a @pacholik (sostituendo le parti interne del joincon una singola operazione che ha funzionato sia per le cifre che per le lettere). Un altro byte è stato eliminato sostituendo il joincon un trucco per tagliare le corde che mi ha colpito in un momento di lampadina (ma che esiste già nelle punte del golf di Python , anche se sotto un'intestazione che specifica Python 2).


È joinpossibile abbreviare str(ord(c)%12)for c in n.
Pacholik,

1

Java, 201 byte

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

1

Japt , 21 byte

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

Provalo online!

Un miglioramento significativo rispetto all'attuale risposta di Japt. Non tratta il 153 -> 63caso proposto in un commento, ma nessuna delle altre risposte sembra farlo, quindi lo lascerò a meno che il PO non chiarisca.

L'output come un elenco di cifre decimali può essere modificato in output di un numero decimale per 1 byte

Spiegazione:

ì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

1

APL (NARS) 104 caratteri, 208 byte

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

test:

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

Non so se va bene ... Possibile che non sia sufficiente per la risposta di qualità standard ...


0

Scherzi a parte, 42 byte

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

Dump esadecimale:

31d1bc34a6bb2c24315758be40a8bd40ad3b60bd40
a83b29be3b285c282b2524604dee6a3b293d595758

Provalo online

Deve esserci un modo più breve di questo, ma questo è quello che ho ottenuto ... (Questo è dove mi trovo a desiderare Wdavvero di essere scoppiato, poiché è più breve mettere un ;diritto prima dell'ultimo quando NON lo vuoi che per mettere un Xdopo OGNI W. Qui, avere Wpop invece di sbirciata salverebbe tre byte.)



0

PHP, 71 byte

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

Esegui come pipe -nRo provalo online .

Fornisce un avviso per alcuni input in PHP 7.1 e versioni successive; sostituire -con !=per risolvere.
Fornisce un altro avviso in PHP 7.2; mettere abcdeftra virgolette per risolvere.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.