เลขฐานสิบหกและตัวอักษร


45

ในการท้าทายนี้คุณจะได้รับอินพุตแปลงเป็นเลขฐานสิบหกทำการเปลี่ยนแปลงสองสามอย่างและส่งผลลัพธ์ออกมา

เนื่องจากมีเพียง 16 ตัวอักษรในเลขฐานสิบหกรหัสของคุณจะต้องสั้นที่สุด


ตัวอย่าง

ตัวอย่างถูกคั่นด้วยบรรทัดว่าง บรรทัดแรกคืออินพุตบรรทัดที่สองแสดงขั้นตอนที่สามแสดงเอาต์พุต

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

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

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

ขั้นตอน

ข้อมูลที่ป้อนจะเป็นจำนวนเต็มบวกเสมอ


เพื่อสร้างผลลัพธ์คุณจะทำตามขั้นตอนต่อไปนี้:

  1. แปลงอินพุตเป็นเลขฐานสิบหก
  2. แทนที่ตัวอักษรใด ๆ ด้วยดัชนีของพวกเขาในตัวอักษร (เช่นa -> 1, b -> 2)
  3. แปลงผลลัพธ์กลับเป็นเลขฐานสิบหก
  4. หากผลลัพธ์มีตัวอักษรใด ๆ ไปที่ขั้นตอนที่ 2 ถ้าไม่ออกผลลัพธ์

นี่คือสั้นที่สุดในหน่วยไบต์!


27
+1 สำหรับการให้เหตุผล"เนื่องจากมีเพียง 16 ตัวอักษรในฐานสิบหกรหัสของคุณจะต้องสั้นที่สุด"
แมว

1
กรณีทดสอบที่ผ่านตัวเลขศูนย์ (ซึ่งเป็นกรณีขอบที่สำคัญสำหรับแนวทางปัจจุบันของฉัน):749699 -> B7083 -> 27083 -> 69CB -> 6932 -> 1B14 -> 1214 -> 4BE -> 425 -> 1A9 -> 119 -> 77
Martin Ender

5
กรณีทดสอบ 153 ขั้นตอนที่ 1> 99 ขั้นตอนที่ 2 -> 99 ขั้นตอนที่ 3 -> 63 ผลลัพธ์ 63 ถูกต้องหรือไม่
edc65

ใช่สำหรับ 153 ฉันไม่เห็นคำอธิบายของ Flow Code ...
RosLuP

สำหรับสิ่งที่คุ้มค่า ... 3 จาก 4 คำตอบยอดนิยมคืน 99 เมื่อป้อนข้อมูล 153 และความผิดพลาดแบบแยกส่วนของเดนนิสในเวอร์ชั่นปัจจุบันของเยลลี่ ฉันจะออกจากการทดสอบในขณะที่ฉันไปข้างหน้า :) เราแน่ใจว่าตัวอย่างถูกต้องหรือไม่
dana

คำตอบ:


13

เยลลี่ขนาด 18 ไบต์

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

ลองออนไลน์!

ไบนารีซอร์สโค้ด 18 ไบต์มี xxd dump

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

และทำงานร่วมกับรุ่นของล่าม Jelly นี้

มันทำงานอย่างไร

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.

(ฐานสิบถึงจำนวนเต็ม) ควรจะทำงานเป็นแบบย่อḅ⁵แต่รุ่นล่าสุดของ Jelly ในขณะที่โพสต์นี้มีข้อผิดพลาดที่ทำให้ฉันไม่สามารถใช้งานได้


3
นั่นคืออะไร....?
J Atkin

1
การเข้ารหัสแบบใดที่ใช้? ดูเหมือนว่า UTF-8 หรือ ISO-8859
Downgoat

2
@Downgoat มันไม่ใช่ เยลลี่ใช้การเข้ารหัสที่กำหนดเองของตัวเอง ซอร์สโค้ดสามารถระบุได้ทั้งแบบ UTF-8 หรือเป็นไฟล์ไบนารี่
Dennis

2
@ Timwi ยุติธรรมเพียงพอ ฉันได้เพิ่มทั้งสองลงในโพสต์
Dennis

