ทำให้ภาพเป็นตัวต่อแบบเลื่อน


14

สรุป

เป้าหมายของความท้าทายนี้คือการสร้างตัวต่อปริศนา 15 ตัว / เลื่อนซึ่งเรียกว่าtaquinในภาษาฝรั่งเศส

รายละเอียด:

รับอินพุตประกอบด้วย:

  • รูปภาพ
  • จำนวนเต็มn,
  • จำนวนเต็มอื่น ๆr,

โปรแกรมหรือฟังก์ชั่นของคุณหรือสิ่งอื่น ๆ ที่เหมาะกับคุณจะต้องส่งออกภาพเดียวกัน ( เช่นขนาดและรูปแบบเดียวกัน) เป็นอินพุท แต่เปลี่ยนไปตามกระบวนการต่อไปนี้:

  1. แบ่งภาพออกเป็นสี่เหลี่ยม
  2. ลบสี่เหลี่ยมอันใดอันหนึ่งแบบสุ่ม
  3. ย้ายจำนวนสุ่มของรูปสี่เหลี่ยมผืนผ้าที่ต่อเนื่องกันจากบรรทัด / คอลัมน์ที่ได้รับผลกระทบจากจุด (2. ) เพื่อให้หลุมที่สร้างเต็มไปและอีกหนึ่งจะถูกสร้างขึ้นในบรรทัด / คอลัมน์นี้ ตัวเลขนี้อาจเป็นได้0ว่าช่องว่างอยู่ในมุมหรือขอบ

ทำซ้ำ (3. ) rครั้ง

ชี้แจง:

  • หากคุณย้ายสี่เหลี่ยมจากบรรทัดในขั้นตอนที่ (3) คุณต้องย้ายสี่เหลี่ยมจากคอลัมน์ในการทำซ้ำครั้งถัดไป
  • หากคุณย้ายสี่เหลี่ยมจากซ้ายไปขวาในขั้นตอนบรรทัดจะต้องย้ายจากขวาไปซ้ายในขั้นตอนบรรทัดถัดไปเช่นเดียวกันกับคอลัมน์จากบนลงล่างและล่างขึ้นบน
  • คุณอาจสันนิษฐานว่าnจะถูกเลือกเพื่อให้มันหารความยาวของด้านข้างของภาพ

จุดสุดท้าย:

ภาพเคลื่อนไหวที่.gifแสดงกระบวนการทั้งหมดได้รับการต้อนรับอย่างมาก

ฉันเสนอให้ใช้รูปภาพต่อไปนี้ (ซึ่งก็คือ1024x768) ด้วยn=16และr=100ในฐานะที่เป็นแบบจำลองคุณสามารถใช้รูปภาพอื่น ๆ (ตราบเท่าที่มันเกี่ยวข้องและสอดคล้องกับกฎของ SE แน่นอน)

โปรดทราบว่ามีการใช้นโยบายช่องโหว่มาตรฐาน

นี่คือดังนั้นการส่งที่สั้นจะชนะ!

คนรักสุนัขแมวและเป็ดควรได้รับความพึงพอใจ!

เนื่องจากมีการร้องขอตัวอย่างนี่คือหนึ่งทำด้วยมือ "ด้วยn=4และr=1

ขั้นตอนที่ 1 และ 2

ป้อนคำอธิบายรูปภาพที่นี่

ขั้นตอนที่ 3 : line-wise 2 สี่เหลี่ยมไปทางซ้าย

ป้อนคำอธิบายรูปภาพที่นี่


ตัวอย่างแสดงให้เห็นว่ารูปสี่เหลี่ยมไม่จำเป็นต้องมีขนาดเท่ากันไม่จำเป็นต้องครอบคลุมรูปภาพทั้งหมดและควรมีเส้นที่ลากผ่านภาพต้นฉบับ คุณช่วยอธิบายสิ่งนี้ได้โดยการเปลี่ยนสเปคหรือตัวอย่าง?
trichoplax

