Brain-Flak , 72 70 64 62 58 46 ไบต์
{({}[()]{(<()>)}{}<({}[()]<({}())>)>)}{}{{}}{}
รับเงินปันผลและตัวหาร (ตามลำดับ) เป็นอินพุตและพิมพ์ตัวหาร (ความจริง) หรืออะไรก็ได้ เนื่องจากแต่ละสแต็กมีค่าเป็นศูนย์จำนวนอนันต์เอาต์พุตว่างจึงควรพิจารณาเป็นเท็จ
ในขณะที่ไม่สะอาดสแต็คโซลูชันนี้ใช้เพียงกองเดียว
ลองออนไลน์!
ขอบคุณ @WheatWizard สำหรับการตีกอล์ฟ 2 ไบต์!
มันทำงานอย่างไร
INPUT: a (dividend), b (divisor)
INITIAL STACK: n = a, d = b, r = 0
An infinite amount of zeroes follows.
{ While n is non-zero:
(
{} Pop n from the stack.
[()] Yield -1.
{ While the top of the stack (initially, d) is non-zero:
(<()>) Push 0.
}
{} Pop 0. This will remove d from the stack if d = 0, leaving r
on top. We can think of this as performing the assignment
(d, r) = (r, d) if d = 0.
<
(
{} Pop d.
[()] Yield -1.
<
(
{} Pop r.
() Yield 1.
) Push r + 1.
> Yield 0.
) Push d + (-1) + 0 = d - 1.
> Yield 0.
) Push n + (-1) + 0 + 0 + 0 = n - 1.
} Each iteration decrements n, swaps d and r if d = 0, decrements d,
and increments r.
FINAL VALUES: n = 0
d = b - r
r = a % b if a % b > 0 else b
{} Pop n.
{ While the top of the stack is non-zero:
{} Pop it.
} This pops d and r if d > 0 (and, thus, a % b > 0) or noting at all.
{} Pop d or a 0, leaving r if r = b and, thus, a % b = 0.
การคำนวณโมดูลัส 42 ไบต์
โปรแกรมเต็มรูปแบบด้านบนสามารถปรับเปลี่ยนได้ในลักษณะที่ไม่สำคัญเพื่อคำนวณค่าโมดูลัสแทน
{({}[()]<({}[()]<({}())>)>{(<()>)}{})}{}{}
เมื่อก่อนวิธีนี้ไม่สะอาด แต่ใช้เพียงสแต็คเดียว โมดูลัสของ0จะออกจากสแต็คที่ว่างเปล่าซึ่งเป็นประมาณเทียบเท่ากับออกจาก0 ; แต่ละสแต็กมีศูนย์ไม่สิ้นสุด
ลองออนไลน์!
มันทำงานอย่างไร
เปรียบเทียบสองลูปของเครื่องทดสอบการหารและเครื่องคำนวณโมดูลัส
{({}[()]{(<()>)}{}<({}[()]<({}())>)>)}
{({}[()]<({}[()]<({}())>)>{(<()>)}{})}
แตกต่างเพียงเป็นที่ตั้งของ{(<()>)}{}
ซึ่งสัญญาวันที่และRถ้าd = 0 ในการคำนวณโมดูลัสที่เราดำเนินการแลกเปลี่ยนนี้หลังจาก decrementing dและการเพิ่มR
การเปลี่ยนแปลงนี้จะไม่ส่งผลกระทบต่อผลลัพธ์หากa% b> 0แต่ถ้าa% b = 0มันจะทิ้ง(n, d, r) = (0, b, 0) - มากกว่า(n, d, r) = (0, 0, b) - บนสแต็ก
ดังนั้นเพื่อให้ได้รับการโมดูลัสที่เราจะต้องปรากฏnและd{}{}
กับ
การคำนวณโมดูลัสสะอาด - สแต็ก 64 ไบต์
อัลกอริธึมโมดูลัสขนาด 42 ไบต์ไม่สะอาดดังนั้นจึงไม่สามารถใช้งานได้เหมือนในทุกโปรแกรม รุ่นต่อไปนี้จะจ่ายเงินปันผลและตัวหาร (ตามลำดับ) จากสแต็คที่ใช้งานอยู่และผลักโมดูลัสกลับมา ไม่มีผลข้างเคียงอื่น ๆ
({}(<()>)){({}[()]<(({}()[({})])){{}(<({}({}))>)}{}>)}({}{}<{}>)
วิธีการแก้ปัญหานี้ส่วนใหญ่อิงจากระเบียน 72-tete ก่อนหน้าของ @ WheatWizard แต่จะบันทึกได้ 6 ไบต์โดยไม่สลับกองซ้อน
ลองออนไลน์!
มันทำงานอย่างไร
INPUT: a (dividend), b (divisor)
INITIAL STACK: n = a, b
(
{} Pop and yield n = a.
(<()>) Push d = 0.
) Push n + 0 = n.
STACK: n, d = 0, b
{( While n in non-zero:
{} Pop and yield n.
[()] Yield -1.
<
((
{} Pop and yield d.
() Yield 1.
[({})] Pop b, push it back on the stack, and yield -b.
)) Push d + 1 + -b = d + 1 - b twice.
{ While/if d + 1 - b is non-zero, i.e., if d < b - 1
{} Pop d + 1 - b (second copy).
(<(
{} Pop d + 1 - b (first copy).
({}) Pop b and push it back on the stack.
)>) Push d + 1 - b + b = d + 1, then 0.
} If the loop wasn't skipped entirely, pushing 0 breaks out.
If d < b - 1, it essentially performs the assignment d = d + 1.
However, if d = b - 1, we get d = d + 1 - b = b - 1 + 1 - b = 0.
In all cases, we wind up with d = (d + 1) % b.
{} Pop 0.
> Yield 0.
)} Push n + -1 + 0 = n - 1. Break if n - 1 = 0.
STACK: n = 0, d = a % b, b
(
{} Pop and yield n = 0.
{} Pop and d = a % b.
<{}> Pop b, but yield 0.
) Push 0 + a % b + 0 = a % b.