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"
at 0:00, dang, mükemmel.
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"
at 0:00, dang, mükemmel.
Yanıtlar:
[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).
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}
(her ikisi de Dogbert'in 1.9 çözümüne dayanmaktadır.)
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
[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.
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" < +"'" <-":"<
@
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)}
]+[ile 's ,.
f(){
dc<<<$2o$1p|perl -pe"y/A-Z/a-z/;s/ \d+/chr$&+($&<10?48:$&<36?87:29)/ge"
}
sysconf(_SC_BC_BASE_MAX)Sistemimde 99 döndürür, 16 gereken minimum değerdir.
dcyerine kullanarak temel dönüşümde birkaçını kaydedebilirsiniz bc.
from string import*
f=lambda n,b:n and f(n/b,b)+printable[n%b]or''
-Minteger -ap , 52 baytdo{$\=(0..9,a..z,A..Z)[$_%$F[1]].$\}while$_/=$F[1]}{
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) ve bu oldukça uzun dizeyi azaltmak gibi çok daha fazla yolla golf edilebilir