ชีวิตที่แปลกประหลาดของรังผึ้ง


19

นักวิจัยได้ค้นพบอาณานิคมผึ้งที่น่าสนใจซึ่งอาศัยอยู่ในทุ่งรวงผึ้งที่ไม่มีที่สิ้นสุด:

รังผึ้ง

แต่ละเซลล์สามารถเลี้ยงผึ้งได้หรือไม่ ในความเป็นจริงชีวิตของสิ่งมีชีวิตเหล่านั้นดูเหมือนจะวุ่นวาย ... สามารถคำนวณได้ว่าอาณานิคมจะเริ่มต้นด้วยรูปแบบต่อไปนี้เสมอ:

รูปแบบเริ่มต้น

(ผึ้งวาดโดย เอ็มมานู Boutet ในวิกิพีเดีย . นี้ภาพรังผึ้งและผึ้งจึงออกภายใต้ CC-By-SA . grumbles )

หลังจากนั้นวงจรชีวิตของผึ้งจะถูกแบ่งออกเป็นรุ่นที่เรียกว่า ผึ้งเก่าแต่ละรุ่นตายและฟักใหม่และขึ้นอยู่กับเพื่อนบ้านของเซลล์เป็นหลัก:

  • หากผึ้งมีเพื่อนบ้านน้อยกว่าสองคนมันจะตายเนื่องจากความเหงา
  • หากผึ้งมีเพื่อนบ้านมากกว่าสามคนมันจะตายเนื่องจากความแออัด
  • หากเซลล์มีผึ้งสองหรือสามหรือสี่ตัวในเซลล์ข้างเคียงผึ้งตัวใหม่จะฟักที่นั่นในรุ่นต่อไป

ผึ้งที่ตายจะไม่ตายจนกว่าจะถึงยุคสุดท้ายดังนั้นพวกมันจึงยังคงมีผลต่อเซลล์รอบข้างที่อาจฟักผึ้งในรุ่นต่อไป

ตอนนี้เรารู้แล้วว่าอาณานิคมเหล่านี้ทำงานอย่างไรเราสามารถจำลองมันได้หลายชั่วอายุคน

อินพุต

อินพุตเป็นหมายเลขเดียวNซึ่งถูกกำหนดให้กับอินพุตมาตรฐานถูกยกเลิกโดยตัวแบ่งบรรทัด 0 ≤ N ≤ 150 นี่คือจำนวนรุ่นที่จะจำลอง

เอาท์พุต

เอาท์พุทเป็นตัวเลขเดี่ยวในเอาต์พุตมาตรฐานและตามด้วยตัวแบ่งบรรทัดเดียวซึ่งแทนจำนวนผึ้งที่มีชีวิตหลังจาก รุ่นN

เอาต์พุตเพิ่มเติมเกี่ยวกับข้อผิดพลาดมาตรฐานจะถูกละเว้น

อินพุตตัวอย่าง

0
5
42
100

ตัวอย่างผลลัพธ์

6
44
1029
5296

สภาพการชนะ

รหัสที่สั้นที่สุดชนะเช่นเดียวกับในกอล์ฟ ในกรณีที่เสมอกันการแก้ปัญหาก่อนหน้านี้ชนะ

กรณีทดสอบ

มีสองสคริปต์ทดสอบที่มีกรณีทดสอบเหมือนกัน:

ภาวนาอยู่ในทั้งสองกรณี: <test script> <my program> [arguments]เช่นหรือ./test ruby beehive.rb./test.ps1 ./beehive.exe

ฉันรู้ว่ามีเพียง 22 การทดสอบแทน 151 (ส่วนใหญ่เป็นเพราะการแก้ปัญหามักจะค่อนข้างช้า) โปรดงดเว้นการฝังกรณีทดสอบที่แน่นอนแทนที่จะแก้ปัญหา สคริปต์เหล่านี้อำนวยความสะดวกให้คุณทดสอบว่าการเปลี่ยนแปลงยังทำให้โปรแกรมทำงานอย่างถูกต้องหรือไม่ ไม่ใช่ว่าคุณสามารถปรับรหัสของคุณกับกรณีทดสอบเฉพาะ

หมายเหตุอื่น

งานนี้เป็นส่วนหนึ่งของการแข่งขันกอล์ฟที่จัดขึ้นที่มหาวิทยาลัยของฉันในช่วงปี 2011-W24 คะแนนและภาษาของผู้แข่งขันของเรามีดังนี้:

  • 336 - C
  • 363 - C
  • 387 - C
  • 389 - Haskell
  • 455 - C

ทางออกของเราคือ

  • 230 - ทับทิม

ฟังดูคล้ายกับเกมชีวิตของคอนเวย์
Peter Olson

แน่นอน; นั่นเป็นเหตุผลที่มันถูกแท็กด้วยวิธีนั้นเช่นกัน มันถูกปกคลุมบาง ๆ อย่างแน่นอน
Joey

