Sürgülü bir bulmaca içine bir resim yapmak


14

özet

Bu zorluğun amacı, Fransızca'da taquin olarak da adlandırılan 15 bulmaca / kayan bulmacanın geri alınmamış bir görüntü sürümünü oluşturmaktır .

Detaylar:

Aşağıdakilerden oluşan bir girdi verildiğinde:

  • bir şekil,
  • bir tamsayı n,
  • başka bir tam sayı r,

programınız veya işleviniz veya uygun olan herhangi bir şey , girişle aynı görüntüyü ( yani aynı boyut ve biçim) çıktılamalıdır , ancak aşağıdaki işlemlerden geçmiştir:

  1. görüntüyü dikdörtgenlere bölün ,
  2. bu dikdörtgenlerden birini rastgele,
  3. nokta (2) 'den etkilenen çizgi / sütundan rastgele sayıda bitişik dikdörtgen taşıyın, böylece oluşturulan delik doldurulur ve bu çizgi / sütunda başka bir tane oluşturulur. Bu sayı 0, boşluk bir köşede veya kenardaysa olabilir.

(3.) rkez tekrarlayın .

Açıklamalar:

  • Dikdörtgenleri (3.) adımındaki satırdan taşıdıysanız, dikdörtgenleri bir sonraki tekrardaki sütundan taşımalısınız,
  • dikdörtgenleri bir satır adımında sola-sağa taşıdıysanız, sütunlarla ilgili yukarıdan aşağıya ve aşağıdan yukarıya doğru bir sonraki adımda sağdan sola taşınmaları gerekir,
  • nbunun resmin kenarlarının uzunluklarını böldüğü şekilde seçileceğini varsayabilirsiniz .

Son nokta:

.gifTüm süreci gösteren bir animasyon çok memnuniyetle karşılanmaktadır.

Aşağıdaki resmi (yani 1024x768), bir modelle n=16ve r=100bir model olarak kullanmayı öneririm ( başka bir resmi kullanabilirsiniz (tabii ki ilgili ve SE kurallarına uyduğu sürece).

Standart boşlukların politikalarının geçerli olduğunu unutmayın .

Bu , bu yüzden kısa teslim kazanır!

Köpekler, kediler ve ördekler sevenler memnun olmalı!

Bir örnek istendiğinden, işte "elle" yapılan, n=4ver=1

Adım 1 ve 2

resim açıklamasını buraya girin

3.Adım : Çizgi şeklinde, sola 2 dikdörtgen

resim açıklamasını buraya girin


Örnek, dikdörtgenlerin aynı boyutta olması gerekmediğini, tüm görüntüyü kapsaması gerekmediğini ve orijinal görüntünün üzerine çizilen çizgileri içermesi gerektiğini göstermektedir. Şartnameyi veya örneği değiştirerek bunu açıklığa kavuşturabilir misiniz?
trichoplax

@trichoplax: örnek elle boya ve çabukluk ile çizildi. Düzgün bir şekilde tekrar yapacağım.
Frédéric

@trichoplax: Fikrinizi tam olarak anlamadığımı itiraf etmeliyim, ancak bu açılış çizgisinin meydan okumayı anlamak için gerekli olmadığını, bu yüzden bunu sürdürmenin yararsız olduğunu düşünüyorum.
Frédéric

move a random number of contiguous rectangles0 dikdörtgen olabilir mi? (boşluk bir kenarda / köşede olduğunda programın değişiklik davranışını değiştirmek acı
verici olacaktır

@JungHwanMin: evet yapabilir. İyi not, teşekkürler!
Frédéric

Yanıtlar:


10

Mathematica, 246 bayt

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

Anonim işlev. Mathematica'nın Transposeoperatörüne karşılık gelen U + F3C7 içerir . Bu işlev bir Imagenesneyi alır ve bir Imagenesneyi döndürür .

İle Numune Animasyon, n=16ver=100

5000 tekrardan sonra:

resim açıklamasını buraya girin(daha büyük versiyon için resme tıklayınız)

açıklama

Başlatma

n=Nest

Mağaza Nestişlevi (tekrar eden çalışma) n.

k=RandomInteger;q=Reverse;

Mağaza RandomIntegeriçinde işlevini kve Reversefonksiyonu q.

Görüntüyü bölme

#~ImagePartition~Scaled[1/#2]

Giriş görüntüsünü (ikinci giriş) ^ 2 döşemesine bölün.

{1,#2}~k~2

RandomInteger1 ve ikinci giriş arasında iki s oluşturun . Bu rastgele bir döşeme seçer.

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

Döşemeyi beyaz yap. İçinde saklayın i.

Hareketli Fayans

{t,r}=1~k~2

0 ile 1 arasında iki rasgele tamsayılar oluşturun ve bunları saklamak tve rsırasıyla. Bu yönü rastgele seçer.

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

Fonksiyonu tanımlayın o:

  1. giriş tzamanlarını aktaran bir fonksiyon .
  2. her satırın rzamanını tersine çeviren bir işlev .
Ö@#

oGirişe uygulayın .

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

i(Beyaz görüntü) sütununu bulun .

k[ ... -1]

Birini çıkarın ve 0 ile bu sayı arasında rastgele bir tam sayı bulun. Bu rastgele kaç karo hareket edeceğini seçer.

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

Bahsedilen karo sayısı i(beyaz görüntü) öncesinde meydana geldiğinde yerlerini değiştirin.

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

oİşlevi ters çevirin ve yukarıdaki işlemin sonucuna uygulayın. Bu görüntüyü tersine çevirir ve tersine çevirir.

Döngü ve Görüntü Birleştirme

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

Yukarıdaki işlem (üçüncü giriş) sürelerini tekrarlayın.

ImageAssemble@

Görüntüleri bir araya getirin.


1
Güzel cevap! Detaylar için teşekkürler!
Frédéric
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.