Hexadezimal und das Alphabet

45

In dieser Herausforderung erhalten Sie eine Eingabe, wandeln sie in Hexadezimalwerte um, nehmen einige Änderungen vor und geben das Ergebnis aus.

Da es sich nur um 16 hexadezimale Zeichen handelt, muss Ihr Code so kurz wie möglich sein.


Beispiele

Beispiele werden durch eine Leerzeile getrennt. Die erste Zeile wird eingegeben, die zweite Zeile zeigt die Schritte, die dritte Zeile zeigt die Ausgabe

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

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

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

Schritte

Die Eingabe ist immer eine positive Ganzzahl


Um die Ausgabe zu generieren, gehen Sie folgendermaßen vor:

  1. Konvertieren Sie die Eingabe in hexadezimal
  2. Ersetzen Sie alle Buchstaben mit ihrem Index im Alphabet (zB a -> 1, b -> 2)
  3. Konvertieren Sie das Ergebnis zurück in hexadezimal
  4. Wenn das Ergebnis Buchstaben enthält, fahren Sie mit Schritt 2 fort. Wenn nicht, geben Sie das Ergebnis aus

Das ist also gewinnt der kürzeste Code in Bytes!

Downgoat
quelle
27
+1 für die Begründung "Da es sich nur um 16 hexadezimale Zeichen handelt, muss Ihr Code so kurz wie möglich sein."
Katze
1
Ein Testfall, der eine Nullstelle durchläuft (ein wichtiger Randfall für meinen aktuellen Ansatz):749699 -> B7083 -> 27083 -> 69CB -> 6932 -> 1B14 -> 1214 -> 4BE -> 425 -> 1A9 -> 119 -> 77
Martin Ender
5
Testfall 153. Schritt 1> 99, Schritt 2 -> 99, Schritt 3 -> 63, Ausgabe 63. Richtig?
edc65
Ja, für 153 hatte ich den Code Flow Erklärung nicht gesehen ...
RosLuP
Für das, was es wert ist ... 3 der 4 Antworten geben 99 auf Eingabe 153 und Dennis Seg-Fehler auf der aktuellen Version von Jelly zurück. Ich werde das Testen beenden, während ich weitermache :) Sind wir sicher, dass dieses Beispiel korrekt ist?
Dana

Antworten:

13

Jelly , 18 Bytes

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

Probieren Sie es online!

Die binäre 18-Byte-Version des Quellcodes enthält den xxd-Dump

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

und arbeitet mit dieser Version des Jelly-Interpreters .

Wie es funktioniert

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-to-integer) hätte als Abkürzung für funktionieren sollen ḅ⁵, aber die neueste Version von Jelly zum Zeitpunkt dieses Beitrags hatte einen Fehler, der mich daran hinderte, sie zu verwenden.

Dennis
quelle
3
Was ist das....?
J Atkin
1
Welche Codierung wird verwendet? Es sieht nicht aus wie UTF-8 oder ISO-8859
Downgoat
2
@ Downgoat ist es nicht. Jelly verwendet eine eigene, benutzerdefinierte Codierung. Der Quellcode kann entweder in UTF-8 oder als Binärdatei bereitgestellt werden.
Dennis
2
@ Timwi Fair genug. Ich habe beide zum Beitrag hinzugefügt.
Dennis
2
Zur Verteidigung von Dennis: Da Jelly weniger als 256 Zeichen verwendet, könnte man trivialerweise eine Jelly-Gabel definieren, die nur ANSI-Zeichen verwendet. Der einzige Unterschied besteht in der Lesbarkeit und der einfachen Erinnerung an die einzelnen Funktionen.
Adám
8

JavaScript ES6, 98 92 67 64 Bytes

3 Bytes dank @Downgoat eingespart, 3 weitere dank @ user81655

Es wurde eine viel, viel kürzere Version gefunden, die die Schleife für die Rekursion überflüssig macht:

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

Der wahrscheinlich interessanteste Teil dieses Programms ist die replaceFunktion:

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.

Testschnipsel

