Esta é a versão ASCII deste desafio . A postagem inicial foi separada por solicitação por Martin Ender
Introdução
Semelhante à Sequência de Fibonacci, a Sequência Padovan ( OEIS A000931 ) é uma sequência de números produzida pela adição de termos anteriores na sequência. Os valores iniciais são definidos como:
P(0) = P(1) = P(2) = 1
Os 0º, 1º e 2º termos são todos 1. A relação de recorrência é declarada abaixo:
P(n) = P(n - 2) + P(n - 3)
Assim, produz a seguinte sequência:
1, 1, 1, 2, 2, 3, 4, 5, 7, 9, 12, 16, 21, 28, 37, 49, 65, 86, 114, 151, 200, 265, 351, ...
Usar esses números como comprimentos laterais de triângulos equilaterais produz uma espiral agradável quando você os junta, como a Espiral de Fibonacci:
Imagem cortesia da Wikipedia
Tarefa
Sua tarefa é escrever um programa que recria essa espiral pela arte ASCII, com entrada correspondente a qual termo. Como um triângulo de comprimento lateral 1 (1 caractere) é impossível de representar bem em ASCII, os comprimentos laterais foram dilatados por um fator de 2. Portanto, o triângulo de comprimento lateral 1 é realmente representado da seguinte forma:
/\
/__\
Portanto, por exemplo, se a entrada foi 5 (o quinto termo), a saída deve ser:
/\
/ \
/ \
/______\
\ /\
\ /__\
\ /\ /
\/__\/
Os 5 primeiros termos foram 1, 1, 1, 2, 2, então o triângulo tinha comprimentos laterais 2, 2, 2, 4, 4 devido à dilatação. Outro exemplo para a entrada 8:
__________
/\ /\
/ \ / \
/ \ / \
/______\ / \
\ /\ / \
\ /__\/ \
\ /\ / \
\/__\/______________\
\ /
\ /
\ /
\ /
\ /
\ /
\ /
\ /
\ /
\/
Regras
- Você deve imprimir o resultado e a entrada deve ser um número inteiro correspondente ao número do termo
- Novas linhas à direita e à direita são permitidas, espaços à direita depois das linhas também
- Seu envio deve ser capaz de lidar com pelo menos até o 10º período (9)
- Seu envio deve ser um programa ou função completo que receba informações e imprima o resultado
- As rotações da saída são permitidas, em múltiplos de 60 graus, mas o tamanho dos triângulos deve permanecer o mesmo, junto com a representação
- Também é permitido ir no sentido anti-horário
- As brechas padrão são proibidas
Você pode assumir que a entrada será> 0 e que o formato correto da entrada será fornecido.
Pontuação
Isso é código-golfe , então o código mais curto em bytes vence. Feliz ano novo a todos!
Respostas:
Befunge,
871836798 bytesExperimente online!
Como costuma acontecer com o Befunge, o truque é criar um algoritmo que nos permita renderizar o padrão de cima para baixo, já que não é possível transformá-lo na memória primeiro com o espaço limitado disponível.
A maneira como isso funciona é primeiro construindo uma estrutura de dados simples, representando as arestas necessárias para desenhar a espiral. O segundo estágio analisa essa estrutura de cima para baixo, renderizando os fragmentos de borda necessários para cada linha de saída.
Usando essa técnica, podemos suportar até n = 15 na implementação de referência antes de começarmos a ter problema de estouro nas células de memória de 8 bits. Intérpretes com um tamanho de célula maior devem poder suportar até n = 25 antes de ficar sem memória.
fonte
vai, 768 bytes
Obviamente, isso não é ideal, mas não é um começo ruim. Eu sei que é provavelmente um pouco simples para os padrões de golfe, mas foi divertido e espero que não se importe se eu deixar algumas notas para o futuro.
Como funciona
Basicamente, simulo uma 'tartaruga de desenho', como no LOGO, em uma grade de pixels ASCII, mas a tartaruga só pode executar estes três comandos:
Agora, para cada triângulo, eu vou assim, onde P é 2x o enésimo número de Padovan:
O quarto 'fd' significa que estou re-traçando o primeiro lado de cada triângulo. Isso ajuda a voltar a um bom ponto de partida para o próximo triângulo. A meia curva à direita garante que o próximo triângulo esteja na orientação correta.
Para jogar golfe na tartaruga, guardo 5 variáveis de estado na matriz 态: posição x, posição y, velocidade x, velocidade y e 'desenho da runa'. Em cada quadro de animação, x + = x velocidade, y + = y velocidade, e a runa é desenhada.
Então eu montei a tabela 表 que diz como realmente executar o turno. O código do turn é complicado devido à maneira como a arte ASCII funciona. Não é um movimento direto, como em uma exibição de pixels. A direção da tartaruga, determinada pelas velocidades xey, determina as mudanças necessárias para que a curva pareça adequada.
Para girar, ele analisa a velocidade xey atual e as combina em um índice.
Este índice é usado para pesquisar um conjunto de 5 valores na tabela 表. Esses 5 valores na tabela 表 são adicionados a cada uma das 5 variáveis no estado 态. A tartaruga é então efetivamente virada e pronta para o próximo 'fd'.
Em seguida, meia volta à direita, há uma seção separada da tabela.. É compensado pelas entradas 7 * 5 ou 35 da primeira tabela em 表.
Por fim, fiz uma codificação simples dos números inteiros da tabela em uma string ascii.
Eu sei que eu poderia 'salvar bytes' removendo o Hanzi, mas como eu disse, isso não é ideal e há mais possibilidades de golfe ... Eu as removerei quando não houver outra otimização possível. Na verdade, esses Hanzi têm um significado vagamente baseado em seu significado real, e mesmo que eu não saiba chinês, isso me ajuda a pensar no programa.
Para testar o código, você precisará do arquivo golang completo, com este cabeçalho
e este rodapé
obrigado
fonte