Trasforma una foto in un puzzle scorrevole


14

Sommario

L'obiettivo di questa sfida è quello di creare una versione immagine disfatta di un puzzle a 15 puzzle / scorrevole chiamato anche taquin in francese.

Dettagli:

Dato un input composto da:

  • un'immagine,
  • un numero intero n,
  • un altro numero intero r,

il tuo programma, o funzione, o qualsiasi altra cosa adatta, deve produrre la stessa immagine ( cioè la stessa dimensione e formato) dell'input, ma che ha subito il seguente processo:

  1. dividere l'immagine in rettangoli,
  2. rimuovi uno di quei rettangoli, a caso,
  3. sposta un numero casuale di rettangoli contigui dalla linea / colonna interessata dal punto (2.) in modo che il foro creato sia riempito e ne venga generato un altro in questa linea / colonna. Questo numero può essere 0se lo spazio vuoto è in un angolo o un bordo.

Ripetere (3.) rvolte.

chiarimenti:

  • Se hai spostato i rettangoli dalla linea nel passaggio (3.), devi spostare i rettangoli dalla colonna nella ripetizione successiva,
  • se hai spostato i rettangoli da sinistra a destra in un passaggio di riga, devono essere spostati da destra a sinistra nel passaggio di riga successivo, lo stesso per le colonne dall'alto verso il basso e dal basso verso l'alto relative alle colonne,
  • puoi presumere che nsarà scelto in modo da dividere le lunghezze dei lati dell'immagine.

Un ultimo punto:

Un animato .gif mostra l'intero processo è molto apprezzata.

Propongo di utilizzare la seguente immagine (che è 1024x768), con n=16e r=100come modello, è possibile utilizzare qualsiasi altra immagine (purché pertinente e conforme alle regole di SE, ovviamente).

Si noti che si applicano le norme sulle scappatoie standard .

Si tratta di , quindi vince l'invio più breve!

Gli amanti dei cani, dei gatti e delle anatre dovrebbero essere soddisfatti!

Poiché è stato richiesto un esempio, eccone uno, realizzato "a mano", con n=4er=1

Passaggi 1 e 2

inserisci qui la descrizione dell'immagine

Passaggio 3 : linea-saggio, 2 rettangoli a sinistra

inserisci qui la descrizione dell'immagine


L'esempio suggerisce che i rettangoli non devono necessariamente avere le stesse dimensioni, non devono coprire l'intera immagine e devono includere linee disegnate sopra l'immagine originale. Potresti chiarire questo, modificando la specifica o l'esempio?
trichoplax,

@trichoplax: l'esempio è stato disegnato a mano con vernice e rapidità. Lo rifarò correttamente.
Frédéric,

@trichoplax: devo ammettere che non capisco completamente il tuo punto, ma questa linea di apertura non è necessaria per comprendere la sfida, quindi immagino che sia inutile tenerlo.
Frédéric,

move a random number of contiguous rectanglespuò essere 0 rettangoli? (Sarebbe una seccatura fare in modo che il programma cambi il comportamento quando lo spazio vuoto è su un bordo / angolo)
JungHwan Min

@JungHwanMin: sì, può. Buona osservazione, grazie!
Frédéric,

Risposte:


10

Mathematica, 246 byte

ImageAssemble@(n=Nest)[k=RandomInteger;q=Reverse;({t,r}=1~k~2;q[o=n[q/@#&,#,r]&@*(n[#&,#,t]&)])[o@#/.{a___,b:_~RepeatedNull~k[Position[o@#,i][[1,2]]-1],i,c___}:>{a,i,b,c}]&,MapAt[(i=#~ImageAdd~1)&,#~ImagePartition~Scaled[1/#2],{1,#2}~k~2],#3]&

Funzione anonima. Contiene U + F3C7, corrispondente a MathematicaTranspose . Questa funzione accetta un Imageoggetto e restituisce un Imageoggetto.

Animazione di esempio, con n=16 er=100

Dopo 5000 iterazioni:

inserisci qui la descrizione dell'immagine(clicca sull'immagine per ingrandirla)

Spiegazione

Inizializzazione

n=Nest

Memorizzare la Nestfunzione (operazione ripetuta) in n.

k=RandomInteger;q=Reverse;

Memorizza la RandomIntegerfunzione in ke Reversefunzione inq .

Dividere l'immagine

#~ImagePartition~Scaled[1/#2]

Partiziona l'immagine di input in (secondo input) ^ 2 riquadri.

{1,#2}~k~2

Genera due RandomIntegers tra 1 e il secondo input. Questo seleziona una tessera casuale.

MapAt[(i=#~ImageAdd~1)&, ..., {1,#2}~k~2]

Rendi quella piastrella bianca. Conservalo in i.

Piastrelle in movimento

{t,r}=1~k~2

Genera due numeri interi casuali da 0 a 1 e memorizzali in te r, rispettivamente. Questo seleziona casualmente la direzione.

o=n[q/@#&,#,r]&@*(n[#&,#,t]&)

Definisci funzione o: la composizione di

  1. una funzione che traspone l'ingresso t tempi di .
  2. una funzione che inverte i rtempi di ogni riga .
o @ #

Applica oall'ingresso.

Position[o@#,i][[1,2]]

Trova la colonna di i(immagine bianca).

k[ ... -1]

Sottrai uno e trova un numero intero casuale compreso tra 0 e quel numero. Questo sceglie casualmente quante tessere spostare.

o@#/.{a___,b:_~RepeatedNull~ ... ,i,c___}:>{a,i,b,c}

Quando il suddetto numero di tessere appare prima di un'immagine i(bianca), cambia il loro posto.

(... q[o= ... ])[ ... ]

Invertire il o funzione e applicarla al risultato dell'operazione sopra descritta. Ciò inverte e traspone l'immagine.

Ciclo e assemblaggio di immagini

(n=Nest)[ ... ,#3]

Ripetere i tempi del processo sopra (terzo input).

ImageAssemble@

Metti insieme le immagini.


1
Bella risposta ! Grazie per i dettagli!
Frédéric,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.