⍝ J a p a n e s e A b a c u s See →notes.soroban←
← /() ⍝ beam (upper/lower deck separator).
← .() ⍝ digit (column) separator.
← +() -() ⍝ add sub
⍺() ⍵() ⍝ soroban ←→ decimal (mnemonic: ⍺bacus ←→ ⍵estern)
h :: 0 1 ⍝ upper deck (heaven) values.
e :: 0 1 2 3 4 ⍝ lower deck (earth) values.
d :: 0 1 2 3 4 5 6 7 8 9 ⍝ decimal digit.
p q :: ⍝ match any values.
⍝ Soroban from Decimal:
⍺ e = 0/e ⍝ values 0..4
⍺ d = 1/(⌊d) ⍝ values 5..9
⍺ p.q = (⍺ p).(⍺ q) ⍝ multiple digits.
⍝ Decimal from Soroban:
⍵ 0/e = e ⍝ values 0..4
⍵ 1/e = ⌈e ⍝ values 5..9
⍵ p.q = (⍵ p).(⍵ q) ⍝ multiple digits.
⍝ Simplifications:
0/0.q = q ⍝ ignore leading 0/0 columns.
⍝ Addition:
h/e + 0 = h/e ⍝ + 0
h/0 + e = h/e
h/1 + 1 = h/2 ⍝ + 1
h/2 + 1 = h/3
h/3 + 1 = h/4
h/4 + 1 = (h+1)/0
h/1 + 2 = h/3 ⍝ + 2
h/2 + 2 = h/4
h/3 + 2 = (h+1)/0
h/4 + 2 = (h+1)/1
h/1 + 3 = h/4 ⍝ + 3
h/2 + 3 = (h+1)/0
h/3 + 3 = (h+1)/1
h/4 + 3 = (h+1)/2
h/1 + 4 = (h+1)/0 ⍝ + 4
h/2 + 4 = (h+1)/1
h/3 + 4 = (h+1)/2
h/4 + 4 = (h+1)/3
h/e + d = (h+1)/e + (⌊d) ⍝ + 5..9
p.(h/e) + d = p .(h/e + d) ⍝ multiple digits:
h/e + q.d = (0/0 + q).(h/e + d) ⍝ add columns in parallel.
p.(h/e) + q.d = (p + q).(h/e + d)
⍝ Overflow / carry:
(0+1)/e = 1/e
(1+1)/e = 0/1.0/e
p.(0/1.q) = (p+1).q
⍝ Subtraction:
h/e - 0 = h/e ⍝ - 0
h/e - e = h/0 ⍝ e-e
h/0 - 1 = (h-1)/4 ⍝ - 1
h/2 - 1 = h/1
h/3 - 1 = h/2
h/4 - 1 = h/3
h/0 - 2 = (h-1)/3 ⍝ - 2
h/1 - 2 = (h-1)/4
h/3 - 2 = h/1
h/4 - 2 = h/2
h/0 - 3 = (h-1)/2 ⍝ - 3
h/1 - 3 = (h-1)/3
h/2 - 3 = (h-1)/4
h/4 - 3 = h/1
h/0 - 4 = (h-1)/1 ⍝ - 4
h/1 - 4 = (h-1)/2
h/2 - 4 = (h-1)/3
h/3 - 4 = (h-1)/4
h/e - d = (h-1)/e - (⌊d) ⍝ - 5..9
p.(h/e) - d = p .(h/e - d) ⍝ multiple digits:
p.(h/e) - q.d = (p - q).(h/e - d) ⍝ sub columns in parallel.
⍝ Underflow / carry:
(1-1)/e = 0/e
p. (0-1)/e = (p-1).(1/e)
p.((0-1)/e-d) = (p-1).1/e - d
⍝ Residue / Over:
⌊() ⌈()
⌊5 = 0 ⋄ ⌈0 = 5
⌊6 = 1 ⋄ ⌈1 = 6
⌊7 = 2 ⋄ ⌈2 = 7
⌊8 = 3 ⋄ ⌈3 = 8
⌊9 = 4 ⋄ ⌈4 = 9
⍝ Equivalence
← =() ⍝ reduction equivalence
⍝ Test cases:
⍝
⍝ ⍵ ⍺ 1.2.3.4.5.6.7.8.9 -> 1.2.3.4.5.6.7.8.9 ⍝ abacus ←→ decimal.
⍝ ⍺ ⍵ 0/1.1/0.1/2.1/3 -> 0/1.1/0.1/2.1/3 ⍝ decimal ←→ abacus.
⍝ 0/0.0/0 -> 0/0 ⍝ trim leading 0-cols.
⍝
⍝ ⍵ 0/0+7 -> 7 ⍝ addition.
⍝ ⍵ 0/0+7+7 -> 1.4
⍝ ⍵ 0/0+7+7+7 -> 2.1
⍝ ⍵ 0/0+7+7+7+7 -> 2.8
⍝ ⍵ 0/0+7+7+7+7+7 -> 3.5
⍝ ⍵ 0/0+1+2+3+4+5+6+7+8+9 -> 4.5
⍝ ⍵ 0/0+9+8+7+6+5+4+3+2+1 -> 4.5
⍝ ⍵ 0/0 + 1.2 -> 1.2
⍝ ⍵ 0/0 + 1.2 + 3.4 + 5.6 -> 1.0.2
⍝
⍝ ⍵ 0/0 + 1.2.3.4.5.6.7.8.9 + 9.8.7.6.5.4.3.2.1 -> 1.1.1.1.1.1.1.1.1.0
⍝
⍝ ⍵ 0/3.1/0-7 -> 2.8 ⍝ subtraction
⍝ ⍵ 0/3.1/0-7-7 -> 2.1
⍝ ⍵ 0/3.1/0-7-7-7 -> 1.4
⍝ ⍵ 0/3.1/0-7-7-7-7 -> 7
⍝ ⍵ 0/3.1/0-7-7-7-7-7 -> 0
⍝ 0/1.0/0.0/2 -1.2-3.4-5.6 -> 0/0
⍝
⍝ ⍵ (⍺ 1.1.1.1.1.1.1.1.1.0) - 1.2.3.4.5.6.7.8.9 -> 9.8.7.6.5.4.3.2.1
⍝ ⍵ (⍺ 1.1.1.1.1.1.1.1.1.0) - 9.8.7.6.5.4.3.2.1 -> 1.2.3.4.5.6.7.8.9
⍝
⍝ 0/0 - 1 -> (0-1)/4 ⍝ no negative numbers.
⍝ 1/1 - 2.3 -> 1/1-2.3
⍝
⍝ Back to: Contents