Onaltılık ve Alfabe


45

Bu mücadelede, bir girdi alacak, onu onaltılık alana dönüştürecek, birkaç değişiklik yapacak ve sonucu çıkaracaksınız.

Onaltılık kısımda yalnızca 16 karakter olduğundan, kodunuzun mümkün olduğu kadar kısa olması gerekir.


Örnekler

Örnekler boş bir satırla ayrılır. İlk satır giriş, ikinci satır basamakları gösterir, üçüncü satır çıkışı gösterir

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

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

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

adımlar

Girdi her zaman pozitif bir tamsayı olacak


Çıktı üretmek için aşağıdaki adımları takip edersiniz:

  1. Girdiyi onaltılık alana dönüştürün
  2. Harfleri alfabedeki indeksleriyle değiştirin (örn. a -> 1, b -> 2)
  3. Sonucu onaltılık tekrar dönüştür
  4. Sonuç herhangi bir harf içeriyorsa, 2. adıma gidin. Değilse sonucu verin

Bu yani bayt cinsinden en kısa kod kazanır!


27
Gerekçe için +1 "Onaltılıkta yalnızca 16 karakter olduğundan, kodunuzun mümkün olduğu kadar kısa olması gerekir."
kedi

1
Sıfır rakamdan geçen bir test vakası (şu anki yaklaşımım için önemli bir durumdur):749699 -> B7083 -> 27083 -> 69CB -> 6932 -> 1B14 -> 1214 -> 4BE -> 425 -> 1A9 -> 119 -> 77
Martin Ender

5
Test durumu 153. Adım 1> 99, Adım 2 -> 99, Adım 3 -> 63, çıkış 63. Doğru mu?
edc65

Evet, 153 için Akış açıklaması kodunu görmedim ...
RosLuP

Ne pahasına olursa olsun ... İlk 4 cevaptan 3'ü 153 numaralı girişte 99'u ve bugünkü Jelly versiyonundaki Dennis'in faylarını verdi. Ben ilerideyken testten vazgeçeceğim :) Bu örneğin doğru olduğundan emin miyiz?
Dana

Yanıtlar:


13

Jöle , 18 bayt

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

Çevrimiçi deneyin!

Kaynak kodun ikili, 18 bayt sürümü xxd dökümü içeriyor

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

ve Jelly yorumlayıcısının bu sürümü ile çalışır .

Nasıl çalışır

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.

(ondalıktan tamsayıya) için kısa yol çalışması gerekirdi ḅ⁵, ancak Jelly bu yazının en son sürümünde onu kullanmamı engelleyen bir hataya sahipti.


3
O nedir....?
J Atkin

1
Bu hangi kodlamayı kullanıyor? UTF-8 veya ISO-8859 gibi görünmüyor
Downgoat

2
@Downgoat Öyle değil. Jelly kendi özel kodlamasını kullanır. Kaynak kod UTF-8'de veya bir ikili dosya olarak sağlanabilir.
Dennis

2
@Timwi Fuarı yeterince. Her ikisine de yazı ekledim.
Dennis,

2
Dennis'in savunmasında: Jelly, 256 karakterden daha az kullandığı için, basitçe ANSI karakterleri kullanan bir Jelly çatalını tanımlayabiliriz. Tek fark, okunabilirlik ve her bir fonksiyonun ne yaptığını hatırlamanın kolaylığı olacaktır.
15’te

8

JavaScript ES6, 98 92 67 64 bayt

@Downgoat sayesinde 3 byte kurtarıldı, @ user81655 ile 3 tane daha kaydedildi

Özyineleme için döngüyü kesen, çok daha kısa bir sürüm bulundu:

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

Muhtemelen bu programın en ilginç kısmı replacefonksiyonudur:

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 pasajı

( buradan alınır )

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>


Bu bir fonksiyonu kullanmak için birkaç bayt tasarruf edeceksiniz .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))"). Ayrıca özyinelemeyi kullanarak bir kaç bayt kurtarabilir
Downgoat