2
ในการป้องกันเดนนิส: เนื่องจาก Jelly ใช้น้อยกว่า 256 ตัวอักษรหนึ่งจึงสามารถกำหนดทางแยกของ Jelly ที่ใช้ตัวอักษร ANSI ได้เล็กน้อย ความแตกต่างเพียงอย่างเดียวคือความสามารถในการอ่านและจดจำได้ง่ายว่าแต่ละฟังก์ชันทำอะไร
อดัม

8

JavaScript ES6, 98 92 67 64 ไบต์

บันทึก 3 ไบต์ด้วย @Downgoat ขอบคุณอีก 3 คนที่ @ user81655

พบรุ่นที่สั้นกว่ามากและใช้คำสั่งวนรอบเพื่อเรียกซ้ำ:

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

ส่วนที่น่าสนใจที่สุดของโปรแกรมนี้คือreplaceฟังก์ชั่น:

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.

ตัวอย่างการทดสอบ

(นำมาจากที่นี่ )

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>


มันจะประหยัดไม่กี่ไบต์ที่จะใช้ฟังก์ชั่นสำหรับ:.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))")นอกจากนี้ยังอาจบันทึกไม่กี่ไบต์โดยใช้การสอบถามซ้ำ
Downgoat

@ ลงไปขอบคุณ! ฉันจะลอง.replaceบนสตริงก่อนที่จะประเมิน แต่ที่เปิดออกอีกต่อไป
ETHproductions

นอกจากนี้โปรดจำไว้ว่าคุณสามารถทำให้มันเป็นฟังก์ชั่นนิรนามได้โดยไม่ต้องละทิ้งh=
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴขอบคุณสำหรับคำแนะนำ แต่นั่นไม่ได้ผลเพราะมันต้องเรียกตัวเอง
ETHproductions

Gah! ไม่เห็นการเรียกซ้ำ ฉันกับคนงี่เง่า> _ <
Conor O'Brien

6

CJam, 21 19 ไบต์

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

ทดสอบที่นี่

คำอธิบาย

มากกรณีที่หายากของโมดูโลผลเชิงลบเป็นประโยชน์ :)

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

ดูเหมือนว่าคนอื่นอาจจะล้มเหลวใน 153? ดูเหมือนแปลกที่คำตอบจาก 3 ใน 4 อันดับแรกจะมีปัญหาเดียวกัน cjam.aditsu.net/…
dana

4

Ruby, 35 + 1 = 36

ด้วยแฟล็กบรรทัดคำสั่งpให้รัน

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

คำอธิบาย:

ธง -p $_สร้างห่วงการจัดเก็บเข้าและส่งออกในที่สุดในตัวแปร '%x'ทำการแปลงtr!เลขฐานสิบหกและทำการแทนค่าหลักและส่งกลับค่าเท็จถ้าไม่มีสิ่งใดเปลี่ยนแปลง $_ทำซ้ำจะเริ่มต้นใหม่กับใหม่


4

จูเลีย78 78ไบต์

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

นี่เป็นฟังก์ชันแบบเรียกซ้ำที่ยอมรับจำนวนเต็มและส่งคืนสตริง

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ไบต์

คำปฏิเสธ

ในขณะที่เขียนคำตอบนี้ผมสังเกตเห็นข้อผิดพลาดใน MATL ของdec2baseฟังก์ชั่นการแก้ไขมันและปล่อยรุ่นใหม่ที่มีการแก้ไข (เช่นเดียวกับคู่อื่น ๆ สะสมการเปลี่ยนแปลงที่ไม่เกี่ยวข้อง)

ตั้งแต่ผมใช้รุ่นซึ่งเป็นช้ากว่าความท้าทายนี้เป็นไปตามมติเกี่ยวกับ Metaคำตอบนี้ไม่ได้รับสิทธิ์สำหรับผู้ชนะ

รหัส

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

ตัวอย่าง

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

คำอธิบาย

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        

คุณสามารถเขียนคำตอบในภาษาเวอร์ชันเก่าได้!
lirtosiast