(von hier genommen )

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
quelle
Es wird ein paar Bytes speichern für eine Funktion zu verwenden .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))"). Es könnte auch ein paar Bytes mit Rekursion sparen
Downgoat
@ Downgoat Danke! Ich hatte .replacevor dem Auswerten eine an der Saite ausprobiert , aber das stellte sich länger heraus.
ETHproductions
Denken Sie auch daran, dass Sie es zu einer anonymen Funktion machen können, indem Sieh=
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ Danke für die Vorschläge, aber das geht nicht, weil es sich selbst nennen muss.
ETHproductions
Gah! Rekursion nicht gesehen. Ich bin und Idiot> _ <
Conor O'Brien
6

CJam, 21 19 Bytes

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

Teste es hier.

Erläuterung

Ein sehr seltener Fall von negativen Modulo-Ergebnissen ist hilfreich. :)

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
quelle
Sieht aus, als ob ein anderer für 153 ausfallen könnte? Es scheint seltsam, dass 3 der 4 Antworten das gleiche Problem haben würden? cjam.aditsu.net/…
dana
4

Rubin, 35 + 1 = 36

pFühren Sie mit dem Befehlszeilenflag aus

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

Erläuterung:

Das Flag -p erstellt eine Schleife, in der die Eingabe und die eventuelle Ausgabe in der Variablen gespeichert werden $_. '%x'hat die Hex - Konvertierung und tr!hat die Ziffer Substitution und gibt einen Falsey Wert , wenn es nichts zu ändern war. Wiederholen beginnt von vorne mit dem neuen $_.

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

Dies ist eine rekursive Funktion, die eine Ganzzahl akzeptiert und eine Zeichenfolge zurückgibt.

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

MATL , 23 25 Bytes

Haftungsausschluss

Während ich diese Antwort schrieb, bemerkte ich einen Fehler in der dec2baseFunktion von MATL , korrigierte ihn und veröffentlichte eine neue Version mit der Korrektur (sowie ein paar andere akkumulierte, nicht verwandte Änderungen) .

Da ich eine Version verwende, die später als diese Herausforderung ist, ist diese Antwort laut Meta-Konsens nicht gewinnberechtigt .

Code

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

Beispiel

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

Erläuterung

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
quelle
Du könntest eine Antwort in der alten Version der Sprache schreiben!
Lirtosiast
@ThomasKwa Das Problem ist, dass der Compiler in der alten Version einen Fehler hat. Ich habe es in der neuen Version korrigiert, die tangential einige (nicht verwandte) neue Funktionen enthält
Luis Mendo
3

Dyalog APL, 37 36 33 Bytes

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

Danke an Adám und ngn für die Vorschläge. Ich behalte 16⊥⍣¯1⊢⍵stattdessen ⍵⊤⍨⍴⍨16- es ist ein zusätzliches Byte, aber erlaubt uns, mit Zahlen von beliebiger Größe anstatt 64-Bit zu arbeiten.

voidhawk
quelle
-2 durch Auswahl der richtigen Ungleichungsfunktionen:{∧/9≥X←16⊥⍣¯1⊢⍵:10⊥X⋄∇10⊥10|X+9<X}
Adám
1
oder noch kürzer: 10⊥10|X+10≤X-> 10(⊣⊥|+≤)X(technisch nicht äquivalent, funktioniert aber für
hexadezimale
1
16⊥⍣¯1⊢⍵->⍵⊤⍨⍴⍨16
29.
2

Python, 118 105 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))))
Basilikum-Henry
quelle
2

PHP, 140 126 122 114 112 87 oder 84 Bytes (einschließlich -r)

Ich bin mir nicht ganz sicher, wie die Regeln dafür aussehen, da dies mein erster Codegolfversuch ist, aber der Code kann php -rohne <?und ausgeführt werden?>

Code

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

Formatiert

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

Alternativer Code (mit argv anstelle von stdin)

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

Formatiert

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

Anmerkungen

