Heksadesimal dan Alfabet

45

Dalam tantangan ini, Anda akan menerima input, mengonversinya menjadi heksadesimal, membuat beberapa perubahan, dan menghasilkan hasilnya.

Karena mereka hanya 16 karakter dalam heksadesimal, kode Anda harus sesingkat mungkin.


Contohnya

Contoh dipisahkan oleh garis kosong. Baris pertama adalah input, baris kedua menunjukkan langkah-langkah, ketiga menunjukkan 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

Langkah

Masukan akan selalu berupa bilangan bulat positif


Untuk menghasilkan output, Anda akan mengikuti langkah-langkah berikut:

  1. Ubah input menjadi heksadesimal
  2. Ganti huruf apa saja dengan indeksnya dalam alfabet (mis. a -> 1, b -> 2)
  3. Ubah hasilnya kembali menjadi heksadesimal
  4. Jika hasilnya berisi huruf apa saja, lanjutkan ke langkah 2. Jika tidak, hasilkan hasilnya

Ini adalah sehingga kode terpendek dalam byte menang!

Downgoat
sumber
27
+1 untuk pembenaran "Karena mereka hanya 16 karakter dalam heksadesimal, kode Anda harus sesingkat mungkin."
kucing
1
Sebuah test case yang melewati angka nol (yang merupakan edge case yang penting untuk pendekatan saya saat ini):749699 -> B7083 -> 27083 -> 69CB -> 6932 -> 1B14 -> 1214 -> 4BE -> 425 -> 1A9 -> 119 -> 77
Martin Ender
5
Test case 153. Langkah 1> 99, Langkah 2 -> 99, Langkah 3 -> 63, keluaran 63. Benar?
edc65
Ya untuk 153 saya belum melihat penjelasan kode Aliran ...
RosLuP
Untuk apa nilainya ... 3 dari 4 jawaban teratas mengembalikan 99 pada input 153 dan kesalahan Seg pada versi Jelly saat ini. Saya akan berhenti pengujian saat saya berada di depan :) Apakah kami yakin contoh itu benar?
dana

Jawaban:

13

Jelly , 18 byte

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

Cobalah online!

Biner, versi 18 byte dari kode sumber memiliki dump xxd

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

dan bekerja dengan versi penerjemah Jelly ini .

Bagaimana itu bekerja

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) seharusnya berfungsi sebagai singkatan ḅ⁵, tetapi versi terbaru Jelly pada saat posting ini memiliki bug yang mencegah saya menggunakannya.

Dennis
sumber
3
Apa itu....?
J Atkin
1
Pengkodean apa yang digunakan ini? Itu tidak terlihat seperti UTF-8, atau ISO-8859
Downgoat
2
@Downgoat Tidak. Jelly menggunakan pengodeannya sendiri. Kode sumber dapat diberikan dalam UTF-8 atau sebagai file biner.
Dennis
2
@Imwi Cukup adil. Saya telah menambahkan keduanya ke pos.
Dennis
2
Dalam membela Dennis: karena Jelly menggunakan kurang dari 256 karakter, orang dapat dengan sepele mendefinisikan garpu Jelly yang hanya menggunakan karakter ANSI. Satu-satunya perbedaan adalah keterbacaan dan kemudahan mengingat apa fungsi masing-masing.
Adem
8

JavaScript ES6, 98 92 67 64 byte

Disimpan 3 byte berkat @Downgoat, 3 lainnya terima kasih ke @ user81655

Menemukan versi yang jauh, jauh lebih pendek, membuang loop untuk rekursi:

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

Mungkin bagian yang paling menarik dari program ini adalah replacefungsinya:

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.

Cuplikan tes

(diambil dari sini )

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>

