Zrób zdjęcie w przesuwaną układankę

14

streszczenie

Celem tego wyzwania jest stworzenie nieopracowanej wersji graficznej 15-łamigłówki / przesuwanej układanki, zwanej także francuskim taquin .

Detale:

Biorąc pod uwagę wkład złożony z:

  • obraz,
  • liczba całkowita n,
  • inna liczba całkowita r,

Twój program, funkcja lub cokolwiek innego, co pasuje, musi wyświetlać ten sam obraz ( tj. ten sam rozmiar i format) co dane wejściowe, ale który przeszedł następujący proces:

  1. podziel obraz na prostokąty,
  2. losowo usuń jeden z tych prostokątów,
  3. przesuń losową liczbę sąsiadujących prostokątów z linii / kolumny, na którą wpływa punkt (2), aby utworzony otwór został wypełniony i w tej linii / kolumnie zostanie wygenerowany kolejny. Ten numer może być, 0jeśli puste miejsce znajduje się w rogu lub na krawędzi.

Powtórz (3.) rrazy.

Wyjaśnienia:

  • Jeśli przeniosłeś prostokąty z linii w kroku (3), musisz przenieść prostokąty z kolumny w następnym powtórzeniu,
  • jeśli przesunąłeś prostokąty od lewej do prawej w kroku linii, musisz je przesunąć od prawej do lewej w następnym kroku linii, tak samo w przypadku kolumn od góry do dołu i od dołu do góry,
  • możesz założyć, że nzostanie wybrany, aby dzielił długości boków obrazu.

Ostatni punkt:

Animacja .gifpokazująca cały proces jest bardzo mile widziana.

Proponuję użyć następującego obrazu (który jest 1024x768), z modelem n=16i, r=100jako model, możesz użyć dowolnego innego obrazu (o ile jest on odpowiedni i zgodny z zasadami SE), oczywiście.

Pamiętaj, że obowiązują zasady dotyczące luk w standardach .

To jest , więc wygrywa krótsze zgłoszenie!

Miłośnicy psów, kotów i kaczek powinni być zadowoleni!

Ponieważ zażądano przykładu, oto jeden, wykonany „ręcznie” za pomocą n=4ir=1

Kroki 1 i 2

wprowadź opis zdjęcia tutaj

Krok 3 : liniowo, 2 prostokąty po lewej stronie

wprowadź opis zdjęcia tutaj

Frédéric
źródło
Przykład sugeruje, że prostokąty nie muszą być tego samego rozmiaru, nie muszą obejmować całego obrazu i powinny zawierać linie narysowane nad oryginalnym obrazem. Czy możesz to wyjaśnić, zmieniając specyfikację lub przykład?
trichoplax
@trichoplax: przykład został narysowany ręcznie farbą i szybkością. Poprawię to poprawnie.
Frédéric,
@trichoplax: Muszę przyznać, że nie rozumiem całkowicie twojego punktu widzenia, ale ta linia początkowa nie jest potrzebna do zrozumienia wyzwania, więc myślę, że nie ma sensu go trzymać.
Frédéric
move a random number of contiguous rectanglesczy może to być 0 prostokątów? (utrudnieniem byłoby zachowanie zmiany programu, gdy puste miejsce jest na krawędzi / rogu)
JungHwan Min
@JungHwanMin: tak, może. Dobra uwaga, dzięki!
Frédéric

Odpowiedzi:

10

Mathematica, 246 bajtów

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

Funkcja anonimowa. Zawiera U + F3C7, co odpowiada MathematicaTranspose operatorowi . Ta funkcja pobiera Imageobiekt i zwraca Imageobiekt.

Przykładowa animacja z n=16 ir=100

Po 5000 iteracjach:

wprowadź opis zdjęcia tutaj(kliknij obraz, aby powiększyć wersję)

Wyjaśnienie

Inicjalizacja

n=Nest

Zapisz Nestfunkcję (operacja powtarzana) w n.

k=RandomInteger;q=Reverse;

Zapisz RandomIntegerfunkcję w ki Reversefunkcję wq .

Dzielenie obrazu

#~ImagePartition~Scaled[1/#2]

Podziel obraz wejściowy na (drugie wejście) ^ 2 kafelki.

{1,#2}~k~2

Wygeneruj dwa RandomIntegers między 1 a drugim wejściem. Wybiera losowy kafelek.

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

Zmień ten kafelek na biały. Przechowuj wi .

Ruchome płytki

{t,r}=1~k~2

Wygeneruj dwie losowe liczby całkowite od 0 do 1 i zapisz je odpowiednio w ti r. To losowo wybiera kierunek.

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

Zdefiniuj funkcję o: skład

  1. funkcja transponująca tczasy wejściowe .
  2. funkcja odwracająca każdy wiersz r.
o @ #

Zastosuj odo danych wejściowych.

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

Znajdź kolumnę i(biały obraz).

k[ ... -1]

Odejmij jeden i znajdź losową liczbę całkowitą od 0 do tej liczby. To losowo wybiera liczbę płytek do przesunięcia.

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

Gdy wspomniana liczba kafelków pojawi się przed i(białym obrazem), zmień ich miejsca.

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

Odwróć ofunkcję i zastosuj ją do wyniku powyższej operacji. Spowoduje to cofnięcie i cofnięcie obrazu.

Pętla i montaż obrazu

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

Powtórz powyższy proces (trzecie wejście) razy.

ImageAssemble@

Złóż zdjęcia razem.

JungHwan Min
źródło
1
Niezła odpowiedź ! Dzięki za szczegóły!
Frédéric,