@ThomasKwa ปัญหาคือว่าในเวอร์ชั่นเก่าคอมไพเลอร์มีข้อผิดพลาด ฉันแก้ไขมันในเวอร์ชันใหม่ซึ่งรวมถึงคุณลักษณะใหม่บางอย่าง (ไม่เกี่ยวข้อง) โดย
สังเขป

3

Dyalog APL, 37 36 33 ไบต์

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

ขอบคุณAdámและngnสำหรับคำแนะนำ ฉันเก็บ16⊥⍣¯1⊢⍵แทน⍵⊤⍨⍴⍨16- มันเป็นไบต์พิเศษ แต่ช่วยให้เราสามารถทำงานกับจำนวนขนาดโดยพลการมากกว่า 64 บิต


-2 โดยการเลือกฟังก์ชั่นความไม่เท่าเทียมกันทางขวา:{∧/9≥X←16⊥⍣¯1⊢⍵:10⊥X⋄∇10⊥10|X+9<X}
อดัม

1
หรือสั้นกว่า: 10⊥10|X+10≤X-> 10(⊣⊥|+≤)X(ในทางเทคนิคไม่เท่ากัน แต่ใช้ได้กับเลขฐานสิบหก)
ngn

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


2

PHP, 140 126 122 114 112 87 หรือ 84 ไบต์ (รวม-r)

ไม่แน่ใจทั้งหมดเกี่ยวกับวิธีการกฎนี้เช่นนี้เป็นความพยายามครั้งแรกของฉัน codegolf แต่รหัสสามารถทำงานได้php -rโดยไม่จำเป็นต้อง<?และ?>

รหัส

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

ที่จัดรูปแบบ

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

รหัสสำรอง (ใช้ argv แทน stdin)

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

ที่จัดรูปแบบ

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

หมายเหตุ

แก้ไข 1: ฉันตัดการโทรออกเพื่อintval()บันทึก 14 อักขระเนื่องจาก PHP จะถือว่าสตริงตัวเลขเป็นตัวเลขอย่างมีความสุข
แก้ไข 2: ฉันลบออก\nจากผลลัพธ์ที่ฉันลืมที่จะลบหลังจากการทดสอบและลบเครื่องหมายคำพูดจากเสียงสะท้อนสุดท้ายเพื่อบันทึกทั้งหมด 4 ตัวอักษร
แก้ไข 3: ถอดสายสุดท้ายที่จะintval()
แก้ไข 4: บันทึกไว้ 2 ไบต์โดยการเอาเครื่องหมายคำพูดจากเส้น regex
แก้ไขที่ 5: การเปลี่ยนแปลง[a-f]เพื่อ\Dที่จะบันทึก 3 ตัวอักษรออกstrvalสายจากpreg_replace8 มากขึ้น รุ่นที่เพิ่มซึ่งใช้argv[]แทน STDIN ย้ายลูปเทอร์มิเนเตอร์ลงในคำสั่ง while (อุ๊ปส์!) บันทึกตัวละครเพิ่มอีก 11 ตัวและย้ายการเรียกเดคซ์ไปไว้ในsubjectส่วนของpreg_replaceอีก 3 รวมเป็น 25 ยังเพิ่มเวอร์ชันที่ไม่ใช่ stdin เป็นเวอร์ชันสำรองที่ใช้อักขระน้อยลง 3 ตัว ขอบคุณสำหรับความช่วยเหลือ @Blackhole


ยินดีต้อนรับสู่ Code Golf! เนื่องจากไฟล์ที่ไม่มีแท็กเปิดเป็นไฟล์ PHP ที่ถูกต้องเราจึงนับแท็กเป็น PHP เสมอ (หรือมิฉะนั้นเราจะนับสองไบต์สำหรับ-rตัวเลือก) แต่ผู้นำ;มักสั้นกว่าผู้นำ?>เสมออย่าลืมมัน นี่คือรหัสที่สั้นกว่า: for($a=$argv[1];$b!=$a;)$a=preg_replace('#\D#e','ord($0)-96',$b=dechex($a));echo$b;(-29 bytes)
Blackhole

การป้อนข้อมูล153ควรจะให้ไม่ได้63 99แต่-rไม่มีค่าใช้จ่าย (ดูcodegolf.meta.stackexchange.com/a/2428/55735 )
ติตัส

