Numero intero da stringare con una determinata radice


13

Scrivi la funzione più breve per convertire un numero intero in una rappresentazione numerica data una radice compresa tra 2 e 62. Ad esempio:

to_string(351837066319, 31) => "codegolf"

2
Dall'esempio ho capito che le lettere minuscole vengono per prime, ovvero le cifre nella base 62 sono 0-9, az, AZ in quell'ordine?
sepp2k,

Sì, esattamente, tutto qui.
Michiel de Mare,

at 0:00, dang, perfetto.
Zacharý,

Risposte:


4

Rubino 1,8 - 75 caratteri, con ricorsione.

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

Senza ricorsione

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}

(entrambi basati sulla soluzione 1.9 di 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'

Ringraziamo Hoa Long Tam per il trucco dell'importazione delle stringhe


3

dc - 43 caratteri

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

Possiamo accorciarlo un po 'se assumiamo che lo stack contenga solo i due argomenti.

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

Come programma autonomo, abbiamo bisogno solo di 37 caratteri:

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

Invece di usare [39+]sz9<z, usiamo semplicemente Z39*+, che aggiungerà 39 per un numero a singola cifra e 78 per un numero a doppia cifra. Invece di 113, usiamo B3( ADfunziona anche).


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'

EDIT : "o '0'" aggiunto per il caso stringa vuota


Non riesce quando n = 0, restituisce una stringa vuota quando deve restituire '0'. Comunque +1 per il trucco della corda
Juan,

2

dc, 61 caratteri

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

Correre come:

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

o:

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

Spiegazione: Prendiamo il numero e la base nello stack. srsalva la base nel registro r. La funzione ricorsiva [lr~rd0<x]dsxxdecompone un numero TOSnelle sue cifre in base register r. La prima cifra è sempre 0, rimossa dallo stack da k(imposta la precisione, che di default è anche 0, quindi equivale a un nop). Quindi, la funzione ricorsiva [48+d57<ad122<banz0<p]dspxgenera ciascuna cifra in ASCII, con l'aiuto delle funzioni a ( [39+]sa) e b ([58-]sb ). IPgenera una nuova riga. La funzione è memorizzata nel registro fe può essere invocata da lfx.


1
Se passi di 48+ alla fine ne salva due (57 e 122 rilasciano un personaggio). Anche una svista minore è che, come funzione, non si può presumere che non ci sia nient'altro nello stack, ma il problema verrebbe rimosso se si unissero i loop (che salverebbero anche alcuni caratteri).
Nabb,

2

Rubino - 72 70 59 caratteri

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

Senza ricorsione, 70 caratteri

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"

1

Haskell, 109 personaggi

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 caratteri

Oppure 53 + 46 = 99 caratteri se sei disposto a instradare altre parti del programma in basso a sinistra.

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

Posiziona prima il numero da convertire nello stack, quindi il radix e inserisci questa funzione dall'angolo in alto a sinistra andando a destra. Produrrà la stringa per te (poiché Befunge non supporta le variabili di stringa) e partirà dal basso $verso il basso. Richiede la (1,1)cella per l'archiviazione di Radix.

Ad esempio, per l'esempio fornito, inserisci 351837066319l'input ed esegui:

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

1

Golfscript - 32 caratteri

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

1

Rubino 1.9 - 80 74 68

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

Con '0' per stringa vuota, 95 89 82 caratteri:

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 - purtroppo funziona solo fino alla base 36:

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

2
Puoi sostituire ]+['s con ,.
Nemo157,

1

Bash, 79 caratteri

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

BC_BASE_MAX è documentato come 16. Non so quale miracolo produca l'output sull'input di esempio, ma genera immondizia (ovvero caratteri non alfanici) per la maggior parte delle altre basi.
JB

@JB: quale bc stai usando? GNU bc dovrebbe funzionare. sysconf(_SC_BC_BASE_MAX)restituisce 99 sul mio sistema, 16 è il minimo richiesto.
ninjalj,

@JB: nota anche che le revisioni precedenti erano buggy, avevo appena sfiorato i requisiti della domanda.
ninjalj,

bc 1.06. Ora me lo dici, ho preso la figura dalla manpage, ma l'ho fraintesa. 16 è il limite della base di input. Il limite della base di output è 999. Ho provato prima una versione precedente, ora vediamo di nuovo.
JB

1
Penso che questo produca lettere maiuscole per le basi 11-16 invece che minuscole. Puoi salvarne alcuni alla conversione di base usando dcinvece di bc.
Nabb,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.