Verilen yarıçapla dizgenin tamsayısı


13

Bir tamsayıyı 2 ile 62 arasında bir yarıçap verilen sayısal bir gösterime dönüştürmek için en kısa işlevi yazın.

to_string(351837066319, 31) => "codegolf"

2
Topladığım örnekten küçük harfler önce gelir, yani taban 62'deki rakamlar bu sırayla 0-9, az, AZ olur mu?
sepp2k

Evet, aynen öyle.
Michiel de Mare

at 0:00, dang, mükemmel.
Zacharý

Yanıtlar:


4

dc - 43 karakter

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

Yığının yalnızca iki argümanı içerdiğini varsayarsak bunu biraz kısaltabiliriz.

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

Bağımsız bir program olarak, sadece 37 karaktere ihtiyacımız var:

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

Bunun yerine kullanmanın [39+]sz9<z, biz sadece kullanmak Z39*+bir çift haneli sayı için tek haneli bir sayı için 39 ekleyin ve 78 olan,. Bunun yerine 113kullanırız B3( ADayrıca çalışır).


4

Ruby 1.8 - 75 karakter, özyineleme ile.

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

Özyineleme olmadan

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}

(her ikisi de Dogbert'in 1.9 çözümüne dayanmaktadır.)


4

Python - 86

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

String ithalat hilesi için Hoa Long Tam nedeniyle kredi


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'

DÜZENLEME : "veya" 0 "" boş dize durumu için eklendi


N = 0 olduğunda başarısız olur, '0' döndürmesi gerektiğinde boş bir dize döndürür. Her neyse +1 dize numarası için
Juan

2

dc, 61 karakter

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

Olarak çalıştırmak:

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

veya:

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

Açıklama: Numarayı ve yığının temelini alıyoruz. srtabanı kayıt defterine kaydeder r. Özyinelemeli işlev, [lr~rd0<x]dsxxbir sayıyı TOStabandaki rakamlarına ayırır register r. İlk hane her zaman 0'dır, yığından kaldırılır k(varsayılan olarak 0 olan kesinlik de ayarlanır, bu yüzden bir nop'a eşdeğerdir). Ardından, özyinelemeli işlev [48+d57<ad122<banz0<p]dspx, a ( [39+]sa) ve b ( [58-]sb) işlevlerinin yardımıyla ASCII'deki her bir basamağın çıktısını verir . IPyeni satır çıktısı verir. İşlev kayıt defterinde saklanır fve tarafından çağrılabilir lfx.


1
48+ değerini sonuna kadar hareket ettirirseniz iki tasarruf sağlar (57 ve 122 karakterleri bir karakter düşürür). Ayrıca küçük bir gözetim, bir işlev olarak, yığın üzerinde başka bir şey olmadığını varsayamazsınız, ancak döngüleri birleştirirseniz (bu da birkaç karakter kaydeder) sorun çözülecektir.
Nabb

2

Yakut - 72 70 59 karakter

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

Özyineleme olmadan, 70 karakter

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

Ölçek

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

1

Haskell, 109 karakter

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 karakter

Veya programınızın diğer bölümlerini sol alttan yönlendirmek istiyorsanız 53 + 46 = 99 karakter.

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

Önce dönüştürülecek sayıyı yığına, ardından sayıya yerleştirin ve bu işlevi sol üst köşeden sağa doğru girin. Dizeyi sizin için çıkarır (Befunge dize değişkenlerini desteklemediğinden) ve aşağıdan $aşağı doğru ayrılır . (1,1)Sayı tabanı depolaması için hücre gerektirir .

Örneğin verilen örnek 351837066319için girdiye girin ve çalıştırın:

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

1

Golfscript - 32 karakter

{base{.9>39*+.74>58*48--}%''+}:f

1

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

Boş dize için '0' ile 95 89 82 karakter:

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 - ne yazık ki sadece 36 bazında çalışıyor:

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

2
Sen yerini alabilir ]+[ile 's ,.
Nemo157

1

Bash, 79 karakter

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

BC_BASE_MAX 16 olarak belgelenmiştir. Hangi mucizenin çıktıyı örnek girdisinde doğru yaptığını bilmiyorum, ancak diğer bazların çoğu için çöp çıktısı (yani alfasayısal olmayan karakterler).
JB

@JB: Hangi BC'yi kullanıyorsunuz? GNU bc çalışmalıdır. sysconf(_SC_BC_BASE_MAX)Sistemimde 99 döndürür, 16 gereken minimum değerdir.
ninjalj

@JB: Ayrıca, buggy, önceki soru revizyonları sadece soru gereksinimleri eksik olduğunu unutmayın.
ninjalj

m.ö. 1.06. Şimdi söylüyorsun, figürü sayfadan aldım, ama yanlış okudum. 16, giriş taban sınırıdır. Çıkış taban sınırı 999'dur. İlk olarak daha önceki bir sürümü denedim, şimdi tekrar görelim.
JB

1
Sanırım bu, 11-16 bazları için küçük harf yerine büyük harf çıktısı veriyor. Bunun dcyerine kullanarak temel dönüşümde birkaçını kaydedebilirsiniz bc.
Nabb




-1

JavaScript 170 bayt

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

Bu, boşlukları kaldırmak, değişken adlarını kısaltmak, işe yaramaz kodu kaldırmak (örneğin let) ve bu oldukça uzun dizeyi azaltmak gibi çok daha fazla yolla golf edilebilir
Jo King

Bu soru kod-golf olarak etiketlenmiştir , bu nedenle kodunuzu mümkün olduğunca kısaltmaya çalışmalısınız. Bahsettiğim şeylerin bazı hızlı golfleri bu 125 bayt yapabilir ve kısaltmak için çok daha fazlası var
Jo King

@ Teşekkürler hayır teşekkürler.
Steven Penny
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.