2

R , 106 103 102 ไบต์

-3 ไบต์โดยใช้ifแทนwhile

-1 ไบต์ขอบคุณ Giuseppe ที่ใช้as.doubleแทน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}

ลองออนไลน์!

เพียงเพิ่มa(your_integer_here)ใน TIO เพื่อดูผลลัพธ์

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

ฉันใช้การเรียกซ้ำเพื่อนำฟังก์ชันไปใช้กับการวนซ้ำแต่ละครั้งซ้ำโดยมีเงื่อนไขว่าไม่พบตัวอักษร 'abcdef' ภายในสตริงเมื่อเงื่อนไขนี้เป็นเท็จจะแสดงผลลัพธ์เป็นสตริง ส่วนที่ดีที่สุดคือการค้นพบchartrฟังก์ชั่นของฉันซึ่งช่วยให้ฉันสลับองค์ประกอบกับองค์ประกอบที่สอดคล้องกันในสตริง สตริงนี้มาจากฟังก์ชันที่บังคับเลขฐานสิบหกให้อยู่ในรูปแบบสตริง

แก้ไข: ฉันพยายามใช้sprint("%x",y)แทนas.hexmode(as.double(y))แต่ฉันยังจำเป็นต้องใช้as.doubleบางแห่งในรหัสซึ่งมีความยาว2 1 ไบต์


as.doubleสั้นกว่าas.integer
Giuseppe

ยังมีสนามกอล์ฟอีกมากที่ต้องทำ แต่ตอนนี้ฉันอยู่มือถือ อย่าลังเลที่จะเข้าร่วมการแชท Rของเรากอล์ฟและอย่าลืมที่จะตรวจสอบ (และมีส่วนร่วม) เคล็ดลับสำหรับการเล่นกอล์ฟใน R!
Giuseppe

2

05AB1E , 12 ไบต์

h[Au₂L‡hÐþQ#

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

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)

ÐþQอาจเป็นD.ï( D: ซ้ำ; : is_int?) สำหรับจำนวนไบต์เดียวกัน


1
@MagicOctopusUrn ทำงาน[hÐþQ#Au₂L‡ไม่ได้เสมอไป ความท้าทายระบุให้แปลงเป็นเลขฐานสิบหกหนึ่งครั้งแรกจากนั้นในทุกการทำซ้ำ ถ้าฉันวางรหัสของคุณในชุดทดสอบของฉันกรณีทดสอบสามข้อแรกนั้นถูกต้อง แต่กรณีที่สองล้มเหลว
Kevin Cruijssen

2

C # (Visual C # Interactive Compiler) , 92 ไบต์

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

ลองออนไลน์!

รหัส golfed น้อยกว่า:

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

ทำตามอัลโกในตอนท้ายของการโพสต์คำถาม 153 ต้องส่งผลให้ 63 และไม่ใช่ 99 อย่างที่ฉันคิดว่าฟังก์ชั่นของคุณกลับมาแล้วในช่วงเวลาที่ผ่านมา
RosLuP

1
@RosLuP - ให้มันทำงาน 153 ด้วยแม้ว่าตอนนี้ทางออกของฉันจะยาวกว่า :) ฉันจะพยายามทำให้มันเล็กลง แต่ตอนนี้อย่างน้อยมันก็จัดการเรื่องนี้ได้อย่างถูกต้อง
dana

1

Mathematica, 107 ไบต์

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

นึกไม่ออกว่าจะมีวิธีใดในการตีกอล์ฟ ...


1

Mathematica, 80 ไบต์

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

สิ่งนี้ใช้กลลวงที่ประณีตสำหรับลูปที่ฉันเรียนรู้จาก alephalpha //.คือ "ใช้กฎเปลี่ยนตัวนี้ได้บ่อยเท่าที่เป็นไปได้" จากนั้นเราใช้รูปแบบl_/;Max@l>9ซึ่งจะตรงกับถ้ารายการเลขฐานสิบหกหลักยังคงมีตัวเลขที่มากกว่า 9


1

Japt, 45 40 ไบต์