Edit 1: Ich habe einen Aufruf zum intval()Speichern von 14 Zeichen abgeschnitten, da PHP numerische Zeichenfolgen gerne als Zahlen behandelt.
Bearbeiten 2: Ich habe \ndie Ausgabe entfernt, die ich nach dem Testen vergessen habe, und die Anführungszeichen aus dem endgültigen Echo entfernt, um insgesamt 4 Zeichen zu speichern.
Bearbeiten 3: Entfernt der letzte Aufruf intval()
Bearbeiten 4: Saved 2 Bytes durch Anführungszeichen aus der regex Zeile entfernen
Edit 5: Geänderte [a-f]zu \D3 Zeichen zu speichern, entfernt strvalAnruf von preg_replace8 mehr; hinzugefügte Version, die argv[]anstelle von STDIN verwendet, hat den Schleifenabschluss in die while-Anweisung verschoben (oops!) und 11 weitere Zeichen gespart und den Dechex-Aufruf in den subjectTeil von verschobenpreg_replacefür weitere 3 ergibt sich eine Summe von 25; Außerdem wurde eine Nicht-Standard-Version als alternative Version hinzugefügt, die 3 Zeichen weniger verwendet. Danke für die Hilfe, @Blackhole

Jase
quelle
Willkommen bei Code Golf! Da Dateien ohne öffnende Tags gültige PHP-Dateien sind, zählen wir die Tags immer in PHP (oder alternativ zählen wir die zwei Bytes für die -rOption). Aber ein Lead ;ist immer kürzer als ein Lead ?>, also vergiss es nicht. Hier ist übrigens ein kürzerer Code: for($a=$argv[1];$b!=$a;)$a=preg_replace('#\D#e','ord($0)-96',$b=dechex($a));echo$b;(-29 Bytes).
Blackhole
Input 153sollte geben 63, nicht 99. Ist -raber kostenlos. (siehe codegolf.meta.stackexchange.com/a/2428/55735 )
Titus
2

R , 106 103 102 Bytes

-3 Bytes mit ifanstelle vonwhile

-1 Byte dank Giuseppe mit as.doubleanstelle vonas.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}

Probieren Sie es online!

Fügen Sie einfach a(your_integer_here)den TIO hinzu, um das Ergebnis zu sehen.

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

Ich habe die Funktion mithilfe der Rekursion erneut auf jede nachfolgende Iteration angewendet, unter der Bedingung, dass keiner der Buchstaben 'abcdef' in der Zeichenfolge gefunden wird. Wenn diese Bedingung "False" ist, wird das Ergebnis als Zeichenfolge ausgegeben. Der beste Teil war meine Entdeckung der chartrFunktion, die es mir ermöglicht, Elemente mit entsprechenden Elementen in einem String zu tauschen. Diese Zeichenfolge stammt von der Funktion, die das Hexadezimal in ein Zeichenfolgenformat umwandelt.

Bearbeiten: Ich habe versucht, sprint("%x",y)anstelle von zu verwenden as.hexmode(as.double(y)), aber ich muss immer noch as.doubleirgendwo im Code verwenden, der 2 1 Byte länger war.

Sumner18
quelle
as.doubleist kürzer alsas.integer
Giuseppe
Es gibt noch ein paar Golfplätze, aber ich bin gerade auf dem Handy. Nehmen Sie an unserem R-Golf-Chat teil und vergessen Sie nicht, Tipps zum Golfen in R
Giuseppe
2

05AB1E , 12 Bytes

h[Au₂L‡hÐþQ#

Probieren Sie es online aus oder überprüfen Sie alle Testfälle .

Erläuterung:

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)

ÐþQkönnte alternativ D.ï( D: Duplicate ;: is_int?) für die gleiche Byteanzahl sein.

Kevin Cruijssen
quelle
1
@MagicOctopusUrn [hÐþQ#Au₂L‡funktioniert leider nicht immer. Die Aufforderung lautet, zuerst und dann in jeder Iteration in Hex umzuwandeln. Wenn ich Ihren Code in meine Testsuite einfüge, sind die ersten drei Testfälle korrekt, aber die letzten beiden schlagen fehl.
Kevin Cruijssen
2

C # (Visual C # Interactive Compiler) , 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;}

Probieren Sie es online!

Weniger Golf Code:

// 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
quelle
Nach dem Algo am Ende des
Fragenpostens
1
@RosLuP - Habe es mit 153 zum Laufen gebracht, obwohl meine Lösung jetzt viel länger ist :) Ich werde daran arbeiten, es kleiner zu machen, aber zumindest behandelt es diesen Fall jetzt richtig.
dana
1

Mathematica, 107 Bytes

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