คำตอบ:


9

Ruby, 181 163 153 146 ตัวอักษร

h=[0]*4e4
[0,-200,201,202,2,3].map{|i|h[i]=1}
gets.to_i.times{h=h.map{[g=1,200,201].map{|x|g+=h[x]+h[-x]};g>5-h.rotate![-1]||g<3?0:1}}
p h.count 1

การใช้งานนี้เป็นไปตามวิธีมาตรฐานโดยใช้อาร์เรย์h(ขนาด200x 200แบน) โดยที่แต่ละองค์ประกอบเป็น0(ไม่มีผึ้ง) หรือ1(รวมอยู่ในผึ้ง) อาร์เรย์[0,-200,201,202,2,3]อธิบายตำแหน่งเริ่มต้นของผึ้ง (สัมพันธ์กับเซลล์เริ่มต้นใด ๆ )

อินพุตและเอาต์พุตตามที่ระบุไว้ข้างต้นผ่านการทดสอบทุกกรณีที่กำหนดไว้

แก้ไข 1:เปลี่ยนกลับเป็นโซลูชันการตัดคำแทนที่จะเป็น "ช่องว่างเพิ่มเติม" - รุ่น (ซึ่งสั้นกว่าในรุ่นกลาง แต่ตอนนี้มีอักขระอีกหลายตัว)

แก้ไข 2:ลบตัวแปรbทั้งหมด

แก้ไข 3:คำเตือน: การแก้ไขนี้ทำให้โปรแกรมช้าอย่างน่ากลัว ฉันจึงลดขนาดลงเหลือ 200 รายการซึ่งยังคงเพียงพอสำหรับการวนซ้ำซ้ำได้ถึง 150 ครั้ง แทนที่จะทำดัชนีอาร์เรย์ด้วยตัวแปรเราจะหมุนอาร์เรย์ไปข้างหน้าอย่างต่อเนื่อง ไม่ใช่การออกแบบที่ดีจริงๆ แต่ตอนนี้เราต่ำกว่า 150 มาก


7

Python 152 ตัวอักษร

P=[0,2,3,1j,1+1j,1-1j]
for i in' '*input():Q=[p+d for d in(1,-1,1j,-1j,1j-1,1-1j)for p in P];P=set(p for p in Q if 1<Q.count(p)<5-(p in P))
print len(P)

โซลูชันนี้ติดตามตำแหน่งผึ้งด้วยชุดของตัวเลขที่ซับซ้อน มันค่อนข้างช้าเพราะวงในนั้นเป็นกำลังสองในจำนวนของผึ้ง ฉันทดสอบถึง 50 แล้วมันใช้งานได้


Python2.7 ได้ตั้งค่าความเข้าใจ
gnibbler

ฉันคิดว่าจะติดตามผึ้ง แต่ทำมันด้วยตัวเลขที่ซับซ้อนเช่นนั้นเรียบร้อยจริงๆ! นอกจากนี้คุณสามารถบันทึก 3 ตัวอักษรโดยแทนที่ for loop ด้วย exec (เหมือนที่ฉันทำ)
Jules Olléon

Python2.7 ยังมีการตั้งค่าตัวอักษรเพื่อให้คุณสามารถเขียนP={0,2,3,1j,1+1j,1-1j}และใช้{p}<Pในการทดสอบการเป็นสมาชิก (ประหยัด 1 ตัว)
gnibbler

5

Python, 171 169 158 ตัวอักษร

w=300
s=w*w
x=[0]*297
h=[1,1,0]+x+[1,0,1,1]+x+[1]+x*s
exec('h=[1<sum(h[(i+x)%s]for x in[-1,-w-1,-w,1,w+1,w])<5-h[i]for i in range(s)];'*input())
print sum(h)

ฉันจำลองโลกเป็นอาร์เรย์ 1D 300 * 300 = 900000 ( hจริง ๆ แล้วใหญ่กว่า แต่ไม่ได้ใช้จุดสิ้นสุด) โดยที่ผึ้งเป็น 1 และว่างเปล่าคือ 0 ขนาดของ 300 นั้นดีเพราะการเติบโตส่วนใหญ่จะเป็น 2 ในแต่ละมิติสำหรับแต่ละรุ่นและมีไม่เกิน 150 รุ่น

นี่เป็นเวอร์ชั่นที่ไม่ค่อยดีนักและแสดงความคิดเห็น:

w=300 # width and height of the world
s=w*w
# create initial grid
l=[1,1]+[0]*298+[1,0,1,1]+[0]*297+[1]+[0]*s

for k in range(input()):
  h=l[:]

  for i in range(s):

    # for each point, compute the number of neighbors
    n=sum(map(lambda x:h[(i+x)%s],[-1,-w-1,-w,1,w+1,w]))

    # if that number verifies the conditions, put 1 here, if not put 0
    l[i]=1<n<5-h[i]

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