ฉันมีบ็อตในรูปแบบสี่เหลี่ยมผืนผ้าที่มีแถวและคอลัมน์ ปัญหาเกิดขึ้นเมื่อบอทถูกเพิ่มหรือลบออกจากการสร้าง เมื่อสิ่งนี้เกิดขึ้นบอตจะต้องจัดเรียงตัวเองใหม่เพื่อให้การก่อตัวของรูปสี่เหลี่ยมผืนผ้ายังคงอยู่ในอัตราส่วนเดียวกันโดยประมาณและเป็นรูปสี่เหลี่ยมเท่าที่จะทำได้ ทำอย่างไร
ความคิดบางอย่าง:
เมื่อบอตถูกเพิ่มหรือลบให้ใช้จำนวนบอทใหม่ทั้งหมดและอัตราส่วนภาพคงที่ที่ต้องการเพื่อคำนวณความกว้างและความสูงใหม่ของการก่อตัวที่ใกล้เคียงที่สุดกับอัตราส่วนภาพนั้น จากนั้นจึงสลับสับเปลี่ยนบ็อตให้พอดีกับมิติใหม่
เมื่อบอทถูกลบออกให้ย้ายบอทที่อยู่ด้านหลังเข้าไปในที่ของมันและทำต่อไปจนกว่าจะถึงจุดสิ้นสุดของการก่อตัว จากนั้นให้ทำการจัดอันดับย้อนหลังให้มากที่สุดเท่าที่จะทำได้โดยการสับบอทในอันดับหลัง
ความคิดที่แตกต่างอย่างสิ้นเชิงคือการเลียนแบบโครงสร้างของโมเลกุลที่อยู่ร่วมกัน ทำให้บอททุกคนต้องการล้อมรอบด้วยบ็อตอีกสี่ตัวด้วยการดึงดูดบอทที่อยู่ใกล้ที่สุดทั้งสี่และป้องกันส่วนที่เหลือ ขับไล่บ็อตทั้งหมด (รวมถึงสี่) ที่อยู่ใกล้เกินไปเพื่อให้แน่ใจว่าแยกโดยใช้กฎหมายกำลังสองผกผัน คุณต้องการแรงเพิ่มเติมในการสร้างรูปร่างของโครงสร้างทั้งหมด แต่มันฟังดูแพงมาก
UPDATE : ดังนั้นเมื่อพิจารณาถึงคำตอบของซาร่าห์ฉันจึงมีฟังก์ชั่นทั่วไปที่ดีซึ่งให้มิติที่ดี
แรกฉันแก้ไขสมการด้านล่างพร้อมกันสำหรับความกว้างและความสูงแล้วปัดคำตอบ
width/height=aspect ratio of your choice
width*height=number of bots
สิ่งนี้จะช่วยให้คุณได้สัดส่วนจำนวนเต็มที่ใกล้เคียงที่สุดกับอัตราส่วนนั้นสำหรับจำนวนบอทของคุณ สี่เหลี่ยมจัตุรัสที่ใกล้เคียงที่สุดจะครึ่งหนึ่งมีขนาดใหญ่เกินไปและครึ่งเวลาเล็กเกินไป (แน่นอนว่าบางครั้งมันอาจจะถูกต้อง แต่ใครสนใจพวกนั้น) ในกรณีที่รูปสี่เหลี่ยมผืนผ้ามีขนาดใหญ่เกินไปเล็กน้อยไม่จำเป็นต้องทำสิ่งใด อันดับหลังจะจบลงด้วยการเกือบเต็มซึ่งเป็นอุดมคติ ในกรณีที่สี่เหลี่ยมผืนผ้าเป็นเล็ก ๆ น้อย ๆที่มีขนาดเล็กเกินไปคุณมีปัญหาเพราะที่เล็กล้นขนาดเล็กจะต้องไปในการจัดอันดับของตัวเองสร้างขึ้นตำแหน่งที่มีเพียงไม่กี่บอทกับมันซึ่งไม่ได้ดูสวย นอกจากนี้ยังมีกรณีที่ความแตกต่างมีขนาดใหญ่(ใหญ่กว่าความกว้างครึ่งหนึ่ง) ซึ่งในกรณีนี้จะเพิ่มหรือลบอันดับหนึ่งเพื่อสร้างความแตกต่างเล็ก ๆ จากนั้นเมื่อสี่เหลี่ยมผืนผ้าเล็กเกินไปให้เพิ่มหนึ่งคอลัมน์เพื่อทำให้ใหญ่ขึ้นอีกหน่อย หลังจากทำแล้วดูเหมือนว่าอันดับหลังจะมีอย่างน้อยครึ่งบอทมากพอ ๆ กับอันดับอื่น ๆ
UPDATE
เมื่อคุณได้มิติแล้วให้เปรียบเทียบกับมิติปัจจุบัน หากด้านหน้าของมิติใหม่ใหญ่กว่าสำหรับทุก ๆ อันดับป๊อปบ็อตจากอันดับด้านล่างและผลักพวกเขาไปยังตำแหน่งปัจจุบันจนกระทั่งจำนวนของบอทในอันดับนั้นเท่ากับด้านหน้า ดำเนินการตามอัลกอริทึมนั้นจนกว่าคุณจะได้อันดับหลัง เมื่อใช้อัลกอริธึมนี้หุ่นยนต์จะเคลื่อนย้ายเพื่อให้พอดีกับมิติใหม่ได้อย่างมีประสิทธิภาพ หลังจากนั้นฉันก็แค่ดันเก่าใหม่ไปยังตำแหน่งด้านหลัง อัลกอริทึมนั้นแตกต่างกันเล็กน้อยสำหรับกรณีที่ด้านหน้าใหม่เล็ก แต่คุณสามารถหาได้!
ยังมีปัญหาอีกสองข้อต่อไป การลบและวิธีการเพิ่มเติมที่ยืดหยุ่นยิ่งขึ้นโดยไม่จำเป็นต้องกำหนดบอตใหม่ให้กับอันดับหลัง แต่ตำแหน่งใดก็ตามที่ใกล้เคียงกับพวกเขามากที่สุดในขณะที่มีการเพิ่ม