Para qualquer número inteiro positivo k
, vamos d(k)
denotar o número de divisores de k
. Por exemplo, d(6)
é 4
, porque 6
tem 4
divisores (ou seja 1
, 2
, 3
, 6
).
Dado um número inteiro positivo N
, exiba um "horizonte" na arte ASCII usando um caractere fixo, de modo que a altura do "edifício" localizado na posição horizontal k
seja d(k)
para k = 1, ..., N
. Veja os casos de teste abaixo.
Regras
- Qualquer caractere que não seja um espaço em branco pode ser usado consistentemente, não necessariamente
#
como mostrado nos casos de teste. - O algoritmo deve teoricamente funcionar arbitrariamente alto
N
. Na prática, é aceitável se o programa for limitado por tempo, memória, tamanho do tipo de dados ou tamanho da tela. - São permitidos espaços à frente ou à direita, na horizontal ou na vertical, ou novas linhas.
- A entrada e a saída podem ser obtidas por qualquer meio razoável .
- Programas ou funções são permitidos, em qualquer linguagem de programação . As brechas padrão são proibidas.
- O menor código em bytes vence.
Casos de teste
N = 10
:
# # #
# # ###
#########
##########
N = 50
:
#
# #
# # # # # #
# # # # # #
# # # # # # # # # # ## # #
# # # # # # # # # # # ## # #
# # # # ### # ### # ### # ##### ### # ### # #
# # ### # ### # ### ##### # ##### ### # ### ###
#################################################
##################################################
N = 200
:
#
#
# # #
# # # #
# # # # #
# # # # #
# # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # ## # # # # # # # # # ## # # # # # # # # # # # # # # # # # # ## # ## # #
# # # # # # # # # # # # # # # # # # # # # ## # # # # # # # # # ## # # # # # # # # # # # # # # # # # # ## # ## # #
# # # # # # # # # # ## # # # # # # ## # # # # ## # # # # # # # ### # ## # # # # ## # # # # # # ## # # # ## # ### # # # ## # ### ### # # # # ### # ## # #
# # # # # # # # # # # ## # # # # # # ## # # # # ## # ## # # # # # ### # ## # # # # ## # # # # # # ## # # # ## # ### # # # ## # ### ### # # # # ### # ## # #
# # # # ### # ### # ### # ##### ### # ### # ### ##### # ##### ### # ##### ### ##### ####### ### # ### # ### ####### ##### ### ##### # ######### # ##### ##### ### # ### ##### # ######### # ### # #
# # ### # ### # ### ##### # ##### ### # ### ##### ##### # ##### ### # ##### ### ##### ####### ### # ### # ### ############# ### ##### # ######### # ##### ##### ### ##### ##### # ######### # ### # #
#######################################################################################################################################################################################################
########################################################################################################################################################################################################
C,
9995929190 bytesVeja como funciona aqui .
fonte
Oitava,
414032 bytesGraças a @StewieGriffin, foram salvos 8 bytes.
Experimente online!
Respostas anteriores:
Experimente online!
Experimente online!
Explicação:
fonte
@(N)" #"(sort(~mod(k=1:N,k')+1))
economizando alguns bytes :) No entanto, você recebe várias linhas de primeira linha, não tenho certeza de quais são as regras nesse sentido.@(N)['',35*sort(~mod(k=1:N,k'))]
.mod(1:N,(1:N).')
aceitável no MATLAB?Haskell , 71 bytes
f
pega umInt
e retorna umString
.Experimente online!
m
é oN
do OP (as variáveis Haskell devem estar em minúsculas.)l=[1..m]
é usada nas compreensões da lista aninhada para iterar por todas as linhas, colunas e divisores em potencial. Isso significa algumas linhas iniciais extras preenchidas com espaço em branco.n
é coluna (também número marcado),i
é linha.['#'|0<-mod n<$>l]
é uma lista de'#'
caracteres com o comprimento do número de divisores den
.fonte
Oitava, 61 bytes
Explicação:
Algumas coisas que gostaria de destacar
O que acontece dentro do loop (suponha entrada
6
)1,2,4
)1,2,3,6
)Finalmente, invertemos e convertemos em uma string, alterando implicitamente o
0
para32
:fonte
Python 3 , 111 bytes
Experimente online!
Isso produz alguns espaços em branco verticais
fonte
APL (Dyalog) , 19 bytes
Experimente online!
⎕
obter entrada avaliada ( N )⍳
1 ... N∘.|⍨
tabela de divisão remanescente com 1 ... N, tanto no eixo vertical como no eixo horizontal0=
onde igual a zero (ou seja, divide)+⌿
somar as colunas (ou seja, fornece a contagem de divisores para cada número)'#'⍴¨⍨
use cada número para remodelar o caractere de hash (fornece uma lista de strings)↑
mix (lista de strings na tabela de linhas)⍉
transpor⊖
virar de cabeça para baixofonte
Mathematica,
5957 bytesfonte
50
com#
e anexando&
. Você pode salvar alguns bytes com notação infix bem:X~Table~#&
e0~DivisorSigma~Range@#
C #,
333281 bytesCom quebras de linha:
Embora eu tenha certeza de que isso também é possível, espero que consigamos juntos uma solução mais curta;)
Guardou 52 bytes com a ajuda de raznagul
fonte
using
instrução-.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("#");}};
Compile para umAction
, mova os incrementos e alguns outros pequenos ajustes. Eu não testei isso, mas deve funcionar.Mathematica, 99 bytes
para N = 50
fonte
(T=0~DivisorSigma~Range@#;Row[Column/@Table[Join[Table[,Max@T-T[[i]]],$~Table~T[[i]]],{i,1,#}]])&
Carvão ,
232220 bytesExperimente online! Link é a versão detalhada do código. Editar: salvou 1 byte fazendo um loop
k
de0
parai-1
e adicionando1
dentro do loop. Economizou mais dois bytes por não armazenar a entrada em uma variável. Explicação:Edit: Este "one-liner" de 18 bytes (o link é para a versão detalhada do código) não teria funcionado com a versão do Charcoal no momento em que a pergunta foi enviada: Experimente online!
fonte
05AB1E , 12 bytes
Código:
Explicação:
Usa a codificação 05AB1E . Experimente online!
fonte
ζ
vez de.Bø
? Além disso, o personagem não tem que ser#
ζ
não existia naquela época.Python 2 , 101 bytes
Experimente online!
Isso produz (muitos) espaços em branco à esquerda na vertical. Imprime um total de
N
linhas, a grande maioria das quais normalmente fica em branco.fonte
Japt ,
34 33 1614 bytesEconomizou 17 bytes graças a @ETHproductions
Experimente online!
fonte
z
o preenchimento:õ_â lã'#pX÷z w
J , 28 bytes
Define um verbo monádico. Experimente online!
Explicação
fonte
PHP, 126 bytes
Experimente online!
fonte
Braquilog , 34 bytes
Experimente online!
fonte
Alice , 33 bytes
Experimente online!
A entrada é (infelizmente) na forma de um ponto de código . Pelo menos, ele lê um caractere UTF-8, para que você possa usar entradas maiores que 255, mas elas ainda são limitadas e é um formato de entrada bastante doloroso. Por três bytes adicionais, podemos ler um número inteiro decimal:
Experimente online!
O caractere não em branco na saída é
!
.Observe que a solução também imprime uma tonelada de espaço em branco à esquerda (sempre começa com uma linha vazia e depois imprime uma
NxN
grade para que, para maioresN
, existam muitas linhas de espaços antes dos primeiros!
s).Explicação
Eu já usei e expliquei a
&w...k
construção antes (por exemplo, aqui ). É um pequeno idioma puro que exibe um número inteiro n e, em seguida, executa um pedaço de código n + 1 vezes (consequentemente, é geralmente usadot&w...k
para executar um loop n vezes, com at
diminuição do valor de entrada). Isso é feito trabalhando com a pilha de endereços de retorno (RAS).w
envia o endereço IP atual ao RAS e, se o repetirmos,&
o endereço será enviado n vezes.k
aparece um endereço do RAS e volta para lá. Se o RAS estiver vazio, ele não fará nada e o loop será encerrado.Você pode notar que não é trivialmente possível aninhar esses loops, porque no final do loop interno, a pilha não está vazia e, portanto,
k
não se torna um não-op. Em vez disso, o IP retornaria ao início do loop externo. A maneira geral de corrigir isso envolve agrupar o loop interno em sua própria sub-rotina. Mas se pudermos organizar o loop aninhado de modo que o loop externo termine com o loop interno, podemos realmente usar esse comportamento e até economizar umk
!Então, essa construção:
É um loop aninhado de trabalho que executa o
XYYYXYYYXYYY...
(para algum número deY
s em cada iteração). É bem legal que possamos terminar os dois loops com um únicok
, porque ele consumirá um endereço externo do RAS cada vez que os endereços internos forem esgotados.Esse idioma é usado no programa para executar o loop na grade de saída.
fonte
Na verdade , 25 bytes
Experimente online!
Versão de 22 bytes com muitas das novas linhas principais
Experimente online!
fonte
R,
83bytes-1 byte graças a MickyT
Lê
N
de stdin.Experimente online!
fonte
!=0
pode ser>0
Pitão , 16 bytes
Experimente online!
fonte
SpecBAS - 149 bytes
Uma matriz controla o número de divisores e depois imprime o número certo de caracteres até a posição 50 da tela.
fonte
PHP, 99 bytes
imprime um espaço à esquerda; execute como pipe
php -nr '<code>'
ou experimente online .demolir
fonte
PowerShell, 101 bytes
Script de teste com menos golfe:
Resultado:
fonte
SOGL V0.12 , 8 bytes
Experimente aqui!
fonte
Wolfram Language (Mathematica) ,
4644 bytesExperimente online! Mas talvez tente online! com ColumnForm em vez de Grid , pois
Grid
não funciona no TIO. No Mathematica, parece melhor:Uma terceira solução Mathematica ...
Divisors@Range@#
encontra todos os divisores no intervalo que queremos, e depois multiplicamos0
e subtraímos" "
, tornando cada divisor igual a-" "
.PadLeft
adiciona zeros à esquerda, criando um horizonte lateral, cuja orientação corrigimos com
=\[Transpose]
. Finalmente, acrescentando" "
a tudo faz todas as entradas quer0
ou" "
.Como alternativa, o 59 bytes
""<>Riffle[PadLeft["X"-" "+0Divisors@Range@#]+" ","\n"]&
produz saída de string.fonte
Adicionar ++ , 58 bytes
Experimente online!
Como funciona
Nosso programa consiste em duas funções auxiliares,x , entre 1 e n e retorna d( X ) conforme definido no corpo do desafio, enquanto
g
ek
, e na principal função lambda.g
itera sobre cada número inteiro,k
pega uma lista de caracteres e os concatena em uma única sequência.A função lambda principal geraA = [ d( 1 ) , d( 2 ) , d( 3 ) , . . . , d( n ) ] e repete o UMA . Nós então tomamosmax ( A ) e subtraia cada elemento em UMA desse máximo, antes de render esse número de espaços para cada elemento e concatenar os espaços para os hashes repetidos. Em seguida, transpomos e invertemos as linhas, antes de unir cada linha em novas linhas. Finalmente, produzimos o horizonte.
#
caractere para cada elemento defonte