Inspirado por esta pergunta
Outra maneira de desenrolar uma imagem 2D em uma sequência 1D é usar uma Curva de Hilbert.
Há muitas versões dessa curva, dependendo do número de iterações usadas durante o cálculo. Abaixo segue o exemplo das curvas de Hilbert da primeira ordem à quinta ordem.
A maneira de calcular essa curva é a seguinte. Primeiro, definimos a Curva de Hilbert de primeira ordem como a mostrada na figura (a de n = 1), para que ela caiba em um quadrado 1x1. Nós, então, fazemos quatro cópias dessa curva, espaçando-as em um quadrado 4x4, para que todas apresentem a "concavidade" no lado esquerdo. Em seguida, invertemos as duas curvas 1 da ordem mais à esquerda, para que a concavidade superior fique voltada para o topo, enquanto a inferior fica voltada para o fundo. Finalmente, conectamos os cantos das curvas Hilbert adjacentes. Se desejar obter uma curva de ordem (n + 1), basta repetir o processo com quatro curvas de ordem n. Podemos ver uma visualização do processo aqui (também adicionarei uma imagem detalhando o processo em breve)
Sua tarefa neste desafio é desenrolar uma matriz de números inteiros ao longo da ordem mais baixa de Hilbert Curve para essa matriz.
Por uma questão de simplicidade, teremos a curva começando no canto superior esquerdo da matriz.
Você pode receber a entrada como uma lista da lista de números inteiros, onde cada sub-lista representa uma linha da matriz.
Você pode assumir que a entrada será uma matriz quadrada (n * n).
Por exemplo:
Entrada:
[[ 1, 2,]
[ 3, 4 ]]
Resultado:
[ 1, 2, 4, 3 ]
Como estamos usando a primeira curva de Hilbert mostrada na figura
Entrada:
[[ 1, 2, 3, 4, ]
[ 5, 6, 7, 8, ]
[ 9, 10, 11, 12, ]
[ 13, 14, 15, 16 ]]
Resultado:
[ 1, 5, 6, 2, 3, 4, 8, 7, 11, 12, 16, 15, 14, 10, 9, 13 ]
Usando a segunda ordem Hilbert Curve
Como sempre, brechas padrão não são permitidas.
Isso é código-golfe, então a resposta mais curta em byte vence.
fonte
Respostas:
MATL ,
8685 bytesEsta solução é baseada na entrada File Exchange de Jonas Lundgren, que utiliza números complexos para gerar a curva de Hilbert. Esses números complexos são então convertidos em valores de índice para recuperar os elementos da matriz que caem ao longo da curva.
Experimente online!
Explicação
fonte
APL (Dyalog Unicode) , 41 bytes SBCS
Economizou 30 bytes (!) Consultando a sabedoria do APL Orchard, especialmente @ngn e @ Sherlock9.
Experimente online!
Explicação da seguinte maneira:
Mais detalhes em " varredura de transposição monádica ".
Documentação Dyalog sobre proteções contra erros .
fonte
Mathcad, 302 bytes
O programa Mathcad abaixo é baseado no programa @ Sherlock9 Python. Difere curvando matrizes retangulares ignorando as partes da Curva de Hilbert que ficam fora dos limites da matriz. Observe que, como o Mathcad possui um manuseio de string relativamente ruim, mapeei os símbolos Lindenmayer para números inteiros na função Hilbert.
O Mathcad funciona através de uma interface 2D que permite ao usuário inserir (e misturar livremente) expressões matemáticas, gráficos, texto, entradas e saídas. Equacionei um byte à operação equivalente no teclado mínimo do usuário para criar um símbolo (por exemplo, o operador de definição (: =) é inserido digitando simplesmente:.
fonte
Python 3,
327289275271239234 bytesEsta é uma solução que modifiquei da minha resposta para outra pergunta da curva de Hilbert aqui . Todas as dicas de golfe são apreciadas.
Editar: Alterado como
g
é incrementado e decrementado. Agora usandoeval()
estr.translate
. Não está mais usandol=len(s)
.Ungolfed:
fonte
Wolfram - 233
Com base na representação como sistema Lindenmayer :
fonte
Ruby,
224221216 bytesEsta resposta é baseada em minha resposta Python .
Ungolfing:
fonte
CJam, 60
Experimente online
Explicação:
Estou construindo o fractal como uma série de direções de movimento: 0 = direita, 1 = abaixo, 2 = esquerda, 3 = acima.
fonte