@Downgoat Teşekkürler! Değerlendirmeden önce ipte denedim .replace, ama bu daha uzun sürdü.
ETHProductions,

Ayrıca, adsız bir işlev yapabileceğini de unutmayın, ihmalh=
Conor O'Brien,

@ CᴏɴᴏʀO'Bʀɪᴇɴ Önerileriniz için teşekkürler, ama işe yaramayacak, çünkü kendisini çağırması gerekiyor.
ETHProductions,

Gah! Özyineleme görmedim. Ben ve salak> _ <
Conor O'Brien

6

CJam, 21 19 bayt

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

Burada test et.

açıklama

Bir çok olumsuz modülo sonuçlarının nadir vaka yararlı olmak. :)

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

Başka bir 153 için başarısız olabilir gibi görünüyor? İlk 4 cevaptan 3'ünde aynı sorunun olması garip görünüyor. cjam.aditsu.net/…
dana

4

Ruby, 35 + 1 = 36

Komut satırı işaretiyle pçalıştır

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

Açıklama:

-P bayrağı girdi ve sonuçtaki çıktıyı değişkende depolayan bir döngü oluşturur $_. '%x'onaltılık dönüşümü tr!yapar ve basamak değiştirir ve değiştirilecek bir şey yoksa falsey değeri döndürür. Yinele yenisiyle başlar $_.


4

Julia, 78 74 bayt

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

Bu bir tamsayıyı kabul eden ve bir dize döndüren özyinelemeli bir işlevdir.

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 bayt

feragat

Bu cevabı yazarken MATL'in dec2basefonksiyonunda bir hata olduğunu fark ettim , düzelttim ve düzeltmeyle birlikte yeni bir sürüm yayınladım (birkaç diğer birikmiş, ilişkisiz değişiklikle birlikte) .

Bu zorluğun sonrasındaki bir sürümü kullandığım için Meta konusundaki görüş birliğine göre bu cevap kazanmaya uygun değil .

kod

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

Örnek

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

açıklama

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        

Dilin eski versiyonuna cevap yazabilirsiniz!
lirtosiast

@ThomasKwa Sorun, eski sürümde derleyicide bir hata olması. Teğetsel olarak bazı (ilgisiz) yeni özellikler içeren yeni versiyonunda düzelttim
Luis Mendo

3

Dyalog APL, 37 36 33 bayt

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

Adám ve öneri için teşekkür ederiz . Bunun 16⊥⍣¯1⊢⍵yerine saklıyorum ⍵⊤⍨⍴⍨16- bu fazladan bir bayt, ancak 64 bit yerine rastgele boyutlarda işlem yapmamızı sağlıyor.


-2 doğru eşitsizlik işlevlerini seçerek:{∧/9≥X←16⊥⍣¯1⊢⍵:10⊥X⋄∇10⊥10|X+9<X}
Ocak’ta

1
veya daha kısa: 10⊥10|X+10≤X-> 10(⊣⊥|+≤)X(teknik olarak eşdeğer değildir ancak onaltılık rakamlar için çalışır)
ngn

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

2

Python, 118 105 bayt

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 veya 84 bayt (dahil -r)

Buradaki kuralların ilk kodlama girişimi olduğumdan tam olarak emin değilim, ancak kodun php -rgerekmeden çalıştırılabileceği <?ve?>

kod

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

biçimlendirilmiş

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

Alternatif Kod (stdin yerine argv kullanarak)

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

biçimlendirilmiş

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

notlar

