Мы можем немного сократить это, если предположим, что стек содержит только два аргумента.
[[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также работает).
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.
Если вы переместитесь на 48+ до конца, это спасет два (57 и 122 оба выпадут с одного персонажа). Также незначительным упущением является то, что в качестве функции вы не можете предполагать, что в стеке больше ничего нет, но проблема будет устранена, если вы объедините циклы (что также сохранит несколько символов).
Или 53 + 46 = 99 символов, если вы хотите направить другие части вашей программы через нижний левый угол.
11p01-\>:11g%\11g/:#v_$>:1+!#v_:45+`!#v_:75*`!#v_ v
^ < ^, $# +"0" < +"'" <-":"<
Сначала поместите число, которое нужно преобразовать, в стек, затем ось и введите эту функцию слева направо. Выведет строку для вас (поскольку Befunge не поддерживает строковые переменные) и уйдет снизу $вниз. Требуется (1,1)ячейка для хранения радиуса.
Например, для приведенного примера вставьте его 351837066319во вход и запустите:
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.
at 0:00
черт, идеально.Ответы:
Ruby 1.8 - 75 символов, с рекурсией.
Без рекурсии
(оба основаны на решении 1,9 Догберта.)
источник
Питон - 86
Кредит за счёт Hoa Long Tam за уловку импорта строк
источник
DC - 43 символа
Мы можем немного сократить это, если предположим, что стек содержит только два аргумента.
В качестве отдельной программы нам нужно всего 37 символов:
Вместо использования
[39+]sz9<z
мы просто используемZ39*+
, что добавит 39 для однозначного числа и 78 для двузначного числа. Вместо этого113
мы используемB3
(AD
также работает).источник
Питон,
9399РЕДАКТИРОВАТЬ : "или '0'" добавлено для случая пустой строки
источник
DC, 61 символ
Беги как:
или:
Пояснение: Мы берем число и основываемся на стеке.
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
.источник
Рубин -
727059 символовБез рекурсии, 70 символов
Тестовое задание
источник
Haskell, 109 символов
источник
Befunge - 53 x 2 = 106 символов
Или 53 + 46 = 99 символов, если вы хотите направить другие части вашей программы через нижний левый угол.
Сначала поместите число, которое нужно преобразовать, в стек, затем ось и введите эту функцию слева направо. Выведет строку для вас (поскольку Befunge не поддерживает строковые переменные) и уйдет снизу
$
вниз. Требуется(1,1)
ячейка для хранения радиуса.Например, для приведенного примера вставьте его
351837066319
во вход и запустите:источник
Golfscript - 32 символа
источник
Рубин 1.9 -
807468t = -> n, b {d = ? 0 ..? 9 ,? a ..? z, *? A ..? Z; s = ''; (s = d [n% b] + s; n / = б) при n> 0; s}
С '0' для пустой строки,
958982 символов:Ruby 1.9 - к сожалению, работает только до 36 базы:
источник
]+[
«с с,
.Баш, 79 символов
источник
sysconf(_SC_BC_BASE_MAX)
возвращает 99 в моей системе, 16 является минимально необходимым.dc
вместоbc
.