Uma árvore divisora esteticamente agradável é uma árvore de divisores de entrada n
que, para qualquer número composto m
, possui dois nós filhos que são o par de divisores mais próximos da raiz quadrada de m
. O nó esquerdo deve ser o divisor menor de m
e o nó direito deve ser o divisor maior de m
. Um número primo na árvore não deve ter nós filhos. Sua árvore pode estar na forma de arte de texto ou imagem. As regras para saída de arte de texto são as seguintes.
Regras de espaçamento
Para espaçar os nós na árvore, temos as seguintes regras:
- Os nós em uma determinada profundidade da raiz devem estar todos na mesma linha de texto na saída.
/ \ NÃO / \ / \ / 3 2 3 2
- Para nós esquerdos, a ramificação recebida deve estar no canto superior direito se o nó for um número de um dígito; caso contrário, logo acima do último dígito. Exemplo:
/ AND / 3 720
- Para nós da direita, a ramificação de entrada deve estar no canto superior esquerdo se o nó for um número de um dígito; caso contrário, logo acima do primeiro dígito. Exemplo:
\ AND \ 7 243
- Para ramificações esquerdas de saída, a ramificação deve começar um espaço à esquerda do número. Exemplo:
275 / 11
- Para ramificações direitas de saída, a ramificação deve começar um espaço à direita do número. Exemplo:
275 \ 25
- Quaisquer dois nós no mesmo nível da árvore devem ter no mínimo dois espaços entre eles. Ao mesmo tempo, quaisquer duas subárvores no mesmo nível da árvore devem ter o menor espaço possível entre elas.
Esta árvore não funciona porque as ** subárvores ** estão muito próximas. 504 / \ / \ / \ / \ 21 24 / \. / \ / \. / \ 3 7. 4 6 . / \ / \ .2 2 2 3 Embora essa árvore tenha espaço suficiente entre seus galhos. 504 / \ / \ / \ / \ / \ 21 ... 24 / \ ... / \ / \ ... / \ 3 7 ... 4 6 ... / \ / \ ... 2 2 2 3
- Se quaisquer duas subárvores estão muito próximos em uma árvore, eles podem ser separados por adição de outra linha de ramos
/\
da árvore acima dos pais.
441 / \ A última linha ainda não foi preenchida e já estamos sem espaço. 21 21 / \ / \ Adicione outra linha de ramificações 441 Quase \, mas o 7 e o 3 estão muito próximos. / \ Mais uma linha deve fazê-lo. 21 21 / \ / \ 3 7 3 7 Adicione outra linha de ramificações 441 / \ E terminamos. / \ / \ 21 21 / \ / \ 3 7 3 7
Exemplos
Como um exemplo completo, a árvore divisora de 24 terá a seguinte aparência:
24
/ \
/ \
4 6
/ \ / \
2 2 2 3
4 e 6 são o par de divisores mais próximo da raiz quadrada de 24. 4 está à esquerda, porque é menor. Na próxima linha, o número 2 à esquerda de 3, porque é menor.
A árvore divisória para 63 deve se parecer com:
63 and NOT like this 63
/ \ / \
7 9 3 21
/ \ / \
3 3 7 3
Na árvore incorreta, 3 e 21 não são o par de divisores mais próximos da raiz quadrada de 63 e 3 e 7 não são classificados corretamente. O posicionamento da filial no 21 está correto, no entanto.
Para 42, você deve ter:
42 and NOT 42
/ \ / \
6 7 21 2
/ \ / \
2 3 3 7
Vamos dar uma olhada no 720. Observe que precisamos de cinco níveis de ramificações 720
para que as subárvores 24
e 30
sejam espaçadas corretamente. Além disso, nota que 24
e 30
têm dois níveis de ramos, porque 4
e 6
tem nós filhos que precisam espaçamento correto e os nós filhos de 30
necessidade de estar no mesmo nível que os nós filhos de 24
.
720
/ \
/ \
/ \
/ \
/ \
24 30
/ \ / \
/ \ / \
4 6 5 6
/ \ / \ / \
2 2 2 3 2 3
O desafio
- Sua tarefa é criar uma árvore divisora esteticamente agradável, espaçada corretamente para entrada
n
, em quen
um número inteiro positivo seja maior que 1. - Sua saída pode conter espaços à esquerda e à direita e novas linhas à esquerda e à direita, mas deve estar em conformidade com as regras de espaçamento fornecidas acima.
- É permitido que sua saída seja: arte do texto, uma imagem (outros formatos a serem adicionados, se necessário).
- Para imagens, verifique se os nós da árvore estão bem espaçados e se os nós na mesma altura na árvore estão na mesma altura na imagem.
- Isso é código de golfe. O menor número de bytes (ou equivalente) vence.
Agradecemos a Stewie Griffin por pensar nessa idéia e muito obrigado a Peter Taylor, Martin Ender, Mego e Eᴀsᴛᴇʀʟʏ Iʀᴋ por sua ajuda na reescrita da especificação. Como sempre, qualquer sugestão ou correção é muito apreciada. Boa sorte e bom golfe!
Mais casos de teste:
2
4
/ \
2 2
20
/ \
4 5
/ \
2 2
323
/ \
17 19
362880
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
576 630
/ \ / \
/ \ / \
/ \ / \
/ \ / \
/ \ / \
/ \ / \
24 24 21 30
/ \ / \ / \ / \
/ \ / \ / \ / \
4 6 4 6 3 7 5 6
/ \ / \ / \ / \ / \
2 2 2 3 2 2 2 3 2 3
1286250
/ \
/ \
/ \
/ \
/ \
1050 1225
/ \ / \
/ \ / \
/ \ / \
30 35 35 35
/ \ / \ / \ / \
5 6 5 7 5 7 5 7
/ \
2 3
fonte
Respostas:
Python 2 ,
711651575559554547539540530522 bytesApós quatro meses tentando escrever essa resposta, colidindo com uma parede, deixando-a por uma semana, enxágue, repita, finalmente terminei uma resposta artística ASCII adequada para esse desafio. Tudo o que resta é o golfe, e assim, sugestões de golfe são muito bem-vindas. Experimente online!
Golfe: -60 bytes ao renomear algumas funções usadas com frequência e alterar como o resultado é retornado. -73 bytes, alterando como as alturas das subárvores são verificadas, como as variáveis de espaçamento são calculadas e como o resultado é retornado. -3 bytes da
isdigit()
substituição do FlipTack . -16 bytes jogando essaisdigit()
substituição ainda mais e substituindo "" porE
. -5 bytes de pequenas melhorias e mudança de Python 3 para Python 2. -7 bytes de modificar como o resultado é retornado. -8 bytes de uma pequena alteração na forma comoA
é definido,alterando como, removendoT
é definido e adicionandoW
, usando a hipótese de que qualquer subárvore com pelo menos uma ramificação mais longa que sua contraparte, seja necessariamente mais longa do que sua contraparteQ
completamente e editando como o resultado é retornado. -10 bytes de usar emA<10
vez deL(S(A))<2
paraA
eB
. -8 bytes de alterar o padrãoH
para,[0]
uma vez que o código evita o problema de argumentos padrão mutáveis nunca mudandoH
, alterando comoq
é definido usando em(B>9)
vez de1-(B<10)
, removendop
completamente e criandoF
como substitutop+q-M
.Correções de bugs: a hipótese estava errada, contra-exemplo
11**9 = 2357947691
. +1 byteExplicação
Toda a função pode ser resumida em quatro etapas:
n
,A
eB
.A
eB
, redesenhando conforme necessário.Vou seguir cada passo em ordem.
Etapa 1. Este é o passo mais fácil, francamente. Verifique cada número
z
entre 1 e a raiz quadrada quanto à divisibilidaden
e pegue a maiorz
e an//z
que corresponder. Retornar apenasstr(n)
sen
for primo (umA==1
ouB==n
)Passo 2. Desenhe as subárvores de
A
eB
e obter o número de/\
ramos entre os nós no sub-árvores. Para fazer isso, obtemos os índices de cada etapa que possui dígitos, obtemos as primeiras diferenças dos índices e subtraímos 1 novamente. Quando tivermos as alturas, as comparamos para obter a maior e redesenhamos as subárvores com as novas alturas.Eu tenho uma suspeita furtiva de que a subárvore mais alta em geral sempre tem ramificações iguais ou iguais às ramificações na subárvore mais curta, e posso usá-la para jogar golfe no código, mas ainda não tenho prova disso.Contra-exemplo em11**9 = 2357947691
.Etapa 3. Essa etapa foi o que levou meses para ser escrita. A Etapa 2 levou alguns dias para escrever e depurar, mas encontrar as fórmulas corretas para o espaçamento levou séculos. Vou ver se consigo condensar o que descobri em alguns parágrafos. Observe que alguns dos códigos nesta explicação foram extraídos do código real.
Primeiro,
p
,q
,h
,P
,Q
,s
eM
.p
é o número de caracteres do final da ramificação esquerda/
até a extremidade direita da subárvore esquerda.q
é o número de caracteres da extremidade esquerda da subárvore direita até o final da ramificação direita/
.h
é o número de ramificações entre a raiz e as subárvores.P
eQ
são apenas as inversas dep
eq
e são úteis para colocar os espaços em torno/\
ramos até a raizn
.s
é o número de espaços adicionados entre as duas subárvores.M
é mais simples; é o comprimento den
. Coloque graficamente:A fórmula para determinar
p
é a seguinte:p = len(x[0]) - x[0].rindex(str(A)[-1]) - (A<10)
comprimento, menos o índice zero do último caractere em A, menos uma correção para um dígitoA
s.A fórmula para determinar
q
é:q = y[0].index(str(B)[0]) + (B>9)
o índice do primeiro caractere em B, mais uma correção para indexação zero, menos uma correção para um dígitoB
s (combinada em uma correção para vários dígitosB
s).A fórmula para a determinação
h
é a seguinte:h = H[0] or (p+q+M%2+2-M)//2 or 1
. Ou pegamos um predefinido, oH
que significa que estamos redesenhando a árvore, usamos(from_the_left + from_the_right + parity_space + 2 - len(root)) // 2)
ou usamos o número mínimo de níveis de ramificação, 1.A fórmula para a determinação
s
é a seguinte:s = 2*h+M-p-q
. Subtraímosp
eq
do número de espaços entre os ramos da raiz em sua maior extensão2*h + M
.Etapa 4. E, finalmente, reunimos tudo. Primeiro criamos a raiz,
[" "*(P+h)+Z+" "*(Q+h)]
depois colocamos os galhos nas subárvores e[" "*(P+J)+"/"+" "*(2*h+M-2*J-2)+"\\"+" "*(Q+J)for J in G(h)][::-1]
, finalmente, colocamos nossas subárvores espaçadas corretamente[(" "*(2*h+M-p-q)).join([(I<L(w)and w[I]or" "*L(w[0]))for w in(x,y)])for I in G(max(L(x),L(y)))]
.Et voilà! Temos uma árvore divisória esteticamente agradável!
Ungolfing:
fonte
isdigit
ser o seu cheque'/'<x[i].strip()[0]<':'
?Mathematica,
9686817978 bytesObrigado @MartinEnder por 2 bytes.
A saída é assim:
Explicação
Gere a lista de divisores da entrada. Encontre o elemento mais próximo da raiz quadrada da entrada. (
Max
é para aplainar a saída)Encontre o outro divisor dividindo a entrada pelo divisor encontrado acima, aplique a entrada como a cabeça do resultado.
Repita o processo.
Se a entrada for primária, não faça nada.
Formate a saída.
Edit: Uma versão mais esteticamente agradável (258 bytes)
A saída é assim:
fonte
Sqrt@#
->#^.5
(é claro que você não pode usar a notação infix,Nearest
mas pode usarMax@
).Carvão , 302 bytes
Experimente online! Link é a versão detalhada do código. Como a versão detalhada é muito detalhada, ele é uma transliteração JavaScript do algoritmo principal:
fonte