Düzenleme 1: intval()14 karakterin kaydedilmesi için yapılan bir çağrıyı kestim ; çünkü PHP, sayısal dizgileri sayı olarak ele alır.
Düzenleme 2: \nTestten sonra çıkarmayı unuttuğum çıktıdan çıkardım ve toplam 4 karakterden tasarruf etmek için son ekodan alıntı işaretlerini kaldırdım.
Düzenleme 3: Kaldırılan için son çağrı intval()
Edit 4: Kayıtlı regex hattından tırnak işaretleri kaldırarak 2 byte
Düzenleme 5: Değiştirildi [a-f]için \D3 karakter kaldırılan kurtarmak için strvalgelen çağrıyı preg_replace8 daha; argv[]STDIN yerine kullanılan sürüm , döngü sonlandırıcısını 11 karakter daha kaydederek while deyimine (ayy!) taşıdı ve dechex çağrısını subject,preg_replacebir başka 3 için toplam 25; ayrıca 3 karakterden daha az karakter kullanan alternatif bir sürüm olarak stdin olmayan bir sürüm de ekledi. Yardımlarınız için teşekkürler, @Blackhole


Code Golf'a hoş geldiniz! Açılış etiketi olmayan dosyalar geçerli PHP dosyaları olduğundan, etiketleri her zaman PHP'de sayarız (veya alternatif olarak, -rseçenek için iki baytı sayarız ). Fakat bir lider ;her zaman bir liderden daha kısadır ?>, bu yüzden unutmayınız. Bu arada, işte daha kısa bir kod: for($a=$argv[1];$b!=$a;)$a=preg_replace('#\D#e','ord($0)-96',$b=dechex($a));echo$b;(-29 bytes).
Karadelik

Giriş 153vermeli 63, vermeli 99. Ama -rbedava. (bkz. codegolf.meta.stackexchange.com/a/2428/55735 )
Titus

2

R , 106 103 102 bayt

-3 bayt ifyerine kullanarakwhile

Giuseppe as.doubleyerine yerine kullandığı -1 baytas.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}

Çevrimiçi deneyin!

Sadece a(your_integer_here)sonucu görmek için TIO'ya ekleyin .

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

Her yinelemedeki işlevi yeniden uygulamak için özyinelemeyi kullandım, bu dizge içinde 'abcdef' harflerinden herhangi birini bulmaması şartıyla, bu koşul Yanlış olduğunda, sonucu bir dizge olarak verir. En iyi bölüm, chartrbir dize içindeki ilgili öğelerle öğeleri değiştirmemi sağlayan işlevi keşfetmekti . Bu dize onaltılıyı bir dizge biçiminde zorlayan işlevden gelir.

Düzenleme: Ben kullanmaya çalıştı sprint("%x",y)yerine as.hexmode(as.double(y)), ama yine de kullanmak için gerekli ediyorum as.doubleidi kodu bir yere 2 1 bayt uzun.


as.doubledaha kısadıras.integer
Giuseppe

Yapılacak daha çok golf var ama şu an cep telefonundayım. R golf sohbetimize katılmak için çekinmeyin ve R'de golf oynayabileceğiniz ipuçlarına göz atın
Giuseppe,

2

05AB1E , 12 bayt

h[Au₂L‡hÐþQ#

Çevrimiçi deneyin veya tüm test durumlarını doğrulayın .

Açıklama:

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)

ÐþQAlternatif olarak aynı byte-count için D.ï( D: Duplicate ;: is_int?) olabilir.


1
@ MagicOctopusUrn [hÐþQ#Au₂L‡her zaman ne yazık ki çalışmıyor. Mücadelesi önce bir kez, sonra her yinelemede hex'e dönüşmeyi ifade ediyor. Kodunuzu test takımıma yapıştırırsam ilk üç test vakası doğrudur, ancak son ikisi başarısız olur.
Kevin Cruijssen

2

C # (Visual C # Etkileşimli Derleyici) , 92 bayt

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

Çevrimiçi deneyin!

Daha az golf kodu:

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

Soru gönderisinin sonundaki algoyu takiben, 153, 63 ile sonuçlanmalı ve bir süre önce işleviniz bana göründüğü gibi, 99 ile sonuçlanmamıştı
RosLuP,

1
@RosLuP - Şu anda benim çözümüm çok daha uzun olsa da 153 ile çalışmasına izin verdim :) Bunu küçültmek için çalışacağım ama şimdilik en azından bu durumu doğru şekilde ele alıyor.
Dana