Produksi ETH
sumber
Ini akan menghemat beberapa byte menggunakan fungsi untuk .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))"). Mungkin juga menghemat beberapa byte menggunakan rekursi
Downgoat
@Downgoat Terima kasih! Saya sudah mencoba .replacestring sebelum mengevaluasi, tetapi ternyata lebih lama.
ETHproduksi
Juga ingat Anda dapat menjadikannya fungsi anonim, menghilangkanh=
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ Terima kasih atas sarannya, tetapi itu tidak akan berhasil, karena perlu memanggil dirinya sendiri.
ETHproduksi
Gah! Tidak melihat rekursi. Saya dan idiot> _ <
Conor O'Brien
6

CJam, 21 19 byte

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

Uji di sini.

Penjelasan

Kasus yang sangat jarang dari hasil modulo negatif sangat membantu. :)

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
sumber
Sepertinya ada yang gagal untuk 153? Tampaknya aneh bahwa 3 dari 4 jawaban teratas akan memiliki masalah yang sama? cjam.aditsu.net/…
dana
4

Ruby, 35 + 1 = 36

Dengan bendera baris perintah p, jalankan

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

Penjelasan:

Bendera -p membuat loop, menyimpan input dan output akhirnya dalam variabel $_. '%x'melakukan konversi hex, dan tr!melakukan penggantian digit dan mengembalikan nilai falsey jika tidak ada yang berubah. ulang dimulai dengan yang baru $_.

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

Ini adalah fungsi rekursif yang menerima integer dan mengembalikan string.

Tidak Disatukan:

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

MATL , 23 25 byte

Penolakan

Saat menulis jawaban ini, saya perhatikan ada bug di dec2basefungsi MATL , memperbaikinya, dan merilis versi baru dengan koreksi (serta beberapa akumulasi perubahan yang tidak terkait lainnya) .

Karena saya menggunakan versi yang lebih lama dari tantangan ini, menurut konsensus di Meta jawaban ini tidak memenuhi syarat untuk menang .

Kode

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

Contoh

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

Penjelasan

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
sumber
Anda dapat menulis jawaban dalam versi bahasa yang lama!
lirtosiast
@ThomasKwa Masalahnya adalah bahwa dalam versi lama kompiler memiliki bug. Saya memperbaikinya dalam versi baru, yang secara tangensial menyertakan beberapa fitur baru (yang tidak terkait)
Luis Mendo
3

Dyalog APL, 37 36 33 byte

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

Terima kasih kepada Adám dan ngn untuk saran. Saya menjaga 16⊥⍣¯1⊢⍵bukan ⍵⊤⍨⍴⍨16- itu byte tambahan, tetapi memungkinkan kita untuk beroperasi pada jumlah ukuran yang sewenang-wenang daripada 64-bit.

voidhawk
sumber
-2 dengan memilih fungsi ketimpangan yang tepat:{∧/9≥X←16⊥⍣¯1⊢⍵:10⊥X⋄∇10⊥10|X+9<X}
Adám
1
atau bahkan lebih pendek: 10⊥10|X+10≤X-> 10(⊣⊥|+≤)X(secara teknis tidak setara, tetapi berfungsi untuk digit hex)
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))))
basile-henry
sumber
2

PHP, 140 126 122 114 112 87 atau 84 byte (termasuk -r)

Tidak sepenuhnya yakin tentang bagaimana aturan di sekitar ini karena ini adalah upaya codegolf pertama saya, tetapi kode dapat dijalankan php -rtanpa perlu <?dan?>

Kode

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

Diformat

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

Kode Alternatif (menggunakan argv bukan stdin)

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

Diformat

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

Catatan

