Liczba całkowita do ciągu o podanej podstawie

13

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"
Michiel de Mare
źródło
2
Z przykładu, który wyciągam, pierwsze są małe litery, tzn. Cyfry w bazie 62 to 0-9, az, AZ w tej kolejności?
sepp2k
Tak, dokładnie to wszystko.
Michiel de Mare
at 0:00, kochanie, idealnie.
Zacharý

Odpowiedzi:

4

dc - 43 znaki

[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).

Nabb
źródło
4

Ruby 1,8 - 75 znaków, z rekurencją.

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

Bez rekurencji

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).

Michiel de Mare
źródło
4

Python - 86

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

Kredyt należny Hoa Long Tam za lewę za importowanie łańcucha

Juan
źródło
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'

EDYCJA : dodano „lub” 0 dla pustej wielkości ciągu

Hoa Long Tam
źródło
Nie powiedzie się, gdy n = 0, zwraca pusty ciąg, gdy powinien zwrócić „0”. W każdym razie +1 za trick lewy
Juan
2

dc, 61 znaków

[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.

ninjalj
źródło
1
Jeśli przesuniesz 48+ do końca, uratujesz dwa (57 i 122 oba upuszczają postać). Drobnym niedopatrzeniem jest również to, że jako funkcja nie można zakładać, że na stosie nie ma nic innego, ale problem zostałby usunięty, jeśli scalono się pętle (co zaoszczędziłoby również kilka znaków).
Nabb,
2

Rubin - 72 70 59 znaków

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

Bez rekurencji 70 znaków

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

Test

irb(main):080:0> f[351837066319, 31]
=> "codegolf"
irb(main):081:0> f[0, 31]
=> "0"
Dogbert
źródło
1

Haskell, 109 znaków

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
sepp2k
źródło
1

Befunge - 53 x 2 = 106 znaków

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"  < +"'"   <-":"<
                                       @
Nemo157
źródło
1

Golfscript - 32 znaki

{base{.9>39*+.74>58*48--}%''+}:f
Nabb
źródło
1

Rubinowy 1,9 - 80 74 68

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)}
Michael Kohl
źródło
2
Można wymienić ]+[„sz ,.
Nemo157,
1

Bash, 79 znaków

f(){
dc<<<$2o$1p|perl -pe"y/A-Z/a-z/;s/ \d+/chr$&+($&<10?48:$&<36?87:29)/ge"
}
ninjalj
źródło
BC_BASE_MAX jest udokumentowany jako 16. Nie wiem, jaki cud sprawia, że ​​dane wyjściowe trafiają na przykładowe dane wejściowe, ale generuje śmieci (tj. Znaki inne niż alfanum) dla większości innych baz.
JB
@JB: którego komputera używasz? GNU bc powinien działać. sysconf(_SC_BC_BASE_MAX)zwraca 99 w moim systemie, 16 to minimum wymagane.
ninjalj
@JB: zauważ także, że poprzednie wersje, w których znajdował się błąd, właśnie przejrzałem wymagania dotyczące pytań.
ninjalj
bc 1.06. Teraz, kiedy o tym wspominasz, dostałem postać ze strony podręcznika, ale źle ją odczytałem. 16 to wejściowy limit bazowy. Podstawowy limit wyjściowy to 999. Najpierw spróbowałem na wcześniejszej wersji, zobaczmy to teraz.
JB
1
Myślę, że ten wypisuje wielkie litery dla zasad 11-16 zamiast małych. Możesz zapisać kilka przy konwersji bazowej, używając dczamiast bc.
Nabb,
1

Python 2 , 66 bajtów

from string import*
f=lambda n,b:n and f(n/b,b)+printable[n%b]or''

Wypróbuj online!

Jitse
źródło
0

Perl 5 -Minteger -ap , 52 bajty

do{$\=(0..9,a..z,A..Z)[$_%$F[1]].$\}while$_/=$F[1]}{

Wypróbuj online!

Xcali
źródło
-1

JavaScript 170 bajtów

function f1(ni,nr){
let s1='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
let s2='';
while(ni>0){
s2=s1[ni%nr]+s2;
ni=Math.floor(ni/nr);
}
return s2;
}
Steven Penny
źródło
Można to zagrać w golfa na wiele innych sposobów, na przykład usuwając białe spacje, skracając nazwy zmiennych, usuwając niepotrzebny kod (jak let) i redukując ten dość długi ciąg znaków
Jo King
To pytanie jest oznaczone kodem golfowym , więc powinieneś starać się maksymalnie skrócić swój kod. Szybka gra w golfa o rzeczach, o których wspomniałem, może sprawić, że 125 bajtów , i jest o wiele więcej do skrócenia
Jo King
@JoKing nie, dziękuję.
Steven Penny