Hệ thập lục phân và bảng chữ cái


45

Trong thử thách này, bạn sẽ nhận được một đầu vào, chuyển đổi nó thành thập lục phân, thực hiện một vài thay đổi và đưa ra kết quả.

Vì chúng chỉ có 16 ký tự trong hệ thập lục phân, mã của bạn sẽ cần phải càng ngắn càng tốt.


Ví dụ

Các ví dụ được phân tách bằng một dòng trống. Dòng đầu tiên là đầu vào, dòng thứ hai hiển thị các bước, dòng thứ ba hiển thị đầu ra

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

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

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

Các bước

Đầu vào sẽ luôn là một số nguyên dương


Để tạo đầu ra, bạn sẽ làm theo các bước sau:

  1. Chuyển đổi đầu vào thành thập lục phân
  2. Thay thế bất kỳ chữ cái nào bằng chỉ mục của chúng trong bảng chữ cái (ví dụ a -> 1, b -> 2)
  3. Chuyển đổi kết quả trở lại thập lục phân
  4. Nếu kết quả có chứa bất kỳ chữ cái nào, hãy chuyển đến bước 2. Nếu không, hãy xuất kết quả

Đây là để mã ngắn nhất tính theo byte thắng!


27
+1 cho lời biện minh "Vì chúng chỉ có 16 ký tự thập lục phân, mã của bạn sẽ cần phải càng ngắn càng tốt."
con mèo

1
Một trường hợp thử nghiệm chuyển qua một chữ số 0 (là trường hợp cạnh quan trọng cho cách tiếp cận hiện tại của tôi):749699 -> B7083 -> 27083 -> 69CB -> 6932 -> 1B14 -> 1214 -> 4BE -> 425 -> 1A9 -> 119 -> 77
Martin Ender

5
Trường hợp kiểm tra 153. Bước 1> 99, Bước 2 -> 99, Bước 3 -> 63, đầu ra 63. Đúng không?
edc65

Có cho 153 Tôi đã không thấy mã giải thích Dòng chảy ...
RosLuP

Đối với những gì đáng giá ... 3 trong số 4 câu trả lời hàng đầu trả về 99 cho đầu vào 153 và lỗi của Dennis trên phiên bản hiện tại của Jelly. Tôi sẽ bỏ kiểm tra trong khi tôi đi trước :) Chúng tôi có chắc chắn rằng ví dụ đó là chính xác không?
dana

Câu trả lời:


13

Thạch , 18 byte

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

Hãy thử trực tuyến!

Phiên bản nhị phân, 18 byte của mã nguồn có kết xuất xxd

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

và làm việc với phiên bản này của trình thông dịch Jelly .

Làm thế nào nó hoạt động

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.

(số thập phân đến số nguyên) đáng lẽ phải hoạt động như một cách viết tắt ḅ⁵, nhưng phiên bản mới nhất của Jelly tại thời điểm đăng bài này có một lỗi khiến tôi không thể sử dụng nó.


3
Đó là gì....?
J Atkin

1
Mã hóa nào sử dụng? Nó không giống như UTF-8, hoặc ISO-8859
Downgoat

2
@Downgoat Không phải vậy. Jelly sử dụng mã hóa tùy chỉnh của riêng mình. Mã nguồn có thể được cung cấp trong UTF-8 hoặc dưới dạng tệp nhị phân.
Dennis

2
@Timwi Hội chợ đủ rồi. Tôi đã thêm cả hai vào bài viết.
Dennis

2
Để bảo vệ Dennis: vì Jelly sử dụng ít hơn 256 ký tự, người ta có thể định nghĩa một cách tầm thường một nhánh của Jelly chỉ sử dụng ký tự ANSI. Sự khác biệt duy nhất sẽ là khả năng đọc và dễ nhớ những gì mỗi chức năng làm.
Adám

8

JavaScript ES6, 98 92 67 64 byte

Đã lưu 3 byte nhờ @Downgoat, thêm 3 byte nhờ @ user81655

Tìm thấy một phiên bản ngắn hơn nhiều, bỏ qua vòng lặp để đệ quy:

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

Có lẽ phần thú vị nhất của chương trình này là replacechức năng:

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.