Sunting 1: Saya memotong panggilan intval()untuk menyimpan 14 karakter karena PHP akan dengan senang hati memperlakukan string numerik sebagai angka.
Sunting 2: Saya menghapus \ndari output yang saya lupa hapus setelah pengujian, dan menghapus tanda kutip dari gema akhir untuk menyimpan total 4 karakter.
Sunting 3: Menghapus panggilan terakhir ke intval()
Sunting 4: Disimpan 2 byte dengan menghapus tanda kutip dari garis regex
Sunting 5: Diubah [a-f]menjadi \Duntuk menyimpan 3 karakter, strvalpanggilan dihapus dari preg_replaceuntuk 8 lebih; menambahkan versi yang menggunakan argv[]bukannya STDIN, memindahkan terminator loop ke pernyataan while (oops!) menyimpan 11 karakter lebih banyak, dan memindahkan panggilan dechex ke subjectbagian daripreg_replaceuntuk 3 lainnya, membuat total 25; juga menambahkan versi non-stdin sebagai versi alternatif yang menggunakan 3 karakter lebih sedikit. Terima kasih atas bantuannya, @Blackhole

Jase
sumber
Selamat datang di Golf Code! Karena file tanpa tag pembuka adalah file PHP yang valid, kami selalu menghitung tag dalam PHP (atau sebagai alternatif, kami menghitung dua byte untuk -ropsi). Tapi seorang pemimpin ;selalu lebih pendek dari seorang pemimpin ?>, jadi jangan lupakan itu. Ngomong-ngomong, ini adalah kode yang lebih pendek: for($a=$argv[1];$b!=$a;)$a=preg_replace('#\D#e','ord($0)-96',$b=dechex($a));echo$b;(-29 byte).
Blackhole
Masukan 153harus memberi 63, bukan 99. Tetapi -rgratis. (lihat codegolf.meta.stackexchange.com/a/2428/55735 )
Titus
2

R , 106 103 102 byte

-3 byte dengan menggunakan ifbukanwhile

-1 byte berkat Giuseppe menggunakan as.doublebukanas.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}

Cobalah online!

Cukup tambahkan a(your_integer_here)ke TIO untuk melihat hasilnya.

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

Saya menggunakan rekursi untuk menerapkan kembali fungsi ke setiap iterasi berturut-turut, dengan syarat tidak menemukan huruf 'abcdef' di dalam string, ketika kondisi ini False, output hasilnya sebagai string. Bagian terbaiknya adalah penemuan chartrfungsi saya, yang memungkinkan saya untuk menukar elemen dengan elemen terkait dalam string. String ini berasal dari fungsi yang memaksa heksadesimal menjadi format string.

Sunting: Saya mencoba menggunakan sprint("%x",y)alih-alih as.hexmode(as.double(y)), tetapi saya masih diharuskan untuk menggunakan as.doublesuatu tempat dalam kode, yang lebih panjang 2 1 byte.

Sumner18
sumber
as.doublelebih pendek darias.integer
Giuseppe
Ada beberapa golf yang harus dilakukan tetapi saya sedang mobile saat ini. Jangan ragu untuk bergabung dengan obrolan golf R kami dan jangan lupa untuk melihat (dan berkontribusi pada) kiat untuk bermain golf di R!
Giuseppe
2

05AB1E , 12 byte

h[Au₂L‡hÐþQ#

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

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)

ÐþQalternatifnya bisa D.ï( D: Gandakan ;: is_int?) untuk jumlah byte yang sama.

Kevin Cruijssen
sumber
1
@MagicOctopusUrn [hÐþQ#Au₂L‡tidak selalu bekerja sayangnya. Negara menyatakan untuk mengonversi ke hex satu kali pertama, dan kemudian di setiap iterasi. Jika saya menempelkan kode Anda di suite pengujian saya, tiga kasus pengujian pertama sudah benar, tetapi dua yang terakhir gagal.
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;}

Cobalah online!

Lebih sedikit kode 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
sumber
Mengikuti algo di akhir posting pertanyaan, 153 harus menghasilkan 63 dan bukan 99 seperti yang menurut saya fungsi Anda beberapa waktu lalu kembali
RosLuP
1
@RosLuP - Dapat digunakan dengan 153, meskipun sekarang solusi saya jauh lebih lama :) Saya akan berusaha membuatnya lebih kecil, tetapi untuk sekarang setidaknya menangani kasus itu dengan benar.
dana
1

