จำนวนเต็มกับสตริงด้วย radix ที่กำหนด


13

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

to_string(351837066319, 31) => "codegolf"

2
จากตัวอย่างที่ฉันรวบรวมว่าตัวอักษรตัวพิมพ์เล็กมาก่อนเช่นตัวเลขในฐาน 62 คือ 0-9, az, AZ ตามลำดับนั้น
sepp2k

ใช่แล้วใช่แล้ว
Michiel de Mare

at 0:00แดงสมบูรณ์แบบ
Zacharý

คำตอบ:


4

dc - 43 chars

[sb[58-]s_[lb~dZ39*+dB3<_9+rd0<xrP]dsxxk]sf

เราสามารถย่อให้สั้นลงได้ถ้าเราสมมติว่า stack มีเพียงสองอาร์กิวเมนต์เท่านั้น

[[58-]s_dSb~dZ39*+dB3<_9+SadLbr0<fLaPc]sf

ในฐานะโปรแกรมเดี่ยวเราต้องการเพียง 37 ตัวอักษร:

?o[58-]s_[O~dZ39*+dB3<_9+rd0<xrP]dsxx

แทนที่จะใช้[39+]sz9<zเราเพียงแค่ใช้Z39*+ซึ่งจะเพิ่ม 39 สำหรับตัวเลขหนึ่งหลักและ 78 สำหรับตัวเลขสองหลัก แทนการ113ที่เราใช้B3( ADยังใช้งานได้)


4

Ruby 1.8 - 75 ตัวอักษรพร้อมการเรียกซ้ำ

f=proc{|n,b|(n<b ? "":f[n/b,b])+([*'0'..'9']+[*'a'..'z']+[*'A'..'Z'])[n%b]}

โดยไม่ต้องเรียกซ้ำ

f=proc{|n,b|d=[*'0'..'9']+[*'a'..'z']+[*'A'..'Z'];s=d[n%b];s=d[n%b]+s while(n/=b)>0;s}

(ทั้งสองอิงกับโซลูชัน 1.9 ของ Dogbert)


4

Python - 86

from string import*
def t(n,r,s=''):
 while n:s=printable[n%r]+s;n/=r
 return s or'0'

เครดิตเนื่องจาก Hoa Long Tam สำหรับเคล็ดลับการนำเข้าสตริง


3

Python, 93 99

from string import *
d=digits+letters
def t(n,b):
 s=''
 while n>0:s=d[n%b]+s;n/=b
 return s or '0'

แก้ไข : "หรือ '0'" เพิ่มสำหรับกรณีสตริงว่าง


ล้มเหลวเมื่อ n = 0 ส่งคืนสตริงว่างเมื่อควรส่งคืน '0' อย่างไรก็ตาม +1 สำหรับเคล็ดลับสตริง
Juan

2

dc, 61 ตัวอักษร

[sr[lr~rd0<x]dsxxk[39+]sa[58-]sb[d9<ad78<b48+anz0<p]dspxIP]sf

ทำงานเป็น:

dc -e'[sr[lr~rd0<x]dsxxk[39+]sa[58-]sb[d9<ad78<b48+anz0<p]dspxIP]sf' -e'351837066319 31 lfx'

หรือ:

dc -f base.dc -e '351837066319 31 lfx'

คำอธิบาย: เราใช้หมายเลขและฐานบนสแต็ก srบันทึกฐานใน register r ฟังก์ชั่น recursive [lr~rd0<x]dsxxสลายตัวเลขลงในตัวเลขในฐานTOS register rตัวเลขแรกคือ 0 เสมอลบออกจากสแต็กด้วยk(ตั้งค่าความแม่นยำซึ่งโดยค่าเริ่มต้นคือ 0 ด้วยดังนั้นจึงเท่ากับ nop) จากนั้นฟังก์ชั่นวนซ้ำจะ[48+d57<ad122<banz0<p]dspxส่งออกแต่ละหลักใน ASCII ด้วยความช่วยเหลือของฟังก์ชั่น a ( [39+]sa) และ b ( [58-]sb) IPขึ้นบรรทัดใหม่ ฟังก์ชั่นจะถูกเก็บไว้ในการลงทะเบียนและสามารถเรียกโดยflfx


1
หากคุณย้าย 48+ ไปยังจุดสิ้นสุดการบันทึกสอง (57 และ 122 ทั้งสองวางอักขระ) นอกจากนี้ยังมีการกำกับดูแลเล็กน้อยในฐานะที่เป็นฟังก์ชั่นคุณไม่สามารถคิดได้ว่าจะไม่มีสิ่งใดในสแต็ก แต่ปัญหาจะถูกลบออกถ้าคุณรวมลูป (ซึ่งจะบันทึกอักขระสองสามตัว)
Nabb

2

Ruby - 72 70 59 ตัวอักษร

f=->n,b{(n<b ? "":f[n/b,b])+[*?0..?9,*?a..?z,*?A..?Z][n%b]}

ไม่ต้องเรียกซ้ำ, 70 ตัวอักษร

f=->n,b{d=*?0..?9,*?a..?z,*?A..?Z;s=d[n%b];s=d[n%b]+s while(n/=b)>0;s}

