Sumário
O objetivo desse desafio é criar uma versão desfeita da imagem de um quebra-cabeça de 15 quebra-cabeças / deslizante, também chamado de taquin em francês.
Detalhes:
Dada uma entrada composta de:
- uma imagem,
- um número inteiro
n
, - um outro inteiro
r
,
seu programa, função ou qualquer outra coisa que se ajuste, deve gerar a mesma imagem ( ou seja, o mesmo tamanho e formato) da entrada, mas que passou pelo seguinte processo:
- divida a imagem em
n²
retângulos, - remova um desses retângulos aleatoriamente,
- mova um número aleatório de retângulos contíguos da linha / coluna afetada pelo ponto (2.) para que o buraco criado seja preenchido e outro seja gerado nessa linha / coluna. Esse número pode ser
0
se o espaço em branco estiver em um canto ou em uma aresta.
Repita (3) r
vezes.
Esclarecimentos:
- Se você moveu retângulos da linha na etapa (3.), você deve mover retângulos da coluna na próxima repetição,
- se você moveu retângulos da esquerda para a direita em uma etapa da linha, eles devem ser movidos da direita para a esquerda na próxima etapa da linha, o mesmo para as colunas de cima para baixo e de baixo para cima,
- você pode assumir que
n
será escolhido para dividir os comprimentos dos lados da imagem.
Um último ponto:
Uma animação .gif
mostrando todo o processo é muito bem-vinda.
Proponho usar a figura a seguir (que é 1024x768
), com n=16
e r=100
como modelo, você pode usar qualquer outra figura (desde que seja relevante e cumpra as regras da SE, é claro).
Observe que as políticas de lacunas nos padrões se aplicam.
Isso é código-golfe , então a submissão mais curta vence!
Como um exemplo foi solicitado, aqui está um, feito "à mão", com n=4
er=1
Passos 1 e 2
Etapa 3 : em linha, 2 retângulos à esquerda
fonte
move a random number of contiguous rectangles
pode ser 0 retângulos? (isto seria uma dor para fazer o comportamento de mudança de programa quando o branco aparece sobre uma borda / canto)Respostas:
Mathematica, 246 bytes
Função anônima. Contém U + F3C7, correspondente ao
Transpose
operador do Mathematica . Esta função pega umImage
objeto e retorna umImage
objeto.Animação de exemplo, com
n=16
er=100
Após 5000 iterações:
(Clique na imagem para uma versão maior)
Explicação
Inicialização
Armazene a
Nest
função (operação repetida) emn
.Armazene a
RandomInteger
função emk
eReverse
funcione emq
.Dividindo a imagem
Particione a imagem de entrada em (segunda entrada) ^ 2 blocos.
Gere dois
RandomInteger
s entre 1 e a segunda entrada. Isso seleciona um bloco aleatório.Faça esse azulejo branco. Guarde-o
i
.Moving Tiles
Gere dois números inteiros aleatórios de 0 a 1 e armazene-os em
t
er
, respectivamente. Isso seleciona aleatoriamente a direção.Definir função
o
: a composição det
tempos de entrada .r
vezes.Aplique
o
à entrada.Encontre a coluna de
i
(imagem em branco).Subtraia um e encontre um número inteiro aleatório entre 0 e esse número. Isso escolhe aleatoriamente quantas peças mover.
Quando o referido número de peças ocorrer antes de uma
i
(imagem em branco), troque de lugar.Inverta a
o
função e aplique-a ao resultado da operação acima. Isso inverte e não transpõe a imagem.Loop e montagem de imagem
Repita o processo acima (terceira entrada) vezes.
Coloque as imagens juntas.
fonte