Transformez une image en un puzzle coulissant

14

Sommaire

Le but de ce défi est de créer une version image défaite d'un puzzle de 15 casse-tête / coulissant également appelé taquin en français.

Détails:

Soit une entrée composée de:

  • une image,
  • un entier n,
  • un autre entier r,

votre programme, ou fonction, ou tout autre élément qui convient, doit produire la même image ( c'est-à-dire la même taille et le même format) que l'entrée, mais qui a subi le processus suivant:

  1. divisez l'image en rectangles,
  2. supprimer l'un de ces rectangles, au hasard,
  3. déplacez un nombre aléatoire de rectangles contigus de la ligne / colonne affectée par le point (2.) afin que le trou créé soit rempli et qu'un autre soit généré dans cette ligne / colonne. Ce nombre peut être 0si le blanc est dans un coin ou un bord.

Répétez (3.) rfois.

Clarifications:

  • Si vous avez déplacé des rectangles de la ligne à l'étape (3.), vous devez déplacer les rectangles de la colonne dans la répétition suivante,
  • si vous avez déplacé des rectangles de gauche à droite dans un pas de ligne, ils doivent être déplacés de droite à gauche dans le pas de ligne suivant, de même pour les colonnes de haut en bas et de bas en haut concernant les colonnes,
  • vous pouvez supposer que ce nsera choisi de sorte qu'il divise les longueurs des côtés de l'image.

Un dernier point:

Une animation .gifmontrant l'ensemble du processus est la bienvenue.

Je propose d'utiliser l'image suivante (qui est 1024x768), avec n=16et r=100comme modèle, vous pouvez utiliser n'importe quelle autre image (tant qu'elle est pertinente et conforme aux règles de SE, bien sûr).

Notez que les politiques d'échappatoires standard s'appliquent.

Il s'agit de , donc la soumission la plus courte gagne!

Les amateurs de chiens, chats et canards devraient être satisfaits!

Puisqu'un exemple a été demandé, en voici un, fait "à la main", avec n=4etr=1

Étapes 1 et 2

entrez la description de l'image ici

Étape 3 : ligne par ligne, 2 rectangles à gauche

entrez la description de l'image ici

Frédéric
la source
L'exemple suggère que les rectangles n'ont pas besoin d'être de la même taille, n'ont pas besoin de couvrir toute l'image et doivent inclure des lignes tracées sur l'image d'origine. Pourriez-vous clarifier cela, en modifiant la spécification ou l'exemple?
trichoplax
@trichoplax: l'exemple a été dessiné à la main avec de la peinture et de la rapidité. Je vais le refaire correctement.
Frédéric
@trichoplax: Je dois admettre que je ne comprends pas complètement votre point, mais cette ligne d'ouverture n'est pas nécessaire pour comprendre le défi, donc je suppose qu'il est inutile de le garder.
Frédéric
move a random number of contiguous rectanglespeut-il être 0 rectangles? (ce serait
pénible
@JungHwanMin: oui, c'est possible. Bonne remarque, merci!
Frédéric

Réponses:

10

Mathematica, 246 octets

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]&

Fonction anonyme. Contient U + F3C7, correspondant à l' Transposeopérateur de Mathematica . Cette fonction prend un Imageobjet et retourne un Imageobjet.

Exemple d'animation, avec n=16etr=100

Après 5000 itérations:

entrez la description de l'image ici(cliquez sur l'image pour une version plus grande)

Explication

Initialisation

n=Nest

Enregistrez la Nestfonction (opération répétée) dans n.

k=RandomInteger;q=Reverse;

Enregistrez la RandomIntegerfonction dans k, et la Reversefonction dans q.

Fractionner l'image

#~ImagePartition~Scaled[1/#2]

Partitionnez l'image d'entrée en (deuxième entrée) ^ 2 tuiles.

{1,#2}~k~2

Générez deux RandomIntegers entre 1 et la deuxième entrée. Cela sélectionne une tuile aléatoire.

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

Rendez cette tuile blanche. Conservez-le i.

Déplacer les tuiles

{t,r}=1~k~2

Générez deux entiers aléatoires de 0 à 1 et stockez-les respectivement dans tet r. Cela sélectionne au hasard la direction.

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

Définir la fonction o: la composition de

  1. une fonction transposant les ttemps d' entrée .
  2. une fonction inversant les temps de chaque ligne r.
o @ #

Appliquer oà l'entrée.

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

Trouvez la colonne de i(image blanche).

k[ ... -1]

Soustrayez un et trouvez un entier aléatoire entre 0 et ce nombre. Cela choisit au hasard le nombre de tuiles à déplacer.

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

Lorsque ledit nombre de tuiles se produit avant une i(image blanche), changez de place.

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

Inversez la ofonction et appliquez-la au résultat de l'opération ci-dessus. Cela annule et transpose l'image.

Bouclage et assemblage d'images

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

Répétez le processus ci-dessus (troisième entrée) fois.

ImageAssemble@

Rassemblez les images.

JungHwan Min
la source
1
Bonne réponse ! Merci pour les détails!
Frédéric