Kiểm tra đoạn

(lấy từ đây )

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>


Nó sẽ tiết kiệm một vài byte để sử dụng hàm cho .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))"). Nó cũng có thể tiết kiệm một vài byte bằng cách sử dụng đệ quy
Downgoat

@Downgoat Cảm ơn! Tôi đã thử một .replacechuỗi trên trước khi đánh giá nó, nhưng nó dài ra.
Sản xuất ETH

Cũng cần nhớ rằng bạn có thể biến nó thành một chức năng ẩn danh, bỏ quah=
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ Cảm ơn bạn đã gợi ý, nhưng điều đó sẽ không hiệu quả, vì nó cần phải tự gọi.
Sản xuất ETH

Trời ạ! Không thấy đệ quy. Tôi và thằng ngốc> _ <
Conor O'Brien

6

CJam, 21 19 byte

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

Kiểm tra nó ở đây.

Giải trình

Một trường hợp rất hiếm của kết quả modulo âm tính là hữu ích. :)

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

Có vẻ như một người khác có thể thất bại cho 153? Có vẻ kỳ lạ khi 3 trong số 4 câu trả lời hàng đầu sẽ có cùng một vấn đề? cjam.aditsu.net/ từ
dana

4

Hồng ngọc, 35 + 1 = 36

Với cờ dòng lệnh p, chạy

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

Giải trình:

Cờ -p tạo một vòng lặp, lưu trữ đầu vào và đầu ra cuối cùng trong biến $_. '%x'thực hiện chuyển đổi hex và tr!thực hiện thay thế chữ số và trả về giá trị falsey nếu không có gì thay đổi. redo bắt đầu hơn với các mới $_.


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

Đây là một hàm đệ quy chấp nhận một số nguyên và trả về một chuỗi.

Ung dung:

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

Khước từ

Trong khi viết câu trả lời này, tôi nhận thấy một lỗi trong dec2basechức năng của MATL , đã sửa nó và phát hành một phiên bản mới với sự điều chỉnh (cũng như một vài thay đổi tích lũy, không liên quan khác) .

Vì tôi đang sử dụng một phiên bản muộn hơn thử thách này, theo sự đồng thuận về Meta , câu trả lời này không đủ điều kiện để giành chiến thắng .

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

Thí dụ

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

Giải trình

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        

Bạn có thể viết một câu trả lời trong phiên bản cũ của ngôn ngữ!
lirtosiast

@ThomasKwa Vấn đề là trong phiên bản cũ trình biên dịch có lỗi. Tôi đã sửa nó trong phiên bản mới, bao gồm một số tính năng mới (không liên quan)
Luis Mendo

3

APL Dyalog, 37 36 33 byte

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

Cảm ơn Adámngn đã góp ý. Tôi đang giữ 16⊥⍣¯1⊢⍵thay vì ⍵⊤⍨⍴⍨16- đó là một byte bổ sung, nhưng cho phép chúng tôi hoạt động trên các số có kích thước tùy ý thay vì 64 bit.


-2 bằng cách chọn các hàm bất đẳng thức đúng:{∧/9≥X←16⊥⍣¯1⊢⍵:10⊥X⋄∇10⊥10|X+9<X}
Adám

1
hoặc thậm chí ngắn hơn: 10⊥10|X+10≤X-> 10(⊣⊥|+≤)X(về mặt kỹ thuật không tương đương, nhưng hoạt động cho các chữ số 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))))

2

PHP, 140 126 122 114 112 87 hoặc 84 byte (bao gồm -r)

Không hoàn toàn chắc chắn về cách các quy tắc xung quanh điều này vì đây là lần thử mã hóa đầu tiên của tôi, nhưng mã có thể được chạy php -rmà không cần <??>

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

Định dạng

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

Mã thay thế (sử dụng argv thay vì stdin)

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

Định dạng

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

Ghi chú

