Napisz najkrótszą funkcję, aby przekonwertować liczbę całkowitą na reprezentację liczbową, podając podstawnik od 2 do 62. np .:
to_string(351837066319, 31) => "codegolf"
at 0:00, kochanie, idealnie.
Napisz najkrótszą funkcję, aby przekonwertować liczbę całkowitą na reprezentację liczbową, podając podstawnik od 2 do 62. np .:
to_string(351837066319, 31) => "codegolf"
at 0:00, kochanie, idealnie.
Odpowiedzi:
[sb[58-]s_[lb~dZ39*+dB3<_9+rd0<xrP]dsxxk]sf
Możemy to trochę skrócić, jeśli założymy, że stos zawiera tylko dwa argumenty.
[[58-]s_dSb~dZ39*+dB3<_9+SadLbr0<fLaPc]sf
Jako samodzielny program potrzebujemy tylko 37 znaków:
?o[58-]s_[O~dZ39*+dB3<_9+rd0<xrP]dsxx
Zamiast używać [39+]sz9<z, po prostu używamy Z39*+, co doda 39 dla liczby jednocyfrowej i 78 dla liczby dwucyfrowej. Zamiast tego 113używamy B3( ADrównież działa).
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}
(oba oparte na rozwiązaniu Dogberta 1.9).
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'
EDYCJA : dodano „lub” 0 dla pustej wielkości ciągu
[sr[lr~rd0<x]dsxxk[39+]sa[58-]sb[d9<ad78<b48+anz0<p]dspxIP]sf
Uruchom jako:
dc -e'[sr[lr~rd0<x]dsxxk[39+]sa[58-]sb[d9<ad78<b48+anz0<p]dspxIP]sf' -e'351837066319 31 lfx'
lub:
dc -f base.dc -e '351837066319 31 lfx'
Objaśnienie: Bierzemy liczbę i bazę na stosie. srzapisuje bazę w rejestrze r. Funkcja rekurencyjna [lr~rd0<x]dsxxrozkłada liczbę TOSna cyfry w bazie register r. Pierwszą cyfrą jest zawsze 0, usuwana ze stosu przez k(ustaw dokładność, która domyślnie wynosi również 0, więc jest równoważna nop). Następnie funkcja rekurencyjna [48+d57<ad122<banz0<p]dspxwypisuje każdą cyfrę w ASCII za pomocą funkcji a ( [39+]sa) i b ( [58-]sb). IPwypisuje nowy wiersz. Funkcja jest przechowywana w rejestrze fi można ją wywołać przez lfx.
Lub 53 + 46 = 99 znaków, jeśli chcesz przekierować inne części programu przez lewy dolny róg.
11p01-\>:11g%\11g/:#v_$>:1+!#v_:45+`!#v_:75*`!#v_ v
^ < ^, $# +"0" < +"'" <-":"<
Najpierw umieść liczbę do przeliczenia na stosie, a następnie podstawkę i wprowadź tę funkcję od lewego górnego rogu w prawo. Wyśle ci ciąg (ponieważ Befunge nie obsługuje zmiennych ciągów) i odejdzie od dołu w $dół. Wymaga (1,1)komórki do przechowywania radix.
Np. Dla podanego przykładu wstaw 351837066319do wejścia i uruchom:
&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) podczas gdy n> 0; s}
Z „0” dla pustego ciągu, 95 89 82 znaków:
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 - niestety działa tylko do bazy 36:
t=->n,b{n.to_s(b)}
]+[„sz ,.
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)zwraca 99 w moim systemie, 16 to minimum wymagane.
dczamiast bc.
from string import*
f=lambda n,b:n and f(n/b,b)+printable[n%b]or''
-Minteger -ap , 52 bajtydo{$\=(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) i redukując ten dość długi ciąg znaków