Ich kann mir keine weiteren Möglichkeiten zum Golfen vorstellen ...

LegionMammal978
quelle
1

Mathematica, 80 Bytes

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

Dies verwendet einen ordentlichen Trick für while-Schleifen, die ich aus Alephalpha gelernt habe. Das //.ist "Wende diese Substitutionsregel so oft wie möglich an". Dann verwenden wir ein Muster, l_/;Max@l>9das nur dann zutrifft, wenn die hexadezimale Ziffernliste noch Ziffern enthält, die größer als 9 sind.

Martin Ender
quelle
1

Japt, 45 bis 40 Bytes

Basierend auf meiner Antwort von JS:

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

Ziemlich erbärmlich für eine Golfsprache, oder? Es scheint eine Menge Leute zu geben, die bei dieser Herausforderung bemerken, dass ihre Dolmetscher Fehler haben, und ich gehöre jetzt dazu. Dies sollte in 30 Bytes oder weniger möglich sein, aber ein Fehler macht dies unmöglich.

Dadurch wird eine Funktion erstellt H, die folgendermaßen aufgerufen werden kann:

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

Alternativ ist hier ein vollständiges Programm, das Eingaben von STDIN entgegennimmt:

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

Probieren Sie es online!

ETHproductions
quelle
1

GNU Sed (mit eval extension), 44

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

Ich wünschte, ich sedwürde erlauben y/A-F/1-6/. Aber das tut es nicht.

Digitales Trauma
quelle
1

Python 3, 101 89 Bytes

Insgesamt ist dies der Lösung von Boomerang ziemlich ähnlich , es werden jedoch einige unterschiedliche Ansätze für verschiedene Aspekte verwendet.

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

Dies ist die erweiterte Version meines Originalcodes:

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.

Dank @pacholik wurden 11 Bytes verloren (wobei die Innereien der joindurch eine einzige Operation ersetzt wurden, die sowohl für Ziffern als auch für Buchstaben funktionierte). Ein weiteres Byte wurde abgeschnitten, indem das joindurch einen Trick zum Schneiden von Strings ersetzt wurde, der mich in einem Moment der Glühbirne getroffen hat (der aber bereits in den Python-Golftipps vorhanden ist , wenn auch unter einer Überschrift, die Python 2 angibt).

Tim Pederick
quelle
Die joinkann bis gekürzt werden 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
quelle
1

Japt , 21 Bytes

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

Probieren Sie es online!

Eine signifikante Verbesserung gegenüber der bestehenden Japt-Antwort. Es geht nicht um den 153 -> 63in einem Kommentar vorgeschlagenen Fall, aber keine der anderen Antworten scheint es auch zu geben.

Die Ausgabe als Liste mit Dezimalstellen kann dahingehend geändert werden, dass eine Dezimalzahl für 1 Byte ausgegeben wird

Erläuterung:

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

APL (NARS) 104 Zeichen, 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}⍵}

Prüfung:

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

Ich weiß nicht, ob es in Ordnung ist ... Möglicherweise reicht es nicht für die Standardqualitätsantwort ...

RosLuP
quelle
0

Im Ernst, 42 Bytes

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

Hex Dump:

31d1bc34a6bb2c24315758be40a8bd40ad3b60bd40
a83b29be3b285c282b2524604dee6a3b293d595758

Probieren Sie es online aus

Es muss einen kürzeren Weg als diesen geben, aber das ist, was ich bekommen habe ... (Hier möchte ich Wtatsächlich auftauchen, da es kürzer ist, ein ;Rechts vor dem letzten zu setzen, wenn Sie es NICHT wollen als um ein Xnach JEDEM zu setzen W. Hier Wwürde es drei Bytes sparen , wenn man Pop anstelle von Peek hat.)

Quintopie
quelle
0

Japt, 18 Bytes

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

Versuch es

Zottelig
quelle
0

PHP, 71 Bytes

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

Laufen Sie als Pipe mit -nRoder probieren Sie es online aus .

Gibt eine Warnung für einige Eingaben in PHP 7.1 und höher aus. ersetzen -mit !=zu reparieren.
Gibt eine weitere Warnung in PHP 7.2 aus; setzen abcdefin Anführungszeichen zu beheben.

Titus
quelle