Mathematica, 111 105 104 ไบต์
r=Floor[(1+Sqrt[(4#-1)/3])/2]&;t=Limit[Pi(#/(3x)+1-x),x->r@#]&;p=r@#*Exp[I*t@#]&;Round@Abs[p@#-p@#2]==1&
คำอธิบาย:
r=Floor[(1+Sqrt[(4#-1)/3])/2]&
กำหนดฟังก์ชั่นr
ที่รับอินพุต#
และคำนวณระยะทาง (ในจำนวนเซลล์) ไปยังเซลล์ 0 มันทำเช่นนี้โดยการหารูปแบบในเซลล์สุดท้ายของแต่ละระยะทาง / วงแหวน: 0 = 3 (0 ^ 2 + 0), 6 = 3 (1 ^ 2 + 1), 18 = 3 (2 ^ 2 + 2), 36 = 3 (3 ^ 2 + 3), ... และสลับสูตรสำหรับรูปแบบนั้น โปรดทราบว่าสำหรับเซลล์ 0 จริง ๆ แล้วใช้พื้นของ (1/2) + i * (sqrt (3) / 6) ซึ่งคำนวณส่วนประกอบที่ชาญฉลาดเพื่อรับ 0 + 0 * i = 0
ด้วยการr
กำหนดr@#
เป็นวงแหวนสำหรับเซลล์#
(ภายในนิยามของฟังก์ชันอื่น) #+3r@#-3(r@#)^2&
ไม่ปรากฏในรหัสอย่างแน่นอน แต่ใช้จำนวนเซลล์และลบจำนวนสูงสุดของเซลล์ในวงแหวนด้านในถัดไปเพื่อที่จะให้คำตอบสำหรับคำถาม "เซลล์ใดของวงแหวนปัจจุบันคืออะไร" ตัวอย่างเช่นเซลล์ 9 เป็นเซลล์ที่ 3 ของวงแหวน 2 ดังนั้นr[9]
จะมีเอาต์พุต 2 และ#+3r@#-3(r@#)^2&[9]
จะเป็นเอาต์พุต 3
สิ่งที่เราสามารถทำได้กับฟังก์ชั่นด้านบนคือใช้เพื่อค้นหามุมขั้ว , มุมทวนเข็มนาฬิกาจาก "เซลล์ 0, เซลล์ 17, เซลล์ 58," รังสีกับเซลล์ที่มีปัญหา เซลล์สุดท้ายของวงแหวนทุกวงจะอยู่ที่มุม Pi / 6 และเราไปรอบ ๆ วงแหวนด้วยการเพิ่มขึ้นของ Pi / (3 * ring_number) ดังนั้นในทางทฤษฎีเราจำเป็นต้องคำนวณบางสิ่งเช่น Pi / 6 + (which_cell_of_the_current_ring) * Pi / (3 * ring_number) อย่างไรก็ตามการหมุนของภาพไม่ส่งผลกระทบอะไรเลยดังนั้นเราสามารถละส่วน Pi / 6 (เพื่อบันทึก 6 ไบต์) การรวมสิ่งนี้เข้ากับสูตรก่อนหน้านี้และทำให้เราเข้าใจง่ายขึ้นPi(#/(3r@#)+1-r@#)&
น่าเสียดายที่นี่ไม่ได้กำหนดไว้สำหรับเซลล์ 0 เนื่องจากหมายเลขแหวนเป็น 0 ดังนั้นเราจึงต้องแก้ไข t=If[#==0,0,Pi(#/(3r@#)+1-r@#)]&
วิธีการแก้ปัญหาธรรมชาติจะเป็นสิ่งที่ชอบ แต่เนื่องจากเราไม่สนใจมุมของเซลล์ 0 และเนื่องจากr@#
ซ้ำเราจึงสามารถบันทึกไบต์ที่นี่ด้วยได้t=Limit[Pi(#/(3x)+1-x),x->r@#]&
ตอนนี้เรามีหมายเลขแหวนและมุมแล้วเราสามารถค้นหาตำแหน่งของเซลล์ (จุดศูนย์กลาง) เพื่อที่เราจะได้ทดสอบการ adjacency การค้นหาตำแหน่งที่แท้จริงนั้นน่ารำคาญเพราะวงแหวนนั้นเป็นรูปหกเหลี่ยม แต่เราสามารถแกล้งวงแหวนนั้นเป็นวงกลมที่สมบูรณ์แบบเพื่อที่เราจะรักษาหมายเลขแหวนเป็นระยะทางไปยังศูนย์กลางของเซลล์ 0 นี่จะไม่เป็นปัญหาเนื่องจากการประมาณนั้นค่อนข้างสวย ปิด. การใช้รูปแบบขั้วของจำนวนเชิงซ้อนเราสามารถแสดงตำแหน่งโดยประมาณนี้ในระนาบเชิงซ้อนด้วยฟังก์ชันง่าย ๆ :p = r@#*Exp[I*t@#] &;
ระยะห่างระหว่างจำนวนเชิงซ้อนสองจำนวนบนระนาบเชิงซ้อนนั้นกำหนดโดยค่าสัมบูรณ์ของความแตกต่างและจากนั้นเราสามารถปัดเศษผลลัพธ์เพื่อดูแลข้อผิดพลาดใด ๆ จากการประมาณและตรวจสอบว่านี่เท่ากับ 1 ฟังก์ชันที่สุดท้าย ไม่ทำงานนี้ไม่ได้มีชื่อ Round@Abs[p@#-p@#2]==1&
แต่เป็น
คุณสามารถลองออนไลน์ได้ในกล่องทดลองWolfram Cloudโดยการวางโค้ดเช่นต่อไปนี้แล้วคลิก Gear -> "Evaluate cell" หรือกด Shift + Enter หรือ Enter numpad:
r=Floor[(1+Sqrt[(4#-1)/3])/2]&;t=Limit[Pi(#/(3x)+1-x),x->r@#]&;p=r@#*Exp[I*t@#]&;Round@Abs[p@#-p@#2]==1&[24,45]
หรือสำหรับกรณีทดสอบทั้งหมด:
r=Floor[(1+Sqrt[(4#-1)/3])/2]&;t=Limit[Pi(#/(3x)+1-x),x->r@#]&;p=r@#*Exp[I*t@#]&;Round@Abs[p@#-p@#2]==1&//MapThread[#,Transpose[{{0,1},{7,18},{8,22},{24,45},{40,64},{64,65},{6,57},{29,90},{21,38},{38,60},{40,63},{41,39},{40,40}}]]&