Faça uma foto em um quebra-cabeça deslizante
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.
Dada uma entrada composta de:
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 0se o espaço em branco estiver em um canto ou em uma aresta.
Repita (3) rvezes.
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 nserá escolhido para dividir os comprimentos dos lados da imagem.
Uma animação .gifmostrando todo o processo é muito bem-vinda.
Proponho usar a figura a seguir (que é 1024x768), com n=16e r=100como 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=4er=1
Etapa 3 : em linha, 2 retângulos à esquerda
code-golf image-processing sliding-puzzle code-golf math number sequence integer code-golf code-golf ascii-art
O exemplo sugere que os retângulos não precisam ter o mesmo tamanho, não precisam cobrir a imagem inteira e devem incluir linhas desenhadas sobre a imagem original. Você poderia esclarecer isso, alterando a especificação ou o exemplo?
@ tricoplax: o exemplo foi desenhado à mão com tinta e rapidez. Vou refazê-lo corretamente.
@trichoplax: Devo admitir que não entendi completamente o seu ponto, mas essa linha de abertura não é necessária para entender o desafio, então acho que é inútil mantê-lo.
move a random number of contiguous rectanglespode 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)
@JungHwanMin: sim, pode. Boa observação, obrigado!
Função anônima. Contém U + F3C7, correspondente ao Transposeoperador do Mathematica . Esta função pega um Imageobjeto e retorna um Imageobjeto.
Animação de exemplo, com n=16er=100
Após 5000 iterações:
Armazene a Nestfunção (operação repetida) em n.
Armazene a RandomIntegerfunção em ke Reversefuncione em q.
Particione a imagem de entrada em (segunda entrada) ^ 2 blocos.
Gere dois RandomIntegers entre 1 e a segunda entrada. Isso seleciona um bloco aleatório.
Faça esse azulejo branco. Guarde-o i.
Gere dois números inteiros aleatórios de 0 a 1 e armazene-os em te r, respectivamente. Isso seleciona aleatoriamente a direção.
Definir função o: a composição de
uma função que transpõe os ttempos de entrada .
uma função que inverte cada linha rvezes.
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.