Для любого натурального числа k
, пусть d(k)
обозначает число делителей k
. Например, d(6)
это 4
, так как 6
имеет 4
делителей (а именно 1
, 2
, 3
, 6
).
Учитывая положительное целое число N
, отображение «горизонта» в ASCII искусства , используя фиксированный характер, таким образом, что высота «здания» , расположенной в горизонтальном положении k
является d(k)
для k = 1, ..., N
. Смотрите тестовые случаи ниже.
правила
- Любой непробельный символ может использоваться последовательно, не обязательно,
#
как показано в тестовых примерах. - Алгоритм теоретически должен работать для сколь угодно высокого
N
. На практике это приемлемо, если программа ограничена временем, памятью, размером типа данных или размером экрана. - Разрешены горизонтальные или вертикальные начальные или конечные пробелы или переводы строк.
- Ввод и вывод могут быть приняты любым разумным способом .
- Программы или функции разрешены на любом языке программирования . Стандартные лазейки запрещены.
- Самый короткий код в байтах побеждает.
Контрольные примеры
N = 10
:
# # #
# # ###
#########
##########
N = 50
:
#
# #
# # # # # #
# # # # # #
# # # # # # # # # # ## # #
# # # # # # # # # # # ## # #
# # # # ### # ### # ### # ##### ### # ### # #
# # ### # ### # ### ##### # ##### ### # ### ###
#################################################
##################################################
N = 200
:
#
#
# # #
# # # #
# # # # #
# # # # #
# # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # ## # # # # # # # # # ## # # # # # # # # # # # # # # # # # # ## # ## # #
# # # # # # # # # # # # # # # # # # # # # ## # # # # # # # # # ## # # # # # # # # # # # # # # # # # # ## # ## # #
# # # # # # # # # # ## # # # # # # ## # # # # ## # # # # # # # ### # ## # # # # ## # # # # # # ## # # # ## # ### # # # ## # ### ### # # # # ### # ## # #
# # # # # # # # # # # ## # # # # # # ## # # # # ## # ## # # # # # ### # ## # # # # ## # # # # # # ## # # # ## # ### # # # ## # ### ### # # # # ### # ## # #
# # # # ### # ### # ### # ##### ### # ### # ### ##### # ##### ### # ##### ### ##### ####### ### # ### # ### ####### ##### ### ##### # ######### # ##### ##### ### # ### ##### # ######### # ### # #
# # ### # ### # ### ##### # ##### ### # ### ##### ##### # ##### ### # ##### ### ##### ####### ### # ### # ### ############# ### ##### # ######### # ##### ##### ### ##### ##### # ######### # ### # #
#######################################################################################################################################################################################################
########################################################################################################################################################################################################
C,
9995929190 байтСмотрите, это работает здесь .
источник
Октава,
414032 байтаБлагодаря @StewieGriffin сэкономлено 8 байт.
Попробуйте онлайн!
Предыдущие ответы:
Попробуйте онлайн!
Попробуйте онлайн!
Объяснение:
источник
@(N)" #"(sort(~mod(k=1:N,k')+1))
экономит вам несколько байтов :) Однако вы получаете несколько ведущих строк, но я не уверен, каковы правила в этом отношении.@(N)['',35*sort(~mod(k=1:N,k'))]
.mod(1:N,(1:N).')
приемлемым в MATLAB?Haskell , 71 байт
f
принимаетInt
и возвращаетString
.Попробуйте онлайн!
m
являетсяN
OP (переменные Haskell должны быть в нижнем регистре.)l=[1..m]
используется в представлениях вложенного списка для итерации по всем строкам, столбцам и потенциальным делителям. Это означает, что некоторые дополнительные начальные строки заполнены пробелами.n
является столбцом (также проверяется число),i
является строкой.['#'|0<-mod n<$>l]
список'#'
символов с длиной делителейn
.источник
Октава, 61 байт
Объяснение:
Несколько вещей, которые я хочу выделить
Что происходит внутри цикла (предположим, ввод
6
)1,2,4
)1,2,3,6
)Наконец , мы перевернуть его, и преобразует его в строку, неявно изменяя
0
к32
:источник
Python 3 , 111 байт
Попробуйте онлайн!
Это создает некоторые ведущие вертикальные пробелы
источник
APL (Dyalog) , 19 байтов
Попробуйте онлайн!
⎕
получить оцененный ввод ( N )⍳
1 ... N∘.|⍨
таблица остатков деления с 1 ... N как вертикальной, так и горизонтальной осью0=
где равен нулю (т.е. делится)+⌿
сумма столбцов (т. е. дает количество делителей для каждого числа)'#'⍴¨⍨
использовать каждое число, чтобы изменить форму хеш-символа (дает список строк)↑
mix (список строк в таблице строк)⍉
транспонирования⊖
перевернуть с ног на головуисточник
Mathematica,
5957 байтисточник
50
с#
и добавления&
. Вы также можете сохранить некоторые байты с помощью инфиксной нотации:X~Table~#&
и0~DivisorSigma~Range@#
C #,
333281 байтС переносами строк:
Хотя я уверен, что это возможно и короче, я надеюсь, что вместе мы найдем более короткое решение;)
Сохранено 52 байта с помощью разнагула
источник
using
-statement.using System.Linq;using C=System.Console;n=>{var v=new int[n];for(var k=1,i;++k<=n;)for(i=1;i<k;)if(k%i++==0)v[k-1]++;for(var i=0,u;i<v.Length;i++)for(u=v.Max()-v[i];u<v.Max();){C.SetCursorPosition(i, u++);C.Write("#");}};
компилировать в anAction
, перемещать инкременты и несколько других незначительных настроек. Я не проверял это, но это должно работать.Mathematica, 99 байтов
для N = 50
источник
(T=0~DivisorSigma~Range@#;Row[Column/@Table[Join[Table[,Max@T-T[[i]]],$~Table~T[[i]]],{i,1,#}]])&
Древесный уголь ,
232220 байтПопробуйте онлайн! Ссылка на подробную версию кода. Редактировать: 1 байт сохранен путем цикла
k
от0
доi-1
и добавления1
внутри цикла. Сохранены еще два байта, не сохраняя входные данные в переменной. Объяснение:Редактировать: Этот 18-байтовый «однострочный» (ссылка на подробную версию кода) не работал бы с версией Charcoal на момент подачи вопроса: попробуйте онлайн!
источник
05AB1E , 12 байтов
Код:
Объяснение:
Использует кодировку 05AB1E . Попробуйте онлайн!
источник
ζ
вместо.Bø
? Кроме того, персонаж не должен быть#
ζ
тогда не существовалоPython 2 , 101 байт
Попробуйте онлайн!
Это создает (много) вертикально ведущих пробелов. Он печатает всего
N
строк, большинство из которых, как правило, будут пустыми.источник
Japt ,
34 33 1614 байтСохранено 17 байт благодаря @ETHproductions
Попробуйте онлайн!
источник
z
заполнение:õ_â lã'#pX÷z w
J , 28 байт
Определяет монадический глагол. Попробуйте онлайн!
объяснение
источник
PHP, 126 байт
Попробуйте онлайн!
источник
Брахилог , 34 байта
Попробуйте онлайн!
источник
Алиса , 33 байта
Попробуйте онлайн!
Ввод (к сожалению) в виде кодовой точки . По крайней мере, он читает символ UTF-8, поэтому вы можете использовать более крупные входные данные, чем 255, но они все еще ограничены, и это довольно болезненный формат ввода. Для трех дополнительных байтов мы можем прочитать десятичное целое число:
Попробуйте онлайн!
Непробельный символ в выходных данных
!
.Обратите внимание, что решение также печатает тонну начальных пробелов (оно всегда начинается с пустой строки, а затем печатает
NxN
сетку, так что для большихN
будет много строк пробелов до первых!
s).объяснение
Я использовал и объяснил
&w...k
конструкцию раньше (например, здесь ). Это изящная маленькая идиома, которая выдает целое число n и затем запускает фрагмент кода n + 1 раз (следовательно, обычно он используетсяt&w...k
для запуска цикла n раз сt
уменьшением входного значения). Это делается путем работы со стеком обратных адресов (RAS).w
отправляет текущий IP-адрес в RAS, и если мы повторим его,&
то адрес будет передан n раз.k
выскакивает один адрес из RAS и перепрыгивает туда. Если RAS пустой, он вообще ничего не делает и цикл завершается.Вы можете заметить, что эти циклы не так уж просто вложить, потому что в конце внутреннего цикла стек не пуст, поэтому
k
он не становится недоступным. Вместо этого IP будет возвращаться к началу внешнего цикла. Общий способ исправить это - заключить внутренний цикл в собственную подпрограмму. Но если мы можем расположить вложенный цикл так, чтобы внешний цикл заканчивался внутренним циклом, мы можем фактически использовать это поведение и даже сэкономить на одномk
!Итак, эта конструкция:
Это рабочий вложенный цикл, который выполняет
XYYYXYYYXYYY...
(для некоторого числаY
s в каждой итерации). Довольно неплохо, что мы можем завершить оба цикла однимk
, потому что он будет использовать внешний адрес из RAS каждый раз, когда внутренние адреса были исчерпаны.Эта идиома используется в программе для запуска цикла по выходной сетке.
источник
На самом деле 25 байтов
Попробуйте онлайн!
22-байтовая версия с большим количеством ведущих строк
Попробуйте онлайн!
источник
R,
8382 байта-1 байт благодаря MickyT
Читает
N
со стандартного ввода.Попробуйте онлайн!
источник
!=0
может быть>0
Pyth , 16 байт
Попробуйте онлайн!
источник
SpecBAS - 149 байт
Массив отслеживает количество делителей, а затем печатает правильное количество символов до положения экрана 50.
источник
PHP, 99 байт
печатает один ведущий пробел; запустить как трубу с
php -nr '<code>'
или попробуйте онлайн .сломать
источник
PowerShell, 101 байт
Менее гольф тестовый скрипт:
Выход:
источник
SOGL V0.12 , 8 байтов
Попробуй это здесь!
источник
Wolfram Language (Mathematica) ,
4644 байтаПопробуйте онлайн! Но, возможно, попробуйте это онлайн! с ColumnForm вместо Grid , так
Grid
как не работает в TIO. В Mathematica это выглядит лучше:Третье решение Mathematica ...
Divisors@Range@#
находит все делители в желаемом диапазоне, а затем мы умножаем на0
и вычитаем" "
, делая каждый делитель равным-" "
.PadLeft
добавляет нули слева, создавая горизонтальный горизонт, ориентацию которого мы фиксируем с помощью
=\[Transpose]
. Наконец, добавление" "
ко всему , делает все записи либо0
или" "
.В качестве альтернативы, 59-байтовый
""<>Riffle[PadLeft["X"-" "+0Divisors@Range@#]+" ","\n"]&
вывод строки.источник
Добавить ++ , 58 байт
Попробуйте онлайн!
Как это устроено
g
k
g
k
#
источник