Cubix, 24 19 ไบต์
)uO)ABq-!wpUp)W.@;;
บันทึก
- จริง ๆ แล้วนับว่าอักขระตัวเดียวกันมีจำนวนเท่าใดในตอนท้ายของอินพุตดังนั้นการทำงานนี้สำหรับจำนวนเต็มขนาดใหญ่และสตริงที่ยาวมากเช่นกัน (ตราบใดที่จำนวนอักขระเดียวกันที่ส่วนท้ายมีขนาดเล็กกว่าความแม่นยำสูงสุดของ JavaScript ( ประมาณ 15 หลักในฐาน -10)
- อินพุตไปในฟิลด์อินพุตเอาต์พุตถูกพิมพ์ไปยังฟิลด์เอาต์พุต
ลองที่นี่
คำอธิบาย
ก่อนอื่นมาขยายลูกบาศก์กันก่อน
) u
O )
A B q - ! w p U
p ) W . @ ; ; .
. .
. .
ขั้นตอนในการดำเนินการสามารถแบ่งออกเป็นสามขั้นตอน:
- แยกวิเคราะห์
- เปรียบเทียบตัวละคร
- ผลการพิมพ์
เฟส 1: อินพุต
ตัวละครสองตัวแรกที่จะดำเนินการอยู่และA
อ่านอินพุตทั้งหมดและส่งเป็นรหัสอักขระไปยังสแต็ก โปรดทราบว่าสิ่งนี้ทำในสิ่งที่ตรงกันข้ามอักขระตัวแรกจะจบลงที่ด้านบนสุดของสแต็กอักขระตัวสุดท้ายเกือบอยู่ที่ด้านล่าง ที่ด้านล่างสุด(B
A
-1
EOF
) จะถูกวางไว้ซึ่งจะใช้เป็นตัวนับจำนวนตัวอักษรต่อเนื่องที่ส่วนท้ายของสตริง เนื่องจากเราต้องการด้านบนของสแต็กเพื่อให้มีอักขระสองตัวสุดท้ายเราจึงย้อนกลับสแต็กก่อนเข้าสู่ลูป โปรดทราบว่าตอนนี้ส่วนบนสุดของสแต็กมีลักษณะดังนี้:..., C[n-1], C[n], -1
โปรดทราบว่าส่วนบนของสแต็คในขณะนี้ดูเหมือนว่า:
ตำแหน่งของ IP บนคิวบ์คือตำแหน่งที่E
อยู่และชี้ไปทางขวา คำแนะนำทั้งหมดที่ยังไม่ได้ดำเนินการถูกแทนที่ด้วย no-ops (หยุดเต็ม)
. .
. .
A B E . . . . .
. . . . . . . .
. .
. .
ขั้นตอนที่ 2: การเปรียบเทียบตัวละคร
สแต็คคือ..., C[a-1], C[a], counter
โดยที่counter
ตัวนับเพื่อเพิ่มเมื่อตัวละครสองตัวที่จะตรวจสอบ ( C[a]
และC[a-1]
) เท่ากัน IP เข้าสู่ลูปนี้เป็นครั้งแรกที่S
ตัวละครเลื่อนไปทางขวา E
ตัวละครที่เป็นตำแหน่งที่ IP จะสิ้นสุด (ชี้ขวา) เมื่อC[a]
และC[a-1]
ไม่ได้มีค่าเดียวกันซึ่งหมายความว่าลบC[a]
จากการC[a-1]
ไม่ได้ให้0
ในกรณีที่การเรียนการสอนต่อไปนี้!
จะถูกข้ามไป (ซึ่งเป็นw
)
. .
. .
. S q - ! w E .
p ) W . . ; ; .
. .
. .
นี่คือคำแนะนำที่จะถูกดำเนินการในระหว่างการวนเต็ม:
q-!;;p) # Explanation
q # Push counter to the bottom of the stack
# Stack (counter, ..., C[a-1], C[a])
- # Subtract C[a] from C[a-1], which is 0 if both are equal
# Stack (counter, ..., C[a-1], C[a], C[a-1]-C[a])
! # Leave the loop if C[a-1]-C[a] does not equal 0
;; # Remove result of subtraction and C[a] from stack
# Stack (counter, ..., C[a-1])
p # Move the bottom of the stack to the top
# Stack (..., C[a-1], counter)
) # Increment the counter
# Stack (..., C[a-1], counter + 1)
และจากนั้นก็วนรอบ
ขั้นตอนที่ 3: ผลการพิมพ์
counter, ..., C[a-1]-C[a]
ตั้งแต่เราออกจากวงต้นสแต็คที่มีลักษณะเช่นนี้ มันเป็นเรื่องง่ายที่จะพิมพ์เคาน์เตอร์ แต่เราจะต้องเพิ่มขึ้นนับครั้งเพราะเราไม่ได้ทำมันในประโยคสุดท้ายของวงและอีกครั้งเพราะเราเริ่มต้นนับที่แทน-1
0
เส้นทางบนคิวบ์จะเป็นแบบนี้เริ่มจากS
ชี้ไปทางขวา ไม่มีตัวเลือกสองตัวที่ดำเนินการโดย IP จะถูกแทนที่ด้วยลูกศรที่ชี้ไปในทิศทางของ IP
) u
O )
. B . . . S p U
. ) . . @ . . .
> >
. .
คำแนะนำจะดำเนินการตามลำดับต่อไปนี้ โปรดทราบว่าB)
คำแนะนำในตอนท้ายเปลี่ยนสแต็ก แต่ไม่ส่งผลกระทบต่อโปรแกรมเนื่องจากเรากำลังจะยกเลิกมันและเราจะไม่ใช้กองซ้อนอีก
p))OB)@ # Explanation
p # Pull the counter to the top
# Stack: (..., counter)
)) # Add two
# Stack: (..., counter + 2)
O # Output as number
B) # Reverse the stack and increment the top
@ # End the program
Alea iacta est