ทดสอบ

irb(main):080:0> f[351837066319, 31]
=> "codegolf"
irb(main):081:0> f[0, 31]
=> "0"

1

Haskell, 109 ตัวอักษร

m=divMod
d(0,x)b=[f x]
d(r,x)b=f x:d(m r b)b
f=(!!)$['0'..'9']++['a'..'z']++['A'..'Z']
s x b=reverse$d(m x b)b

1

Befunge - 53 x 2 = 106 ตัวอักษร

หรือ 53 + 46 = 99 ตัวอักษรหากคุณยินดีที่จะกำหนดเส้นทางส่วนอื่น ๆ ของโปรแกรมของคุณผ่านด้านล่างซ้าย

11p01-\>:11g%\11g/:#v_$>:1+!#v_:45+`!#v_:75*`!#v_   v
       ^            <  ^,    $# +"0"  < +"'"   <-":"<

อันดับแรกให้วางจำนวนที่จะแปลงบนสแต็กจากนั้น Radix และเข้าสู่ฟังก์ชันนี้จากมุมบนซ้ายไปทางขวา จะเอาท์พุทสตริงให้คุณ (เนื่องจาก Befunge ไม่รองรับตัวแปรสตริง) และปล่อยจากด้านล่าง$ลง ต้องการ(1,1)เซลล์สำหรับการจัดเก็บ radix

เช่นสำหรับตัวอย่างที่ใส่351837066319ลงในอินพุทและรัน:

&56*1+    11p01-\>:11g%\11g/:#v_$>:1+!#v_:45+`!#v_:75*`!#v_   v
                 ^            <  ^,    $# +"0"  < +"'"   <-":"<
                                       @


1

ทับทิม 1.9 - 80 74 68

t = -> n, b {d = ? 0 .. ? 9,? a .. ? z, *? A .. ? Z; s = ''; (s = d [n% b] + s; n / = b) ในขณะที่ n> 0; s}

ด้วย '0' สำหรับสตริงว่าง95 89 82 ตัวอักษร:

t=->n,b,s=''{d=*?0..?9,*?a..?z,*?A..?Z;(s=d[n%b]+s;n/=b)while n>0;s.empty?? ?0: s}

Ruby 1.9 - แต่น่าเสียดายที่ทำงานได้ถึง 36 ฐานเท่านั้น

t=->n,b{n.to_s(b)}

2
คุณสามารถแทนที่]+['s ,พร้อมด้วย
Nemo157

1

Bash, 79 ตัวอักษร

f(){
dc<<<$2o$1p|perl -pe"y/A-Z/a-z/;s/ \d+/chr$&+($&<10?48:$&<36?87:29)/ge"
}

BC_BASE_MAX ได้รับการบันทึกว่าอายุ 16 ปีฉันไม่รู้ว่าปาฏิหาริย์สร้างผลลัพธ์ในอินพุตตัวอย่างได้อย่างไร แต่จะส่งออกขยะ (เช่นอักขระที่ไม่ใช่ตัวอักษร) สำหรับฐานอื่น ๆ ส่วนใหญ่
JB

@JB: คุณกำลังใช้ bc อยู่ไหน? GNU bc ควรทำงาน sysconf(_SC_BC_BASE_MAX)ส่งคืน 99 บนระบบของฉัน 16 เป็นขั้นต่ำที่ต้องการ
ninjalj

@JB: โปรดทราบด้วยว่าการแก้ไขครั้งก่อนหน้านี้ซึ่งมีรถฉันก็แค่อ่านคำถามที่ต้องการ
ninjalj

bc 1.06 ตอนนี้คุณพูดถึงมันฉันได้รับร่างจาก manpage แต่อ่านผิด 16 คือขีด จำกัด ฐานอินพุต ขีด จำกัด ฐานการส่งออกคือ 999. ฉันลองรุ่นก่อนหน้ามาดูกันอีกแล้วตอนนี้
JB

1
ฉันคิดว่าอันนี้ส่งออกตัวอักษรตัวพิมพ์ใหญ่สำหรับฐาน 11-16 แทนตัวพิมพ์เล็ก คุณสามารถบันทึกไม่กี่แปลงฐานโดยใช้แทนdc bc
Nabb




-1

จาวาสคริปต์ 170 ไบต์

function f1(ni,nr){
let s1='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
let s2='';
while(ni>0){
s2=s1[ni%nr]+s2;
ni=Math.floor(ni/nr);
}
return s2;
}

สิ่งนี้สามารถเล่นกอล์ฟได้หลายวิธีเช่นการลบช่องว่างการย่อชื่อตัวแปรการลบรหัสที่ไม่มีประโยชน์ (เช่นlet) และการลดสตริงที่ค่อนข้างยาว
Jo King

คำถามนี้ถูกติดแท็กcode-golfดังนั้นคุณควรพยายามย่อรหัสของคุณให้สั้นที่สุด การตีกอล์ฟที่รวดเร็วของสิ่งที่ฉันกล่าวถึงสามารถทำให้ขนาด 125 ไบต์และสั้นลงอีกมาก
โจคิง

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