1

Mathematica, 107 bayt

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

Bunu golf oynamak için daha fazla yol düşünemiyorum ...


1

Mathematica, 80 bayt

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

Bu alephalpha öğrendiğim süre döngüler için temiz bir hile kullanır. //."Mümkün olduğunca sık sık bu ikame kuralını uygulamak" dir. Sonra l_/;Max@l>9sadece onaltılık basamak listesi hala 9'dan büyük basamaklar içeriyorsa eşleşen bir kalıp kullanırız .


1

Japt, 45 40 bayt

JS cevabımı temel alarak:

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

Bir golf dili için oldukça acıklı, huh? Bu meydan okuma sırasında tercümanlarının böcekleri olduğunu fark eden pek çok kişi var gibi görünüyor, ve ben şimdi onların arasındayım. Bu olmalıdır 30 bayt veya daha az yapılması mümkün, ama bir hata bu imkansız kılmaktadır.

Bu Hşöyle çağrılabilir bir fonksiyon yaratır :

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

Alternatif olarak, işte STDIN'den girdi alarak tam bir program:

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

Çevrimiçi deneyin!


1

GNU Sed (eval uzantılı), 44

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

Keşke sedizin verseydim y/A-F/1-6/. Ama öyle değil.


1

Python 3, 101 89 bayt

Genel olarak, bu Boomerang'ın çözümüne oldukça benzer , ancak çeşitli yönlere birkaç farklı yaklaşım getiriyor.

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

Bu, orijinal kodumun genişletilmiş sürümüdür:

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.

Pacholik sayesinde 11 bayt döküldü (hantalların hançerlerini joinhem rakam hem de harflerle çalışan tek bir işlemle değiştirerek ). Başka bir bayt, joinbir ampul anında beni vuran bir dize dilimleme hilesiyle değiştirildi (ancak Python golf ipuçlarında Python 2'yi belirten bir başlık altında olmasına rağmen zaten var ).


İçin joinkısaltılabilir str(ord(c)%12)for c in n.
pacholik

1

Java, 201 bayt

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 bayt

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

Çevrimiçi deneyin!

Mevcut Japt cevabı üzerinde kayda değer bir gelişme. 153 -> 63Bir yorumda önerilen durumu ele almaz , ancak diğer cevapların hiçbiri görünmüyor, bu yüzden OP açıklığa kavuşturmadığı sürece bırakacağım.

Ondalık basamakların bir listesi olarak çıktı, 1 baytlık bir ondalık sayı çıktısı olarak değiştirilebilir

Açıklama:

ì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 karakter, 208 bayt

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

Ölçek:

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

Tamam mı bilmiyorum ... Olası standart kalite cevabı için yeterli değil ...


0

Cidden, 42 bayt

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

Hex Dump:

31d1bc34a6bb2c24315758be40a8bd40ad3b60bd40
a83b29be3b285c282b2524604dee6a3b293d595758

Çevrimiçi deneyin

Orada bundan daha kısa bir yol olmalı, ama bu kendimi kalmak istemeyerek bulduğumuz yerdir (... ne var ise Wbu bir koymak için kısa olduğundan, aslında attı ;sen daha bunu İSTEMEDİĞİNİZ zaman sonuncusu önce hakkını XEACH'den sonra koymak: WBurada, Wgözetleme yerine pop olması üç bayt kazandıracak.)



0

PHP, 71 bayt

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

Pipe ile çalıştırın -nRveya çevrimiçi deneyin .

PHP 7.1 ve sonraki sürümlerde bazı girdiler için bir uyarı verir; düzeltmek için -ile değiştirin !=.
PHP 7.2'de başka bir uyarı verir; abcdefdüzeltmek için tırnak içine alın .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.