Chỉnh sửa 1: Tôi đã cắt một cuộc gọi intval()để lưu 14 ký tự vì PHP sẽ vui vẻ coi các chuỗi số là số.
Chỉnh sửa 2: Tôi đã xóa \nkhỏi đầu ra mà tôi quên xóa sau khi kiểm tra và xóa dấu ngoặc kép khỏi tiếng vang cuối cùng để lưu tổng cộng 4 ký tự.
Sửa 3: Gỡ bỏ các cuộc gọi cuối cùng để intval()
chỉnh sửa 4: Saved 2 byte bằng cách loại bỏ dấu ngoặc kép từ dòng regex
Sửa 5: Thay đổi [a-f]để \Dtiết kiệm 3 ký tự, loại bỏ strvalcuộc gọi từ preg_replace8 trở lên; đã thêm phiên bản sử dụng argv[]thay vì STDIN, di chuyển bộ kết thúc vòng lặp vào câu lệnh while (rất tiếc!) lưu thêm 11 ký tự và chuyển cuộc gọi dechex vàosubject phần củapreg_replacecho 3 người khác, tổng cộng 25; cũng đã thêm một phiên bản không phải là một phiên bản thay thế sử dụng ít hơn 3 ký tự. Cảm ơn sự giúp đỡ, @Blackhole


Chào mừng bạn đến với Code Golf! Vì các tệp không mở thẻ là các tệp PHP hợp lệ, chúng tôi luôn đếm các thẻ trong PHP (hoặc cách khác, chúng tôi đếm hai byte cho -rtùy chọn). Nhưng một đầu ;luôn luôn ngắn hơn một đầu ?>, vì vậy đừng quên nó. Nhân tiện, đây là một mã ngắn hơn: for($a=$argv[1];$b!=$a;)$a=preg_replace('#\D#e','ord($0)-96',$b=dechex($a));echo$b;(-29 byte).
Hố đen

Đầu vào 153nên cho 63, không 99. Nhưng -rlà miễn phí. (xem codegolf.meta.stackexchange.com/a/2428/55735 )
Tít

2

R , 106 103 102 byte

-3 byte bằng cách sử dụng ifthay vìwhile

-1 byte nhờ Giuseppe sử dụng as.doublethay vìas.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}

Hãy thử trực tuyến!

Chỉ cần thêm a(your_integer_here)vào TIO để xem kết quả.

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

Tôi đã sử dụng đệ quy để áp dụng lại hàm cho mỗi lần lặp kế tiếp, với điều kiện nó không tìm thấy bất kỳ chữ nào 'abcdef' trong chuỗi, khi điều kiện này là Sai, nó đưa ra kết quả dưới dạng chuỗi. Phần tốt nhất là khám phá của tôi về chartrhàm, cho phép tôi trao đổi các phần tử với các phần tử tương ứng trong một chuỗi. Chuỗi này xuất phát từ chức năng ép buộc hệ thập lục phân thành định dạng chuỗi.

Chỉnh sửa: Tôi đã cố gắng sử dụng sprint("%x",y)thay vì as.hexmode(as.double(y)), nhưng tôi vẫn được yêu cầu sử dụng as.doubleở đâu đó trong mã, dài hơn 2 1 byte.


as.doublengắn hơnas.integer
Giuseppe

Có một số golf nữa sẽ được thực hiện nhưng tôi đang di động vào lúc này. Hãy tham gia trò chuyện chơi golf R của chúng tôi và đừng quên xem (và đóng góp cho) các mẹo chơi golf trong R!
Giuseppe

2

05AB1E , 12 byte

h[Au₂L‡hÐþQ#

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

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)

ÐþQcách khác có thể là D.ï( D: trùng lặp ; : is_int?) cho cùng một số đếm byte.


1
@MagicOctopusUrn [hÐþQ#Au₂L‡không phải lúc nào cũng hoạt động một cách đáng tiếc. Thử thách chuyển sang hex một lần đầu tiên, và sau đó trong mỗi lần lặp. Nếu tôi dán mã của bạn vào bộ thử nghiệm của mình, ba trường hợp thử nghiệm đầu tiên là chính xác, nhưng hai trường hợp cuối cùng đều thất bại.
Kevin Cruijssen

2

C # (Trình biên dịch tương tác 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;}

Hãy thử trực tuyến!

Mã golf ít hơn:

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

Theo sau phần cuối của bài đăng câu hỏi, 153 phải có kết quả là 63 chứ không phải 99 như chức năng của bạn một thời gian trước đây đã trở lại
RosLuP

1
@RosLuP - Làm cho nó hoạt động với 153, mặc dù bây giờ giải pháp của tôi dài hơn nhiều :) Tôi sẽ làm việc để làm cho nó nhỏ hơn, nhưng bây giờ ít nhất nó đang xử lý trường hợp đó một cách chính xác.
dana

