Eu gosto da curva de Hilbert .
Sua tarefa para esse desafio é capturar uma imagem (estritamente uma imagem quadrada, onde todos os lados têm uma potência de dois pixels de largura) e desvendá-la linha por linha em zigue-zague e percorrê-la novamente em uma curva pseudo-Hilbert .
Desenrolar
Para desvendar, você começará com o pixel no canto superior esquerdo e viajará para a direita até chegar à borda da imagem. Depois de atingir a borda da imagem, você irá para a próxima linha e começará a viajar para a esquerda até atingir a borda novamente. Você continuará desvendando linha por linha, alternando a direção a cada vez, para obter uma curva contínua. Deve parecer um jogo de cobra bem jogado
O resultado do desembaraço deve ser uma ordem de pixels que inclua todos os pixels exatamente uma vez
Reraveling
Depois de fazer o pedido dos pixels, você os reorganizará em uma nova tela de tamanho igual, seguindo o caminho de uma curva pseudo-Hilbert. Para uma 2**n
imagem quadrada de tamanho, você deve usar a enésima iteração da curva pseudo-hilbert. Cada pixel será colocado exatamente em um ponto na nova tela. Você deve desviar a imagem para que o ponto originalmente no canto superior esquerdo (o início da nossa curva de cobra) permaneça lá e aponte no canto inferior direito (o final de nossa curva de cobra) seja colocado no canto superior direito.
I / O
Seu programa ou função deve capturar uma imagem de restrições especificadas por métodos padrão e produzir outra imagem por métodos padrão.
Pontuação
Este é um programa de código-golfe com o menor número de bytes ganhos.
Exemplos
Entrada
Saída
Entrada
Saída
Entrada
Saída
Também recomendo testar uma imagem em branco ou em cores sólidas em branco para garantir que você não perca nenhum pixel.
Sinta-se à vontade para incluir seus próprios resultados em suas respostas!
fonte
Respostas:
Mathematica,
286273 bytesUfa! Desafiador, mas divertido!
Explicação
Converta um
Image
em uma matriz de valores RGB.Gerar um
l
porl
matriz com cabeça1
, onde ol
comprimento da entrada (ou seja, a largura da imagem) é.Isso gera
{{1[1, 1], 1[1, 2], ..., 1[1, L]}, {1[2, 1], ..., 1[2, L]}, ..., {1[L, 1], ..., 1[L, L]}}
(l
escrito em maiúsculas para reduzir a confusão)Uma
StringReplace
função que substitui todos"L"
com"+RF-LFL-FR+"
e"R"
com"-LF+RFR+FL-"
Aplique a
StringReplace
função para asString
"L"
,Log2[l]
vezes.Converta o resultado
String
em umList
de caracteres.Uma função sem nome que:
"-"
, multiplique o segundo elemento da primeira entrada porI
."+"
, divida o segundo elemento da primeira entrada porI
."F"
, aumente a primeira entrada peloReIm
(separa a parte real e imaginária da entrada) da segunda entrada.Começando com
{{1,1},I}
, aplique cumulativamente a função sem nome acima, usando cada elementoList
dos caracteres como a segunda entrada. Este código produz as saídas de todas as iterações.Livre-se dos segundos elementos de cada um
List
e exclua duplicatas. (Os passos até este ponto geram umaList
das coordenadas da curva de Hilbert)Desvendar a matriz RGB de entrada (inverte todas as outras linhas e nivela).
Crie
Rule
objetos, de modo que o primeiro elemento da primeira entrada (as coordenadas da curva de Hilbert) seja emparelhado com o primeiro elemento da segunda entrada (a imagem desfeita), o segundo elemento com a segunda entrada e assim por diante.Aplique esses substitutos
Rule
noArray
da segunda etapa.Converta para a matriz de valores RGB em um
Image
.Amostra in / out
Entrada:
Saída:
Entrada:
Saída:
Função inversa (
266253 bytes)fonte
Octave 234 bytes
Os nomes de arquivo das imagens de entrada e saída devem ser fornecidos na entrada padrão. o tamanho do código sem entrada / saída é 194 bytes .
Explicação:
O padrão base dos índices é:
Em cada iteração, 4 cópias do resultado da iteração anterior feita e alguma transformação aplicada a cada cópia, em seguida, todos os blocos são concatenados para formar o resultado atual.
então nós temos:
Os índices de Hilbert classificados e os índices dos elementos classificados retornados:
Desvendando o lançamento de todas as linhas pares:
Reraveling aplicado:
-S repetido para cada canal
-permutação aplicada, já que nos dados do Oitava, dispostos em colunas
Imagens de exemplo:
fonte