Às vezes, quando estou realmente entediado ( muito entediado), gosto de desenhar um segmento de linha e desenhar pontos nele.
Primeiro, eu desenho um segmento de linha de um determinado tamanho, que é 2 ^ N para algum valor de N. A linha será representada por uma série de .
caracteres.
................
Então, traço um ponto no lado esquerdo. Os pontos serão representados por X
caracteres.
X...............
Então, sigo um padrão. Começando no ponto plotado mais recentemente (que chamarei de A), avanço para o próximo ponto plotado (B) na linha (contornando conforme necessário). Então, eu avanço para o próximo ponto plotado na linha (C). Então, traço um novo ponto a meio caminho entre este terceiro ponto (C) e o próximo ponto já plotado (D).
Sempre que você contorna a linha, o "meio" é determinado da maneira de quebra. O ponto recém-plotado está sempre à direita de C.
Digamos que a seguinte linha fosse minha linha atual. Aqui está como eu traçaria os próximos dois pontos. Neste exemplo, vou rotular cada ponto importante com uma letra.
X...A...X.X...X.
^
X...A...B.X...X.
^
X...A...B.C...X.
^
X...A...B.C...D.
^
X...X...X.X.A.X.
^
X...X...X.X.A.B.
^
C...X...X.X.A.B.
^
C...D...X.X.A.B.
^
X.A.X...X.X.X.X.
^
Voltando ao exemplo anterior, o próximo ponto será plotado no meio da linha.
X.......X.......
Talvez esse seja um caso especial: avançar para o próximo ponto simplesmente deixa você onde começou. O único ponto intermediário útil é o ponto intermediário "cíclico" (o ponto intermediário da linha), em vez de plotar um ponto em cima de si.
Abaixo está a série de pontos que eu traçaria na linha daqui até o fim.
X.......X.......
X.......X...X...
X.......X.X.X...
X...X...X.X.X...
X...X...X.XXX...
X.X.X...X.XXX...
X.X.X...XXXXX...
Não há mais espaço para plotar o próximo ponto, pois ele teria que ser entalado entre dois pontos adjacentes; portanto, alcancei a profundidade máxima para o valor especificado de N = 4. A última linha da lista acima está "completa" . "
O desafio
O objetivo é escrever o programa mais curto / função nomeada que imprimirá / retornará a linha concluída para um determinado valor de N. O exemplo acima mostra N = 4.
Entrada
A entrada será um único número inteiro não negativo N. O comprimento da linha gerada será então 2 ^ N.
Resultado
A saída será a linha completa de comprimento 2 ^ N, formada por .
e X
caracteres. Uma nova linha à direita não importa.
Exemplo de E / S
0
X
1
XX
2
X.XX
3
X.X.XXX.
4
X.X.X...XXXXX...
5
X.X.X...X...X...X.XXX.XXX.......
(c%b+b)%b
? Você esperac
ser negativo?c=0
ed=0
pode ser reduzido para apenasc
ed
.int
tipos definidos no nível da classe são automaticamente inicializados como 0.Haskell, 182 bytes
Uso:
f 5
. Saída:X.X.X...X...X...X.XXX.XXX.......
.Infelizmente, Haskell não tem uma função de mesclagem nas bibliotecas padrão, então tenho que fornecer minha própria (->
%
). Felizmente, tenho que mesclar apenas listas infinitas, para não precisar cobrir os casos básicos, ou seja, listas vazias. Ainda custa 40 bytes.Como funciona: em vez de definir os
X
s diretamente em uma matriz, mantenho uma lista de posições onde elas estão. Além disso, eu não passo em volta,2^N
mas continuo aumentando as posições em direção ao infinito (por exemplo, para N = 2 com umX
na frente, a lista de posições se parece[0,4,8,12,16,20,…]
). Pego o 3º e o 4º elemento (c
ed
), calculo a nova posição(c+d)/2
, mantenho-a para a lista de saída, mesclo a lista de posições antiga da posição 4 (ad
) com uma nova começando(c+d)/2
e retornando. Eu paro quando(c+d)/2
é igualc
. Finalmente, adiciono0
a à lista de saída e imprimoX
s nas posições indicadas e em.
outros lugares.fonte
Mathematica,
110102112108fonte