1

Toán học, 107 byte

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

Không thể nghĩ ra bất kỳ cách nào khác để chơi gôn này ...


1

Toán học, 80 byte

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

Điều này sử dụng một mẹo gọn gàng cho các vòng lặp trong khi tôi học được từ alephalpha. "Áp //.dụng quy tắc thay thế này thường xuyên nhất có thể". Sau đó, chúng tôi sử dụng một mẫu, l_/;Max@l>9chỉ khớp với nếu danh sách chữ số thập lục phân vẫn chứa các chữ số lớn hơn 9.


1

Japt, 45 40 byte

Dựa trên câu trả lời JS của tôi:

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

Khá thảm hại cho một ngôn ngữ chơi golf, phải không? Dường như có rất nhiều người nhận ra trong thử thách này rằng các phiên dịch viên của họ có lỗi, và bây giờ tôi được bao gồm trong số họ. Đây nên có thể được thực hiện trong 30 byte hoặc ít hơn, nhưng một lỗi làm cho không thể này.

Điều này tạo ra một chức năng Hcó thể được gọi như vậy:

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

Ngoài ra, đây là một chương trình đầy đủ, lấy đầu vào từ STDIN:

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

Hãy thử trực tuyến!



1

Python 3, 101 89 byte

Nhìn chung, điều này khá giống với giải pháp của Boomerang , nhưng cần một vài cách tiếp cận khác nhau cho các khía cạnh khác nhau.

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

Đây là phiên bản mở rộng của mã gốc của tôi:

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 đã được chuyển ra nhờ @pacholik (thay thế các bộ phận bên trong joinbằng một thao tác duy nhất hoạt động cho cả chữ số và chữ cái). Một byte khác đã được cắt bớt bằng cách thay thế joinbằng một thủ thuật cắt chuỗi đánh vào tôi trong một khoảnh khắc bóng đèn (nhưng đã tồn tại trong các mẹo chơi gôn của Python , mặc dù trong một tiêu đề chỉ định Python 2).


jointhể rút ngắn lại 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 ì

Hãy thử trực tuyến!

Một cải tiến đáng kể so với câu trả lời Japt hiện có. Nó không xử lý 153 -> 63trường hợp được đề xuất trong một bình luận, nhưng dường như không có câu trả lời nào khác vì vậy tôi sẽ để lại trừ khi OP làm rõ.

Đầu ra dưới dạng danh sách các chữ số thập phân, có thể được thay đổi thành đầu ra số thập phân cho 1 byte

Giải trình:

ì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 ký tự, 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}⍵}

kiểm tra:

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

Tôi không biết có ổn không ... Có thể nó không đủ cho câu trả lời chất lượng tiêu chuẩn ...


0

Nghiêm túc, 42 byte

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

Bãi rác Hex:

31d1bc34a6bb2c24315758be40a8bd40ad3b60bd40
a83b29be3b285c282b2524604dee6a3b293d595758

Dùng thử trực tuyến

Phải có một cách ngắn hơn thế này, nhưng đây là những gì tôi đã nhận được ... (Đây là nơi tôi thấy mình mong muốn Wthực sự xuất hiện, vì nó ngắn hơn để đặt một ;quyền trước cái cuối cùng khi bạn KHÔNG muốn nó hơn để đặt Xsau MACHI WỞ đây, có Wpop thay vì peek sẽ tiết kiệm được ba byte.)



0

PHP, 71 byte

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

Chạy như ống với -nRhoặc thử trực tuyến .

Đưa ra một cảnh báo cho một số đầu vào trong PHP 7.1 trở lên; thay thế -với !=việc sửa chữa.
Đưa ra một cảnh báo khác trong PHP 7.2; đặt abcdeftrong dấu ngoặc kép để sửa chữa.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.