@trichoplax: ตัวอย่างวาดด้วยมือด้วยสีและความรวดเร็ว ฉันจะทำซ้ำอย่างถูกต้อง
Frédéric

@trichoplax: ฉันต้องยอมรับว่าฉันไม่ได้รับคะแนนของคุณอย่างสมบูรณ์ แต่บรรทัดแรกไม่จำเป็นต้องเข้าใจความท้าทายดังนั้นฉันคิดว่ามันไม่มีประโยชน์อะไรที่จะรักษามันไว้
Frédéric

move a random number of contiguous rectanglesมันสามารถเป็น 0 สี่เหลี่ยม? (มันจะเป็นความเจ็บปวดที่จะทำให้โปรแกรมเปลี่ยนพฤติกรรมเมื่อที่ว่างอยู่บนขอบ / มุม)
JungHwan Min

@JungHwanMin: ใช่มันทำได้ คำพูดที่ดีขอบคุณ!
Frédéric

คำตอบ:


10

Mathematica ขนาด 246 ไบต์

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

ฟังก์ชั่นไม่ระบุชื่อ มี U + F3C7 ซึ่งสอดคล้องกับTransposeโอเปอเรเตอร์ของ Mathematica ฟังก์ชั่นนี้ใช้Imageวัตถุและส่งคืนImageวัตถุ

ตัวอย่างแอนิเมชั่นด้วยn=16และr=100

หลังจาก 5,000 ซ้ำ:

ป้อนคำอธิบายรูปภาพที่นี่(คลิกที่ภาพเพื่อดูขนาดใหญ่ขึ้น)

คำอธิบาย

การเริ่มต้น

n=Nest

เก็บNestฟังก์ชั่น (การทำงานซ้ำ) nใน

k=RandomInteger;q=Reverse;

เก็บRandomIntegerฟังก์ชั่นในkและฟังก์ชั่นในReverseq

แยกภาพ

#~ImagePartition~Scaled[1/#2]

แบ่งภาพอินพุตเข้า (อินพุตที่สอง) ^ 2 ไทล์

{1,#2}~k~2

สร้างสองRandomIntegers ระหว่าง 1 และอินพุตที่สอง สิ่งนี้จะเลือกไทล์แบบสุ่ม

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

ทำให้กระเบื้องนั้นขาว iเก็บไว้ใน

ย้ายกระเบื้อง

{t,r}=1~k~2

สร้างจำนวนเต็มสองจำนวนสุ่มจาก 0 ถึง 1 และเก็บไว้ในtและrตามลำดับ เลือกทิศทางแบบสุ่ม

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

กำหนดฟังก์ชั่นo: องค์ประกอบของ

  1. ฟังก์ชั่นการโอนtเวลาเข้า
  2. ฟังก์ชั่นย้อนกลับแต่ละrครั้ง
o @ #

นำoไปใช้กับอินพุต

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

ค้นหาคอลัมน์ของi(ภาพสีขาว)

k[ ... -1]

ลบหนึ่งและหาจำนวนเต็มแบบสุ่มระหว่าง 0 และหมายเลขนั้น นี่เป็นการสุ่มเลือกจำนวนไพ่ที่จะย้าย

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

เมื่อจำนวนกระเบื้องที่กล่าวถึงเกิดขึ้นก่อนi(ภาพสีขาว) ให้เปลี่ยนตำแหน่ง

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

ย้อนกลับoฟังก์ชั่นและนำไปใช้กับผลลัพธ์ของการดำเนินการข้างต้น การยกเลิกการย้อนกลับและการยกเลิกการสลับภาพ

การประกอบการวนรอบและรูปภาพ

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

ทำซ้ำกระบวนการข้างต้น (อินพุทที่สาม)

ImageAssemble@

ใส่ภาพเข้าด้วยกัน


1
คำตอบที่ดี! ขอบคุณสำหรับรายละเอียด!
Frédéric
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.