นี่เป็นการพัฒนาต่อไปของคำตอบของ@ ais523ลดไปเป็นวงเล็บสองชุดเท่านั้นและยังใช้การจัดวางเซลล์ที่กะทัดรัดมากขึ้นตามทฤษฎีไม้บรรทัด Golomb ais523 ได้สร้างคอมไพเลอร์สำหรับสิ่งปลูกสร้างนี้รวมถึงเซสชัน TIO นี้แสดงตัวอย่างโปรแกรม BF ที่เกิดขึ้นพร้อมกับการติดตามการดีบักของ TWM เคาน์เตอร์
เช่นเดียวกับต้นฉบับสิ่งนี้เริ่มต้นด้วยโปรแกรมในThe Waterfall Modelโดยมีข้อ จำกัด บางประการที่ไม่สูญเสียความเป็นนายพล:
- ตัวนับทั้งหมดมีค่าการรีเซ็ตตนเองเหมือนกันR ; นั่นคือ TWM แผนที่ไกfมีคุณสมบัติที่f(x,x)=Rสำหรับทุกxx
- มีเพียงครั้งเดียวที่เคาน์เตอร์ลังเลเป็นชั่วโมงh
- จำนวนcของเคาน์เตอร์คือ(p−1)/2สำหรับบางจำนวนเฉพาะพีp
ไม้บรรทัด Golomb
เรารวมโครงสร้างErdős – Turánเข้ากับฟังก์ชันการเปลี่ยนแปลงของอาร์เรย์ Welch – Costasเพื่อให้ไม้บรรทัด Golomb มีคุณสมบัติที่จำเป็น
(ฉันแน่ใจว่าการรวมกันนี้ไม่สามารถเป็นความคิดใหม่ได้ แต่เราเพิ่งพบและประกอบเข้าด้วยกันสองชิ้นนี้จาก Wikipedia)
ให้rเป็นรากดั้งเดิมของp=2c+1 1 กำหนดฟังก์ชั่น
g(k)=4ck−((rk−1)mod(2c+1)),k=0,…,2c−1.
- gเป็นไม้บรรทัด Golombของการสั่งซื้อ2cนั่นคือความแตกต่างไม่ซ้ำกันสำหรับคู่ของตัวเลขที่แตกต่างกันทุก\}2cg(i)−g(j)i,j∈{0,…,2c−1}
- g(k)mod(2c)รับทุกค่าครั้งเดียว0,…,2c−1
โครงสร้างเทป
สำหรับแต่ละตัวนับ TWMเรากำหนดตำแหน่งเซลล์เทป BF สองตำแหน่งเซลล์ทางเลือกและเซลล์มูลค่า :x∈{0,…,c−1} u(x) v(x)
u(x)=g(k1)<v(x)=g(k2) with u(x)≡v(x)≡x(modc)
โดยคุณสมบัติที่สองของมีค่าแตกต่างกันสองค่าให้เลือกgk1,k2
เนื้อหาของเซลล์สำรองจะใช้เวลาส่วนใหญ่ที่ยกเว้นเมื่อมีการเยี่ยมชมเคาน์เตอร์เมื่อมันจะอยู่ที่สองเท่าของค่ารีเซ็ตตัวนับ เซลล์มูลค่าจะถูกเก็บไว้ที่สองเท่าของค่าของตัวนับ TWM ที่สอดคล้องกัน02R
เซลล์อื่นทั้งหมดที่สามารถเข้าถึงได้โดยการเรียกใช้งานโปรแกรม BF (จำนวน จำกัด ) จะถูกเก็บไว้ที่ค่าคี่เพื่อให้พวกเขาทดสอบเสมอว่าไม่ใช่ศูนย์ หลังจากการเริ่มต้นนี้เป็นไปโดยอัตโนมัติเพราะการปรับเซลล์ทั้งหมดเป็นจำนวนเท่ากัน
หากต้องการตำแหน่งของเซลล์ทั้งหมดสามารถเลื่อนไปทางขวาโดยค่าคงที่เพื่อหลีกเลี่ยงการเลื่อนไปทางซ้ายของตำแหน่งเทป BF เริ่มต้น
โครงสร้างโปรแกรม BF
ให้เป็นระยะทางระหว่างค่าของตัวนับหยุดและเซลล์ fallback และให้เป็นจำนวนที่มากพอที่สำหรับทุกเคาน์เตอร์xจากนั้นโครงสร้างโปรแกรม BF พื้นฐานคือH=v(h)−u(h)NcN+1≥v((x+1)modc)−u(x)x
การกำหนดค่าเริ่มต้น adjustment[
>
×(H+cN+1) [
<
×c ]
<
×H ]
การเริ่มต้น
เริ่มต้นขั้นตอนการตั้งค่าเซลล์ทั้งหมดสามารถเข้าถึงได้โดยโปรแกรมไปเป็นค่าเริ่มต้นของพวกเขาอยู่ในสถานะเป็นถ้าเคาน์เตอร์ล่าสุดเพิ่งได้รับการเข้าเยี่ยมชมและเซลล์เพียงเซลล์ที่ใช้งานอยู่เป็นทางเลือกของ :u(c−1)
- เซลล์ค่าจะเริ่มต้นเป็นสองเท่าของเนื้อหาเริ่มต้นของตัวนับ TWM ที่สอดคล้องกันยกเว้นตัวนับนั้นจะถูกลดค่าลงล่วงหน้า0
- เซลล์สำรองมีการกำหนดให้ยกเว้นเซลล์ซึ่งถูกตั้งค่าให้2R0u(c−1)2R
- เซลล์อื่น ๆ ทั้งหมดที่สามารถเข้าถึงได้โดยโปรแกรม (จำนวน จำกัด ) มีการกำหนดให้11
แล้วชี้เทปจะถูกย้ายไปยังตำแหน่ง (เสมอไม่ใช่ศูนย์มือถือ) ก่อนที่เราจะไปถึงโปรแกรมแรกu(c−1)−H[
จุดเริ่มต้นของวงรอบนอก
ในตอนต้นของทวนของวงนอกนั้นตัวชี้เทปจะอยู่ที่ทั้งสองหรือสำหรับเคาน์เตอร์xu(x)−Hv(x)−Hx
ให้เป็นตัวนับถัดไปเพื่อเข้าชมy=((x+1)modc)
การเคลื่อนไหวสถานที่ชี้เทปกับตำแหน่งที่เป็นและไม่ได้ไปทางซ้ายของ(y)>
×(H+cN+1)≡y(modc)v(y)
วนรอบภายในค้นหาทางด้านซ้ายเป็นขั้นตอนเพื่อหาเซลล์ศูนย์ ถ้านับเป็นศูนย์แล้วมันจะหยุดที่เซลล์ (ศูนย์) ค่า ; มิฉะนั้นก็จะพบเซลล์กำกับ(y)[
<
×c ]
cyv(y)u(y)
เซลล์ใดที่พบจะกลายเป็นเซลล์ที่ใช้งานใหม่
การปรับ
ปรับขั้นตอนการปรับเซลล์ต่างๆในเทปขึ้นอยู่กับตำแหน่งของพวกเขาเมื่อเทียบกับเซลล์ที่ใช้งาน ส่วนนี้มี+-><
คำสั่งเท่านั้นและการปรับเหล่านี้เกิดขึ้นโดยไม่มีเงื่อนไข อย่างไรก็ตามเนื่องจากเซลล์ที่เกี่ยวข้องกับเคาน์เตอร์ทั้งหมดอยู่ในรูปแบบไม้บรรทัด Golomb การปรับเปลี่ยนใด ๆ ที่ไม่เหมาะสมสำหรับเซลล์ที่ใช้งานในปัจจุบันจะทำให้พลาดเซลล์ที่สำคัญทั้งหมดและปรับเซลล์ที่ไม่เกี่ยวข้องบางส่วนแทน
รหัสที่แยกต่างหากจะต้องรวมอยู่ในโปรแกรมสำหรับแต่ละคู่ที่เป็นไปได้ของเซลล์ที่ใช้งานและปรับเปลี่ยนยกเว้นการปรับตัวของเซลล์ที่ใช้งานซึ่งเนื่องจากการปรับขึ้นอยู่กับตำแหน่งสัมพัทธ์เพียงอย่างเดียวจะต้องใช้ร่วมกันระหว่างพวกเขาทั้งหมด
การปรับที่จำเป็นคือ:
- ปรับเซลล์สำรองเคาน์เตอร์ก่อนหน้านี้โดย-2Ru(x)−2R
- ปรับเซลล์สำรองเคาน์เตอร์ปัจจุบันของโดย , ยกเว้นถ้าเซลล์ที่ใช้งานปัจจุบันคือและอื่น ๆ ที่เราควรจะหยุดu(y)2Rv(h)
- ปรับค่าของเซลล์ตัวนับถัดไปโดย (ลดค่าตัวนับ)v((y+1)modc)−2
- เมื่อเซลล์ที่ใช้งานเป็นเซลล์มูลค่า (ดังนั้นตัวนับถึงศูนย์) ให้ปรับค่าเซลล์ทั้งหมดจากแผนที่ทริกเกอร์ TWM ตัวเองกลายเป็นปรับได้โดย2Rv(y)yv(z)2f(y,z)v(y)2R
การปรับครั้งแรกและครั้งที่สองด้านบนนั้นจำเป็นโดยข้อเท็จจริงที่ว่าเซลล์ที่ใช้งานทั้งหมดจะต้องปรับตัวเองด้วยค่าเดียวกันนั่นคือสำหรับเซลล์ที่มีค่าและดังนั้นสำหรับเซลล์ทางเลือก สิ่งนี้ต้องมีการเตรียมและทำความสะอาดเซลล์ทางเลือกเพื่อให้แน่ใจว่าพวกมันจะกลับมาเป็นทั้งในค่าและกิ่งทางเลือก2R0
ปลายวงด้านนอก
การเคลื่อนไหวแสดงให้เห็นว่าในตอนท้ายของระยะการปรับตัวชี้เทปจะถูกย้ายวางไว้ทางด้านซ้ายของเซลล์ที่ใช้งาน<
×HH
สำหรับเซลล์ที่ใช้งานทั้งหมดอื่น ๆกว่าเคาน์เตอร์ลังเลของเซลล์ค่านี้เป็นเซลล์ที่ไม่เกี่ยวข้องและอื่น ๆ แปลกและไม่เป็นศูนย์และนอกวงยังคงซ้ำอีกv(h)
สำหรับตัวชี้จะถูกวางไว้บนเซลล์ fallback ที่สอดคล้องกันแทนซึ่งเราได้ทำข้อยกเว้นด้านบนเพื่อให้เป็นศูนย์และโปรแกรมจะออกจากรอบสุดท้ายและหยุดพักv(h)u(h)]