Machen Sie ein Bild in ein Schiebepuzzle

14

Zusammenfassung

Das Ziel dieser Herausforderung ist es, eine ungelöste Bildversion eines 15-Puzzle- / Schiebepuzzles zu erstellen, das auf Französisch auch als Taquin bezeichnet wird .

Einzelheiten:

Bei einer Eingabe bestehend aus:

  • ein Bild,
  • eine ganze Zahl n,
  • eine andere ganze Zahl r,

Ihr Programm oder Ihre Funktion oder alles andere, was passt, muss dasselbe Bild ( dh dieselbe Größe und dasselbe Format) wie die Eingabe ausgeben , das jedoch den folgenden Prozess durchlaufen hat:

  1. Teilen Sie das Bild in Rechtecke,
  2. entferne eines dieser Rechtecke nach dem Zufallsprinzip,
  3. Verschieben Sie eine zufällige Anzahl zusammenhängender Rechtecke von der von Punkt (2.) betroffenen Linie / Spalte, damit das erzeugte Loch gefüllt wird und ein weiteres in dieser Linie / Spalte erzeugt wird. Diese Zahl kann angegeben werden, 0wenn sich der Rohling in einer Ecke oder Kante befindet.

Wiederholen Sie (3.) rmal.

Klarstellungen:

  • Wenn Sie in Schritt (3.) Rechtecke aus der Zeile verschoben haben, müssen Sie in der nächsten Wiederholung Rechtecke aus der Spalte verschieben.
  • Wenn Sie Rechtecke in einem Zeilenschritt von links nach rechts verschoben haben, müssen sie im nächsten Zeilenschritt von rechts nach links verschoben werden. Dies gilt auch für Spalten von oben nach unten und von unten nach oben.
  • Sie können davon ausgehen, dass ndies so gewählt wird, dass die Länge der Seiten des Bildes geteilt wird.

Ein letzter Punkt:

Eine animierte .gifDarstellung des gesamten Prozesses ist sehr willkommen.

Ich schlage vor, das folgende Bild (das ist 1024x768) zu verwenden, mit n=16und r=100als Modell können Sie jedes andere Bild verwenden (sofern es relevant ist und den SE-Regeln entspricht, natürlich).

Beachten Sie, dass Richtlinien für Standardlücken gelten.

Das ist , also gewinnt die kürzere Einreichung!

Hunde, Katzen und Entenliebhaber sollten zufrieden sein!

Da ein Beispiel angefordert wurde, wird hier eines "von Hand" mit n=4und erstelltr=1

Schritte 1 und 2

Bildbeschreibung hier eingeben

Schritt 3 : Zeilenweise, 2 Rechtecke links

Bildbeschreibung hier eingeben

Frédéric
quelle
Das Beispiel legt nahe, dass die Rechtecke nicht dieselbe Größe haben müssen, nicht das gesamte Bild bedecken müssen und Linien enthalten sollten, die über das Originalbild gezogen werden. Können Sie dies klarstellen, indem Sie entweder die Spezifikation oder das Beispiel ändern?
Trichoplax
@trichoplax: Das Beispiel wurde von Hand mit Farbe und Schnelligkeit gezeichnet. Ich werde es richtig wiederholen.
Frédéric
@trichoplax: Ich muss zugeben, dass ich Ihren Standpunkt nicht ganz verstehe, aber diese erste Zeile wird nicht benötigt, um die Herausforderung zu verstehen. Ich denke, es ist sinnlos, sie beizubehalten.
Frédéric
move a random number of contiguous rectanglesKann es 0 Rechtecke sein? (Es wäre
mühsam
@JungHwanMin: Ja, das kann es. Gute Bemerkung, danke!
Frédéric

Antworten:

10

Mathematica, 246 Bytes

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

Anonyme Funktion. Enthält U + F3C7, entsprechend dem TransposeOperator von Mathematica . Diese Funktion nimmt ein ImageObjekt und gibt ein ImageObjekt zurück.

Beispielanimation mit n=16undr=100

Nach 5000 Iterationen:

Bildbeschreibung hier eingeben(Bild anklicken für größere Version)

Erläuterung

Initialisierung

n=Nest

Speichern Sie die NestFunktion (Wiederholung) in n.

k=RandomInteger;q=Reverse;

Speichern Sie die RandomIntegerFunktion in kund die ReverseFunktion in q.

Bild aufteilen

#~ImagePartition~Scaled[1/#2]

Partitionieren Sie das Eingabebild in (zweite Eingabe) ^ 2 Kacheln.

{1,#2}~k~2

Generiere zwei RandomIntegers zwischen 1 und der zweiten Eingabe. Dies wählt eine zufällige Kachel aus.

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

Mach die Fliese weiß. Speichern Sie es in i.

Fliesen bewegen

{t,r}=1~k~2

Generieren Sie zwei zufällige Zahlen von 0 bis 1 ist , und speichern sie in tund rdargestellt. Dies wählt zufällig die Richtung.

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

Funktion definieren o: die Zusammensetzung von

  1. eine Funktion, die die Eingabezeiten transponiert t.
  2. eine Funktion, die jede Reihe rmal umkehrt .
Ö@#

Auf odie Eingabe anwenden .

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

Suchen Sie die Spalte von i(weißes Bild).

k[ ... -1]

Subtrahiere eins und finde eine zufällige ganze Zahl zwischen 0 und dieser Zahl. Dadurch wird zufällig ausgewählt, wie viele Kacheln verschoben werden sollen.

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

Wenn die Anzahl der Kacheln vor einem i(weißen Bild) liegt, tauschen Sie die Plätze.

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

Kehren Sie die oFunktion um und wenden Sie diese auf das Ergebnis der obigen Operation an. Dadurch wird das Bild umgekehrt und transponiert.

Looping und Image Assembly

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

Wiederholen Sie den obigen Vorgang (dritte Eingabe) mal.

ImageAssemble@

Setze die Bilder zusammen.

JungHwan min
quelle
1
Gute Antwort ! Danke für die Details!
Frédéric