ตามคำตอบ JS ของฉัน:

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

น่าสมเพชสำหรับภาษากอล์ฟใช่มั้ย ดูเหมือนว่ามีคนจำนวนมากที่รู้ตัวในระหว่างการท้าทายนี้ที่ล่ามของพวกเขามีข้อบกพร่องและตอนนี้ฉันก็รวมอยู่ในพวกเขาด้วย สิ่งนี้ควรสามารถทำได้ใน 30 ไบต์หรือน้อยกว่า แต่ข้อผิดพลาดทำให้สิ่งนี้เป็นไปไม่ได้

สิ่งนี้จะสร้างฟังก์ชั่นHที่สามารถเรียกได้ว่า:

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

อีกวิธีหนึ่งคือโปรแกรมเต็มรูปแบบโดยรับข้อมูลจาก STDIN:

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

ลองออนไลน์!



1

Python 3 101 89 ไบต์

โดยรวมแล้วสิ่งนี้ค่อนข้างคล้ายกับโซลูชันของบูมเมอแรงแต่มันใช้วิธีการที่แตกต่างกันเล็กน้อยในด้านต่าง ๆ

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

นี่คือรหัสต้นฉบับของฉัน:

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 ไบต์ถูกเก็บไว้ด้วย @pacholik (แทนที่อวัยวะภายในjoinด้วยการดำเนินการเดียวที่ทำงานทั้งตัวเลขและตัวอักษร) ไบต์อื่นถูกตัดแต่งโดยแทนที่joinด้วยเคล็ดลับการสตริงที่ตีฉันในช่วงเวลาที่หลอดไฟ (แต่ที่มีอยู่แล้วในเคล็ดลับการเล่นกอล์ฟงูหลามแม้ว่าภายใต้หัวข้อที่ระบุ Python 2)


สามารถลงไปjoin str(ord(c)%12)for c in n
pacholik

1

Java, 201 ไบต์

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 ไบต์

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

ลองออนไลน์!

การปรับปรุงที่สำคัญเหนือคำตอบ Japtive ที่มีอยู่ มันไม่ได้จัดการ153 -> 63กรณีที่เสนอในความคิดเห็น แต่ไม่มีคำตอบอื่นใดที่ดูเหมือนว่าเป็นอย่างนั้นดังนั้นฉันจะทิ้งไว้นอกเสียจากว่า OP จะชี้แจง

เอาท์พุทเป็นรายการของเลขทศนิยมสามารถเปลี่ยนเป็นเอาท์พุทตัวเลขทศนิยม1 ไบต์

คำอธิบาย:

ì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 ตัวอักษร, 208 ไบต์

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

ทดสอบ:

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

ฉันไม่รู้ว่ามันโอเคหรือไม่ ... เป็นไปได้มันไม่เพียงพอสำหรับคำตอบคุณภาพมาตรฐาน ...


0

อย่างจริงจัง 42 ไบต์

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

ฐานสิบหก:

31d1bc34a6bb2c24315758be40a8bd40ad3b60bd40
a83b29be3b285c282b2524604dee6a3b293d595758

ลองออนไลน์

จะต้องมีวิธีที่สั้นกว่านี้ แต่นี่คือสิ่งที่ฉันได้รับ ... (นี่คือสิ่งที่ฉันคิดว่าตัวเองอยากWโผล่จริง ๆ เพราะมันสั้นกว่าที่จะใส่;ก่อนหน้าสุดท้ายเมื่อคุณไม่ต้องการมันมากกว่า เพื่อวางXEACH หลังที่Wนี่การมีWป๊อปแทนการแอบจะช่วยประหยัดสามไบต์)



0

PHP, 71 ไบต์

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

เรียกใช้เป็นไพพ์ด้วย-nRหรือลองออนไลน์ลองออนไลน์

ให้คำเตือนสำหรับอินพุตบางส่วนใน PHP 7.1 และใหม่กว่า; แทนที่-ด้วย!=เพื่อแก้ไข
เตือนอีกครั้งใน PHP 7.2; ใส่abcdefเครื่องหมายคำพูดเพื่อแก้ไข

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.