Ціле число до рядка із заданим радіусом


13

Напишіть найкоротшу функцію для перетворення цілого числа в числове подання з заданим радіусом між 2 і 62. Наприклад:

to_string(351837066319, 31) => "codegolf"

2
З прикладу я розумію, що перші букви бувають першими, тобто цифри в базі 62 є 0-9, az, AZ в такому порядку?
sepp2k

Так, саме так.
Міхель де Маре

at 0:00, данг, досконалий.
Zacharý

Відповіді:


4

постійний струм - 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також працює).


4

Рубін 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'

Кредит належить Хоа Лонг Там за фокус імпорту рядків


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'

EDIT : "" або "0" додано для регістру порожнього рядка


Помилка, коли n = 0, повертає порожній рядок, коли він повинен повернути "0". У будь-якому разі +1 за струнний трюк
Хуан

2

постійного струму, 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.


1
Якщо ви рухаєтесь до 48+ до кінця, це економить два (57 і 122 обидва краплі символу). Також незначний нагляд полягає в тому, що як функція, ви не можете припустити, що на стеку немає нічого іншого, але проблема буде усунена, якщо ви об'єднали петлі (що також збереже кілька символів).
Nabb

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

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"  < +"'"   <-":"<
                                       @

1

Гольфскрипт - 32 символи

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

1

Рубін 1,9 - 80 74 68

t = -> n, b {d = ? 0 ..? 9 ,? a ..? z, *? A ..? Z; s = ''; (s = d [n% b] + s; n / = b) поки 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"
}

BC_BASE_MAX зафіксовано як 16 років. Я не знаю, яке диво робить результат прямо на вибірці входу, але він видає сміття (тобто символи, що не буквуються) для більшості інших баз.
JB

@JB: який комп'ютер використовуєте? GNU bc повинен працювати. sysconf(_SC_BC_BASE_MAX)повертає 99 в моїй системі, 16 - мінімально необхідний.
ніндзя

@JB: також зауважте, що попередні версії, де баггі, я щойно скупився з вимогами запитання.
ніндзя

bc 1,06. Тепер ви це згадаєте, я отримав фігуру з сторінки, але неправильно її прочитав. 16 - межа базового входу. Базова межа виходу - 999. Я спершу спробував на більш ранній версії, давайте подивимось це ще раз.
JB

1
Я думаю, що цей виводить великі літери для основ 11-16 замість малих літер. Ви можете зберегти кілька в базовій конверсії, використовуючи dcзамість bc.
Набб




-1

JavaScript 170 байт

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) та зменшити цю досить довгу строку
Jo King

Це питання позначено код-гольф , тому вам слід намагатися максимально скоротити код. Деякі швидкі гольфи з речей, які я згадав, можуть зробити це 125 байтів , і там можна значно скоротити
Jo King

@JoKing не дякую
Стівен Пенні
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.