Целое число для строки с заданным основанием

13

Напишите самую короткую функцию, чтобы преобразовать целое число в числовое представление с учетом радиуса от 2 до 62. Например:

to_string(351837066319, 31) => "codegolf"
Михель де Маре
источник
2
Из примера я понял, что строчные буквы идут первыми, то есть цифры в базе 62 - это 0-9, az, AZ в этом порядке?
sepp2k
Да, именно так.
Мишель де Маре
at 0:00черт, идеально.
Захари

Ответы:

4

Ruby 1.8 - 75 символов, с рекурсией.

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}

(оба основаны на решении 1,9 Догберта.)

Михель де Маре
источник
4

Питон - 86

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

Кредит за счёт Hoa Long Tam за уловку импорта строк

Juan
источник
3

DC - 43 символа

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

Мы можем немного сократить это, если предположим, что стек содержит только два аргумента.

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

В качестве отдельной программы нам нужно всего 37 символов:

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

Вместо использования [39+]sz9<zмы просто используем Z39*+, что добавит 39 для однозначного числа и 78 для двузначного числа. Вместо этого 113мы используем B3( ADтакже работает).

Nabb
источник
3

Питон, 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'

РЕДАКТИРОВАТЬ : "или '0'" добавлено для случая пустой строки

Хоа Лонг Там
источник
Сбой, когда n = 0, возвращает пустую строку, когда она должна вернуть «0». Во всяком случае +1 для струнного трюка
Хуан
2

DC, 61 символ

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

Беги как:

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

или:

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

Пояснение: Мы берем число и основываемся на стеке. srсохраняет базу в регистре r. Рекурсивная функция [lr~rd0<x]dsxxразбивает число TOSна цифры в базе register r. Первая цифра всегда равна 0, она удаляется из стека k(задайте точность, которая по умолчанию также равна 0, поэтому она эквивалентна nop). Затем рекурсивная функция [48+d57<ad122<banz0<p]dspxвыводит каждую цифру в ASCII с помощью функций a ( [39+]sa) и b ( [58-]sb). IPвыводит новую строку. Функция хранится в регистре fи может быть вызвана с помощью lfx.

ninjalj
источник
1
Если вы переместитесь на 48+ до конца, это спасет два (57 и 122 оба выпадут с одного персонажа). Также незначительным упущением является то, что в качестве функции вы не можете предполагать, что в стеке больше ничего нет, но проблема будет устранена, если вы объедините циклы (что также сохранит несколько символов).
Наб
2

Рубин - 72 70 59 символов

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

Без рекурсии, 70 символов

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

Тестовое задание

irb(main):080:0> f[351837066319, 31]
=> "codegolf"
irb(main):081:0> f[0, 31]
=> "0"
Уайл Э. Койот
источник
1

Haskell, 109 символов

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
источник
1

Befunge - 53 x 2 = 106 символов

Или 53 + 46 = 99 символов, если вы хотите направить другие части вашей программы через нижний левый угол.

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

Сначала поместите число, которое нужно преобразовать, в стек, затем ось и введите эту функцию слева направо. Выведет строку для вас (поскольку Befunge не поддерживает строковые переменные) и уйдет снизу $вниз. Требуется (1,1)ячейка для хранения радиуса.

Например, для приведенного примера вставьте его 351837066319во вход и запустите:

&56*1+    11p01-\>:11g%\11g/:#v_$>:1+!#v_:45+`!#v_:75*`!#v_   v
                 ^            <  ^,    $# +"0"  < +"'"   <-":"<
                                       @
Nemo157
источник
1

Golfscript - 32 символа

{base{.9>39*+.74>58*48--}%''+}:f
Nabb
источник
1

Рубин 1.9 - 80 74 68

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

С '0' для пустой строки, 95 89 82 символов:

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 - к сожалению, работает только до 36 базы:

t=->n,b{n.to_s(b)}
Майкл Коля
источник
2
Вы можете заменить ]+[«с с ,.
Nemo157
1

Баш, 79 символов

f(){
dc<<<$2o$1p|perl -pe"y/A-Z/a-z/;s/ \d+/chr$&+($&<10?48:$&<36?87:29)/ge"
}
ninjalj
источник
BC_BASE_MAX задокументировано как 16. Я не знаю, какое чудо делает вывод прямо на образце ввода, но выводит мусор (то есть не алфавитные символы) для большинства других баз.
JB
@JB: какой bc вы используете? GNU bc должен работать. sysconf(_SC_BC_BASE_MAX)возвращает 99 в моей системе, 16 является минимально необходимым.
ниндзя
@JB: также обратите внимание, что в предыдущих ревизиях с ошибками я только что просмотрел вопрос требований.
ниндзя
до н.э. 1,06. Теперь вы упомянули об этом, я получил рисунок из справочной страницы, но неправильно прочитал. 16 - предел входной базы. Выходной базовый предел составляет 999. Сначала я попробовал более раннюю версию, теперь посмотрим снова.
JB
1
Я думаю, что это выводит заглавные буквы для оснований 11-16 вместо строчных. Вы можете сэкономить несколько при базовом преобразовании, используя dcвместо bc.
Наб