Mathematica, 107 byte

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

Tidak dapat memikirkan cara lain untuk bermain golf ini ...

LegionMammal978
sumber
1

Mathematica, 80 byte

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

Ini menggunakan trik yang rapi untuk loop-sementara yang saya pelajari dari alephalpha. The //.adalah "menerapkan aturan substitusi ini sesering mungkin". Kemudian kami menggunakan pola, l_/;Max@l>9yang hanya cocok jika daftar digit heksadesimal masih mengandung digit lebih besar dari 9.

Martin Ender
sumber
1

Japt, 45 40 byte

Berdasarkan jawaban JS saya:

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

Cukup menyedihkan untuk bahasa golf, ya? Tampaknya ada banyak orang menyadari selama tantangan ini bahwa penerjemah mereka memiliki bug, dan saya sekarang termasuk di antara mereka. Ini harus dapat dilakukan dalam 30 byte atau kurang, tetapi bug membuat ini tidak mungkin.

Ini menciptakan fungsi Hyang bisa disebut seperti:

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

Atau, di sini adalah program lengkap, mengambil masukan dari STDIN:

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

Cobalah online!

Produksi ETH
sumber
1

GNU Sed (dengan ekstensi eval), 44

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

Saya berharap sedakan mengizinkan y/A-F/1-6/. Tapi ternyata tidak.

Trauma Digital
sumber
1

Python 3, 101 89 byte

Secara keseluruhan, ini sangat mirip dengan solusi Boomerang , tetapi dibutuhkan beberapa pendekatan berbeda untuk berbagai aspek.

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

Ini adalah versi diperluas dari kode asli saya:

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 hilang berkat @pacholik (mengganti jeroan joindengan operasi tunggal yang bekerja untuk digit dan huruf). Byte lain dipangkas dengan mengganti jointrik dengan slicing-string yang memukul saya pada saat bola lampu (tetapi yang sudah ada dalam tips golf Python , meskipun di bawah judul yang menentukan Python 2).

Tim Pederick
sumber
The joindapat disingkat menjadi 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;}
SuperJedi224
sumber
1

Japt , 21 byte

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

Cobalah online!

Peningkatan signifikan atas jawaban Japt yang ada. Itu tidak menangani 153 -> 63kasus yang diusulkan dalam komentar, tetapi tidak ada jawaban lain yang tampaknya baik jadi saya akan meninggalkannya kecuali OP mengklarifikasi.

Output sebagai daftar angka desimal, dapat diubah menjadi keluaran angka desimal untuk 1 byte

Penjelasan:

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

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

uji:

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

Saya tidak tahu apakah itu baik-baik saja ... Mungkin tidak cukup untuk jawaban kualitas standar ...

RosLuP
sumber
0

Serius, 42 byte

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

Hex Dump:

31d1bc34a6bb2c24315758be40a8bd40ad3b60bd40
a83b29be3b285c282b2524604dee6a3b293d595758

Cobalah online

Harus ada cara yang lebih pendek dari ini, tetapi inilah yang saya dapatkan ... (Di sinilah saya mendapati diri saya berharap Wbenar-benar muncul, karena lebih pendek untuk meletakkan ;hak sebelum yang terakhir ketika Anda TIDAK menginginkannya daripada untuk menempatkan XSETIAP SETIAP W. Di sini, memiliki Wpop bukannya mengintip akan menghemat tiga byte.)

kuintopia
sumber
0

Japt, 18 byte

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

Cobalah

Shaggy
sumber
0

PHP, 71 byte

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

Jalankan sebagai pipa dengan -nRatau coba online .

Menghasilkan peringatan untuk beberapa input dalam PHP 7.1 dan yang lebih baru; ganti -dengan !=untuk memperbaiki.
Menghasilkan peringatan lain di PHP 7.2; masukkan abcdeftanda kutip untuk memperbaikinya.

Titus
sumber