Unicode polynomial equation: Difference between revisions

m
(Phix)
m (→‎{{header|Wren}}: Minor tidy)
 
(13 intermediate revisions by 5 users not shown)
Line 58:
[[Category:Mathematics]]
 
=={{header|PhixGo}}==
Although this program provides full support for Unicode vulgar fractions, note that there is no guarantee that they (or arithmetic on them) will successfully 'round trip' due to floating point arithmetic being used in the underlying calculations and some of them being recurring rather than exact decimals in any case.
To simplify this task I first created a test file (save as utf8, Unicode_polynomial_equation.txt):
<syntaxhighlight lang="go">package main
 
import (
"fmt"
"log"
"math"
"regexp"
"strconv"
"strings"
)
 
var powers = strings.NewReplacer(
"0", "⁰",
"1", "¹",
"2", "²",
"3", "³",
"4", "⁴",
"5", "⁵",
"6", "⁶",
"7", "⁷",
"8", "⁸",
"9", "⁹",
"-", "⁻",
)
 
var fractions = [][2]string{
{".25", "¼"},
{".5", "½"},
{".75", "¾"},
{".14285714285714285", "⅐"},
{".1111111111111111", "⅑"},
{".1", "⅒"},
{".3333333333333333", "⅓"},
{".6666666666666666", "⅔"},
{".2", "⅕"},
{".4", "⅖"},
{".6", "⅗"},
{".8", "⅘"},
{".16666666666666666", "⅙"},
{".8333333333333334", "⅚"},
{".125", "⅛"},
{".375", "⅜"},
{".625", "⅝"},
{".875", "⅞"},
}
 
func printEquation(coefs map[int]float64) {
fmt.Print("=> ")
if len(coefs) == 0 {
fmt.Println("0\n")
return
}
max, min := math.MinInt32, math.MaxInt32
for k := range coefs {
if k > max {
max = k
}
if k < min {
min = k
}
}
for p := max; p >= min; p-- {
if c := coefs[p]; c != 0 {
if p < max {
sign := "+"
if c < 0 {
sign = "-"
c = -c
}
fmt.Printf(" %s ", sign)
}
if c != 1 || (c == 1 && p == 0) {
cs := fmt.Sprintf("%v", c)
ix := strings.Index(cs, ".")
if ix >= 0 {
dec := cs[ix:]
for _, frac := range fractions {
if dec == frac[0] {
cs = strings.Replace(cs, dec, frac[1], 1)
break
}
}
}
if cs[0] == '0' && len(cs) > 1 && cs[1] != '.' {
cs = cs[1:]
}
fmt.Print(cs)
}
if p != 0 {
ps := strconv.Itoa(p)
ps = powers.Replace(ps)
if ps == "¹" {
ps = ""
}
fmt.Printf("x%s", ps)
}
}
}
fmt.Println("\n")
}
 
func check(err error) {
if err != nil {
log.Fatal(err)
}
}
 
func main() {
equs := []string{
`-0.00x⁺¹⁰ + 1.0·x ** 5 + -2e0x^4 + +0,042.00 × x ⁺³ + +.0x² + 20.000 000 000x¹ - -1x⁺⁰ + .0x⁻¹ + 20.x¹`,
`x⁵ - 2x⁴ + 42x³ + 0x² + 40x + 1`,
`0e+0x⁰⁰⁷ + 00e-00x + 0x + .0x⁰⁵ - 0.x⁴ + 0×x³ + 0x⁻⁰ + 0/x + 0/x³ + 0x⁻⁵`,
`1x⁵ - 2x⁴ + 42x³ + 40x + 1x⁰`,
`+x⁺⁵ + -2x⁻⁻⁴ + 42x⁺⁺³ + +40x - -1`,
`x^5 - 2x**4 + 42x^3 + 40x + 1`,
`x↑5 - 2.00·x⁴ + 42.00·x³ + 40.00·x + 1`,
`x⁻⁵ - 2⁄x⁴ + 42x⁻³ + 40/x + 1x⁻⁰`,
`x⁵ - 2x⁴ + 42.000 000x³ + 40x + 1`,
`x⁵ - 2x⁴ + 0,042x³ + 40.000,000x + 1`,
`0x⁷ + 10x + 10x + x⁵ - 2x⁴ + 42x³ + 20x + 1`,
`1E0x⁵ - 2,000,000.e-6x⁴ + 4.2⏨1x³ + .40e+2x + 1`,
`x⁵ - x⁴⁄2 + 405x³⁄4 + 403x⁄4 + 5⁄2`,
`x⁵ - 0.5x⁴ + 101.25x³ + 100.75x + 2.5`,
`x⁻⁵ - 2⁄x⁴ + 42x⁻³ - 40/x`,
`⅐x⁵ - ⅓x⁴ - ⅔x⁴ + 42⅕x³ + ⅑x - 40⅛ - ⅝`,
}
rgx := regexp.MustCompile(`\s+(\+|-)\s+`)
rep := strings.NewReplacer(
",", "",
" ", "",
"¼", ".25",
"½", ".5",
"¾", ".75",
"⅐", ".14285714285714285",
"⅑", ".1111111111111111",
"⅒", ".1",
"⅓", ".3333333333333333",
"⅔", ".6666666666666666",
"⅕", ".2",
"⅖", ".4",
"⅗", ".6",
"⅘", ".8",
"⅙", ".16666666666666666",
"⅚", ".8333333333333334",
"⅛", ".125",
"⅜", ".375",
"⅝", ".625",
"⅞", ".875",
"↉", ".0",
"⏨", "e",
"⁄", "/",
)
rep2 := strings.NewReplacer(
"⁰", "0",
"¹", "1",
"²", "2",
"³", "3",
"⁴", "4",
"⁵", "5",
"⁶", "6",
"⁷", "7",
"⁸", "8",
"⁹", "9",
"⁻⁻", "",
"⁻", "-",
"⁺", "",
"**", "",
"^", "",
"↑", "",
"⁄", "/",
)
var err error
for _, equ := range equs {
fmt.Println(equ)
terms := rgx.Split(equ, -1)
ops := rgx.FindAllString(equ, -1)
for i := 0; i < len(ops); i++ {
ops[i] = strings.TrimSpace(ops[i])
}
coefs := make(map[int]float64)
for i, term := range terms {
s := strings.Split(term, "x")
t := s[0]
t = strings.TrimRight(t, "·× ")
t = rep.Replace(t)
c := 1.0
inverse := false
if t == "" || t == "+" || t == "-" {
t += "1"
}
ix := strings.Index(t, "/")
if ix == len(t)-1 {
inverse = true
t = t[0 : len(t)-1]
c, err = strconv.ParseFloat(t, 64)
check(err)
} else if ix >= 0 {
u := strings.Split(t, "/")
m, err := strconv.ParseFloat(u[0], 64)
check(err)
n, err := strconv.ParseFloat(u[1], 64)
check(err)
c = m / n
} else {
c, err = strconv.ParseFloat(t, 64)
check(err)
}
if i > 0 && ops[i-1] == "-" {
c = -c
}
if c == -0.0 {
c = 0
}
if len(s) == 1 {
coefs[0] += c
continue
}
u := s[1]
u = strings.TrimSpace(u)
if u == "" {
p := 1
if inverse {
p = -1
}
if c != 0 {
coefs[p] += c
}
continue
}
u = rep2.Replace(u)
jx := strings.Index(u, "/")
p := 1
if jx >= 0 {
v := strings.Split(u, "/")
p, err = strconv.Atoi(v[0])
if (err != nil) {
p = 1
}
d, err := strconv.ParseFloat(v[1], 64)
check(err)
c /= d
} else {
p, err = strconv.Atoi(strings.TrimSpace(u))
if (err != nil) {
p = 1
}
}
if inverse {
p = -p
}
if c != 0 {
coefs[p] += c
}
}
printEquation(coefs)
}
}</syntaxhighlight>
 
{{out}}
<pre>
-0.00x⁺¹⁰ + 1.0·x ** 5 + -2e0x^4 + +0,042.00 × x ⁺³ + +.0x² + 20.000 000 000x¹ - -1x⁺⁰ + .0x⁻¹ + 20.x¹
==> x⁵ - 2x⁴ + 42x³ + 40x + 1
 
===> x^5 - 2x^4 + 42x^3 + 40x + 1
x⁵ - 2x⁴ + 42x³ + 0x² + 40x + 1
==> x⁵ - 2x⁴ + 42x³ + 40x + 1
 
0e+0x⁰⁰⁷ + 00e-00x + 0x + .0x⁰⁵ - 0.x⁴ + 0×x³ + 0x⁻⁰ + 0/x + 0/x³ + 0x⁻⁵
==> 0
 
1x⁵ - 2x⁴ + 42x³ + 40x + 1x⁰
==> x⁵ - 2x⁴ + 42x³ + 40x + 1
 
+x⁺⁵ + -2x⁻⁻⁴ + 42x⁺⁺³ + +40x - -1
==> x⁵ - 2x⁴ + 42x³ + 40x + 1
 
x^5 - 2x**4 + 42x^3 + 40x + 1
==> x⁵ - 2x⁴ + 42x³ + 40x + 1
 
x↑5 - 2.00·x⁴ + 42.00·x³ + 40.00·x + 1
==> x⁵ - 2x⁴ + 42x³ + 40x + 1
 
x⁻⁵ - 2⁄x⁴ + 42x⁻³ + 40/x + 1x⁻⁰
==> 1 + 40x⁻¹ + 42x⁻³ - 2x⁻⁴ + x⁻⁵
 
===> 1 + 40x^-1 + 42x^-3 - 2x^-4 + x^-5
x⁵ - 2x⁴ + 42.000 000x³ + 40x + 1
==> x⁵ - 2x⁴ + 42x³ + 40x + 1
 
x⁵ - 2x⁴ + 0,042x³ + 40.000,000x + 1
==> x⁵ - 2x⁴ + 42x³ + 40x + 1
 
0x⁷ + 10x + 10x + x⁵ - 2x⁴ + 42x³ + 20x + 1
==> x⁵ - 2x⁴ + 42x³ + 40x + 1
 
1E0x⁵ - 2,000,000.e-6x⁴ + 4.2⏨1x³ + .40e+2x + 1
==> x⁵ - 2x⁴ + 42x³ + 40x + 1
 
x⁵ - x⁴⁄2 + 405x³⁄4 + 403x⁄4 + 5⁄2
==> x⁵ - ½x⁴ + 101¼x³ + 100¾x + 2½
 
===> x^5 - 0.5x^4 + 101.25x^3 + 100.75x + 2.5
x⁵ - ½x⁴0.5x⁴ + 101¼x.25x³ + 100¾x.75x + 2½.5
==> x⁵ - ½x⁴ + 101¼x³ + 100¾x + 2½
 
x<sup>5</sup> - 2x<sup>4</sup> + 42x<sup>3</sup> + 40x + 1
==> x⁵x⁻⁵ - 2x⁴2⁄x⁴ + 42x42x⁻³ + 40x +- 140/x
x^5=> - 2x^440x⁻¹ + 42x^342x⁻³ +- 40x2x⁻⁴ + 1x⁻⁵
 
==> x⁵ - 2x⁴ + 42x³ + 40x + 1
x⁵⅐x⁵ - 2x⁴⅓x⁴ - ⅔x⁴ + 42x42⅕x³ + 40x⅑x +- 40⅛ - 1
==> x⁵⅐x⁵ - 2x⁴x⁴ + 42x42⅕x³ + 40x⅑x +- 140¾
x5 - 2x4 + 42x3 + 40x + 1
==> x⁵ - 2x⁴ + 42x³ + 40x + 1
</pre>
Explanation: <br>
On finding a line beginning with "==> ", parse the previous line and check that the output matches the rest of the line.<br>
Lines beginning "===> " contain alternative (valid) representations of the previous line, for use when uni_frac is false. Note these equivalences can then be used further on, eg the result on line 5 maps to line 3 via 2, not that it matters should the same equivalent be defined twice, and also note that "==> " should always be the unicode version and "===> " the ascii one.
 
=={{header|Julia}}==
Obviously this is not well tested and //will// fail on the next thing thrown at it, but
The task allows the "polynomials" to be parsed to have negative exponents. This makes them <em>Laurent</em> polynomials, not ordinary polynomials.
it shows the basic approach. Error handling omitted using that good ol' standby excuse
<syntaxhighlight lang="julia">import Base.print
"for clarity".
 
struct LaurentPolynomial{T}
Note that space is not skipped when getting exponents, otherwise it might wrongly treat
powtocoef::Dict{Int,T}
say "x + 2" as "x^2", since we /are/ allowing exponentiation symbols to be omitted. At
varname::Char
the start of parse() we strip spaces around '^' (etc) to help with that.
end
 
function tosuper(i)
Processing the input in utf32 form is a complete no-brainer; whereas constructing utf8
s = ""
output is a little more subtle, but avoids creating a utf32 "string" just because all
if i != 1
bytes happen to be less than 255, which would not necessarily be valid utf8/32.
if i < 0
s = "\u207b"
i = -i
end
s *= prod([reverseudi[x] for x in reverse(digits(i))])
end
return s
end
 
function print(io::IO, lp::LaurentPolynomial)
<lang Phix>-- demo\rosetta\Unicode_polynomial_equation.exw
if isempty(lp.powtocoef) || all(iszero, values(lp.powtocoef))
constant uni_frac = false -- if true output unicode superscripts and vulgar fractions
print("0")
return
end
firstterm = true
dorev = minimum(keys(lp.powtocoef)) >= 0
for p in sort!(collect(lp.powtocoef), lt =(a,b)->a[1]<b[1], rev=dorev)
e, c = p[1], p[2]
if c != 0
if !firstterm
print(c < 0 ? " - " : " + ")
c = abs(c)
end
sfrac = get(tofracs, c - trunc(c), "")
sint = string(Int(trunc(c)))
s = round(c) == c ? sint : sfrac == "" ? string(c) :
sint == "0" ? sfrac : sint * sfrac
print(c == 1 && e != 0 ? "" : s)
e != 0 && print(lp.varname, tosuper(e))
firstterm = false
end
end
end
 
const uniexp = [['\u2070', '\u00b9', '\u00b2', '\u00b3']; collect('\u2074':'\u2079')]
constant UTF8BOM = {#EF,#BB,#BF},
const allsuper = String(vcat(uniexp, ['\u207a', '\u207b']))
SPTWO = #00B2, -- superscript two
const udi = Dict([u => i-1 for (i, u) in enumerate(uniexp)])
STHRE = #00B3, -- superscript three
const reverseudi = Dict([v => k for (k, v) in udi])
MIDOT = #00B7, -- middle dot
const uch = Dict(['\u207a' => '+', '\u207b' => '-', '\u00b7' => ' ',
SPONE = #00B9, -- superscript one
'\u00d7' => ' ', QUART'\u2091' => #00BC'^', '\u23e8' => -- one quarter'E'])
const fracs = Dict(['¼' => "$(1/4)", '½' => "$(1/2)", '¾' => "$(3/4)", '⅐' => "$(1/7)",
AHALF = #00BD, -- one half
'⅑' => "$(1/9)", '⅒' => "$(1/10)", '⅓' => "$(1/3)", '⅔' => "$(2/3)", '⅕' => "$(1/5)",
THQTR = #00BE, -- three quarters
'⅖' => "$(2/5)", '⅗' => "$(3/5)", '⅘' => "$(4/5)", '⅙' => "(1/6)", '⅚' => "$(5/6)",
MULTY = #00D7, -- multiplication sign
'⅛' => "$(1/8)", '⅜' => "$(3/8)", '⅝' => "$(5/8)", '⅞' => "$(7/8)", '↉' => "$(0/3)"])
DIVDE = #2044, -- division sign
const tofracs = Dict(0.25 => '¼', 0.5 => '½', 0.75 => '¾', 0.2 => '⅕')
SZERO = #2070, -- superscript zero
allfrac = join(vcat(collect(keys(fracs))), "|")
SFOUR = #2074, -- superscript four
SFIVE = #2075, -- superscript five
SPSIX = #2076, -- superscript six
SSEVN = #2077, -- superscript seven
SEGHT = #2078, -- superscript eight
SNINE = #2079, -- superscript nine
SPLUS = #207A, -- superscript plus
SMNUS = #207B, -- superscript minus
SVNTH = #2150, -- one seventh
NINTH = #2151, -- one ninth
TENTH = #2152, -- one tenth
THIRD = #2153, -- one third
TWTHD = #2154, -- two thirds
FIFTH = #2155, -- one fifth
TWFTH = #2156, -- two fifths
THFTH = #2157, -- three fifths
FRFTH = #2158, -- four fifths
SIXTH = #2159, -- one sixth
FVSIX = #215A, -- five sixths
EIGTH = #215B, -- one eigth
THEGH = #215C, -- three eigths
FVEGH = #215D, -- five eigths
-- ZTHRD = #2189, -- zero thirds[??]
UPARW = #2191, -- uparrow
BASET = #23E8, -- base 10
SPACE = ' ', -- space
T = 10, -- align nxt tbl
$
 
utoascii(c) = (x = haskey(udi, c) ? Char('0' + udi[c]) : haskey(uch, c) ? uch[c] : c)
constant {vulgar_fractions,unicode_vulgar_fractions} = columnize({{{1,4},QUART},
{{1,2},AHALF},
{{3,4},THQTR},
{{1,7},SVNTH},
{{1,9},NINTH},
{{1,T},TENTH},
{{1,3},THIRD},
{{2,3},TWTHD},
{{1,5},FIFTH},
{{2,5},TWFTH},
{{3,5},THFTH},
{{4,5},FRFTH},
{{1,6},SIXTH},
{{5,6},FVSIX},
{{1,8},EIGTH},
{{3,8},THEGH},
{{5,8},FVEGH}})
 
function fcoef(termstring, varname)
constant EXPONENTS = {SZERO,SPONE,SPTWO,STHRE,SFOUR,SFIVE,SPSIX,SSEVN,SEGHT,SNINE}
m = match(r"(\d+)⁄(\d+)", termstring).captures
return "$(parse(Float64, m[1])/parse(Float64, m[2]))$varname^0"
end
 
function skipxcoef(sequence stermstring, integer sdx, sequence setvarname)
m = match(Regex("(\\d+)$varname([^⁄\\+]*)⁄(\\d+)"), termstring).captures
while sdx<=length(s)
coe = parse(Float64, m[1])/parse(Float64, m[3])
and find(s[sdx],set) do
return "$(coe)$varname$(m[2])"
sdx += 1
end while
return sdx
end function
 
function fromvfrac(termstring)
function get_sign(sequence s, integer sdx, bool allow_superscripts)
m = match(r"(\d*)(\D+)", termstring).captures
integer sgn = +1, ch
s = string((m[1] == "" ? 0 : parse(Float64, m[1])) + parse(Float64, fracs[m[2][1]]))
for sdx=sdx to length(s) do
end
ch = s[sdx]
if allow_superscripts then
ch = iff(ch=SPLUS?'+':
iff(ch=SMNUS?'-':
iff(ch=SPACE?'?':ch))) -- (do not skip spaces, see note)
end if
if ch!='+'
and ch!=' ' then
if ch!='-' then exit end if
sgn *= -1
end if
end for
return {sgn,sdx}
end function
 
function normalizeexpression(s, varname='x')
function get_num(sequence s, integer sdx, atom n=0, bool allow_superscripts=false, as_fraction=false)
s = replace(s, Regex("\\d*(" * allfrac * ")") => (x) -> fromvfrac(x))
integer sgn = +1, ch, f, e10, d = 1
s = replace(replace(s, r"[^\+].+" => (x) -> "+$x"), r".+[^\+]$" => (x) -> "$x+")
atom p10 = 10
bool none = not as_fractions --= replace(copereplace(replace(s, withr"\s+" => "x"), r"\*\*|↑" ==> "1x^1"), and"\u23e8" !=> "0x^0e")
s = replace(s, Regex(varname * "(?=[$allsuper]+)") => "$varname^")
-- (but not when processing the "34" of "12.34", obvs)
s = replace(prod([utoascii(c) for c in s]), r"\s+" => "")
if not as_fraction then
s = replace(s, r"[\-\+]+" => (x) -> isodd(count(y -> y == '-', x)) ? "+-" : "+")
{sgn,sdx} = get_sign(s,sdx,allow_superscripts)
s = replace(replace(s, r"\^\+\-" => "^-"), r"\^\+" => "^")
end if
s = replace(s, Regex("(?<=[\\-\\+])$varname") => "1$varname")
if not allow_superscripts then
s = replace(s, r"(\d+)x([^⁄\+]*)⁄(\d+)" => (x) -> xcoef(x, varname))
sdx = skip(s,sdx,{' '})
s = replace(s, r"(?<=[0-9])(,)(?=[0-9])" => "")
end if
s = replace(s, r"\d+⁄\d+" => (x) -> fcoef(x, varname))
for sdx=sdx to length(s) do
s = replace(s, r"\+([\d\.]+)\+" => SubstitutionString("+\\1$varname^0+"))
ch = s[sdx]
return replace(s, Regex("(⁄|/)(" * varname * ")\\^?") =>
if ch>='0' and ch<='9' then
(x) -> varname * if(x[end] as_fraction== then'^' ? "^-" : "^-1"))
end
n += (ch-'0')/p10
p10 *= 10
else
n = n*10+ch-'0'
end if
none = false
elsif allow_superscripts then
f = find(ch,EXPONENTS)
if f=0 then exit end if
n = n*10+f-1
none = false
elsif not find(ch," ,") then
exit
end if
end for
if not allow_superscripts then
if find(ch,{'e','E',BASET}) then
{e10,f,sdx} = get_num(s,sdx+1)
if f!=1 then ?9/0 end if
n *= power(10,e10)
elsif ch='.' then
if as_fraction then ?9/0 end if
{n,f,sdx} = get_num(s,sdx+1,n,as_fraction:=true)
if f!=1 then ?9/0 end if
none = false
else
f = find(ch,unicode_vulgar_fractions)
if f!=0 then
if as_fraction then ?9/0 end if
integer {vfn,vfd} = vulgar_fractions[f]
if uni_frac then
n = n*vfd + vfn
if d!=1 then ?9/0 end if
d = vfd
else
n += vfn/vfd
end if
sdx += 1
none = false
end if
end if
end if
if none then n = 1 end if
n *= sgn
return {n,d,sdx}
end function
 
function get_termtopoly(sequence s::String, integer sdxvarname='x')
allcoef = Dict{Int,Float64}(0 => 0.0)
integer last_sdx = sdx, -- (infinite loop check/prevent)
s = normalizeexpression(s, varname)
e = 0
reg = Regex("[\\.\\-\\+\\deE\\/]*" * varname * "(?:\\^[\\d\\-]+)?(?=(?:[^\\+\\-]?(?:\\+|\\-)))")
atom c, d = 1, f
matched = collect(eachmatch(reg, s))
bool sdiv = false
pairs = [split(x.match, varname * "^") for x in matched]
{c,d,sdx} = get_num(s,sdx)
for p in pairs
sdx = skip(s,sdx,{' ',MIDOT,MULTY})
p[1] = replace(p[1], "+-" => "-")
if sdx<=length(s)
and if length(s[sdx]p) =='/' or1
s[sdx]=DIVDE) then push!(p, "1")
p[1] = replace(p[1], Regex(varname * "\$") => "")
sdx += 1
end
if sdx<=length(s) and s[sdx]!='x' then
coef, expo = tryparse(Float64, {dp[1]),f,sdx} = get_numtryparse(sInt,sdx p[2])
coef = coef if f!=1= thennothing ?9/ 1.0 end: ifcoef
expo = expo == ifnothing not? uni_frac1 then: expo
if haskey(allcoef, c /= dexpo)
coef d += 1allcoef[expo]
end if
elseallcoef[expo] = coef
end
sdiv = true
return LaurentPolynomial(allcoef, varname)
end if
end if
if sdx<=length(s) and s[sdx]='x' then
sdx = skip(s,sdx+1,{'^','*',SPLUS,UPARW})
{e,f,sdx} = get_num(s,sdx,allow_superscripts:=true)
if f!=1 then ?9/0 end if
if sdiv then e = -e end if
else
if sdiv then ?9/0 end if
end if
if sdx<=length(s)
and (s[sdx]='/' or
s[sdx]=DIVDE) then
if d!=1 then ?9/0 end if
{d,f,sdx} = get_num(s,sdx+1)
if f!=1 then ?9/0 end if
if not uni_frac then
c /= d
d = 1
end if
end if
if sdx=last_sdx then ?9/0 end if
return {e,c,d,sdx}
end function
 
testcases = [
function unicode_superscripts(integer e)
"1x⁵ - 2x⁴ + 42x³ + 0x² + 40x + 1",
-- display helper
"0e+0x⁰⁰⁷ + 00e-00x + 0x + .0x⁰⁵ - 0.x⁴ + 0×x³ + 0x⁻⁰ + 0/x + 0/x³ + 0x⁻⁵",
string res = ""
"1x⁵ - 2x⁴ + 42x³ + 40x + 1x⁰",
if e>9 then
"+x⁺⁵ + -2x⁻⁻⁴ + 42x⁺⁺³ + +40x - -1",
res = unicode_superscripts(floor(e/10))
"x^5 - 2x**4 + 42x^3 + 40x + 1",
e = remainder(e,10)
"x↑5 - 2.00·x⁴ + 42.00·x³ + 40.00·x + 1",
end if
"x⁻⁵ - 2⁄x⁴ + 42x⁻³ + 40/x + 1x⁻⁰",
res &= utf32_to_utf8({EXPONENTS[e+1]})
"x⁵ - 2x⁴ + 42.000 000x³ + 40x + 1",
return res
"x⁵ - 2x⁴ + 0,042x³ + 40.000,000x + 1",
end function
"0x⁷ + 10x + 10x + x⁵ - 2x⁴ + 42x³ + 20x + 1",
"1E0x⁵ - 2,000,000.e-6x⁴ + 4.2⏨1x³ + .40e+2x + 1",
"x⁵ - x⁴⁄2 + 405x³⁄4 + 403x⁄4 + 5⁄2",
"x⁵ - ½x⁴ + 101¼x³ + 100¾x + 2½",
]
 
for s in testcases
enum EXP, COEF, FRAC -- contents of terms[i]
println(lpad(s, 48), " => ", topoly(s, 'x'))
end
</syntaxhighlight>{{out}}
<pre>
1x⁵ - 2x⁴ + 42x³ + 0x² + 40x + 1 => x⁵ - 2x⁴ + 42x³ + 40x + 1
0e+0x⁰⁰⁷ + 00e-00x + 0x + .0x⁰⁵ - 0.x⁴ + 0×x³ + 0x⁻⁰ + 0/x + 0/x³ + 0x⁻⁵ => 0
1x⁵ - 2x⁴ + 42x³ + 40x + 1x⁰ => x⁵ - 2x⁴ + 42x³ + 40x + 1
+x⁺⁵ + -2x⁻⁻⁴ + 42x⁺⁺³ + +40x - -1 => x⁵ - 2x⁴ + 42x³ + 40x + 1
x^5 - 2x**4 + 42x^3 + 40x + 1 => x⁵ - 2x⁴ + 42x³ + 40x + 1
x↑5 - 2.00·x⁴ + 42.00·x³ + 40.00·x + 1 => x⁵ - 2x⁴ + 42x³ + 40x + 1
x⁻⁵ - 2⁄x⁴ + 42x⁻³ + 40/x + 1x⁻⁰ => x⁻⁵ - 2x⁻⁴ + 42x⁻³ + 40x⁻¹ + 1
x⁵ - 2x⁴ + 42.000 000x³ + 40x + 1 => x⁵ - 2x⁴ + 42x³ + 40x + 1
x⁵ - 2x⁴ + 0,042x³ + 40.000,000x + 1 => x⁵ - 2x⁴ + 42x³ + 40x + 1
0x⁷ + 10x + 10x + x⁵ - 2x⁴ + 42x³ + 20x + 1 => x⁵ - 2x⁴ + 42x³ + 40x + 1
1E0x⁵ - 2,000,000.e-6x⁴ + 4.2⏨1x³ + .40e+2x + 1 => x⁵ - 2x⁴ + 42x³ + 40x + 1
x⁵ - x⁴⁄2 + 405x³⁄4 + 403x⁄4 + 5⁄2 => x⁵ - ½x⁴ + 101¼x³ + 100¾x + 2½
x⁵ - ½x⁴ + 101¼x³ + 100¾x + 2½ => x⁵ - ½x⁴ + 101¼x³ + 100¾x + 2½
</pre>
 
=={{header|Nim}}==
function poly(sequence terms)
{{trans|Go}}
-- display helper
<syntaxhighlight lang="nim">import re, sequtils, strutils, tables
string r = ""
from unicode import toRunes
for t=length(terms) to 1 by -1 do
{integer e, atom c, integer f} = terms[t]
if c!=0 then
if c=1 and f=1 and e!=0 then
r &= iff(r=""? "":" + ")
elsif c=-1 and f=1 and e!=0 then
r &= iff(r=""?"-":" - ")
else
if r!="" then
r &= iff(c<0?" - ":" + ")
c = abs(c)
end if
if f!=1 then -- (hence/only when uni_frac==true)
integer k = find({remainder(c,f),f},vulgar_fractions)
if k then
c = floor(c/f)
if c!=0 then r &= sprintf("%d",c) end if
r &= utf32_to_utf8({unicode_vulgar_fractions[k]})
else
r &= sprintf("%g",c/f)
end if
else
r &= sprintf("%g",c)
end if
end if
if e!=0 then
r &= 'x'
if e!=1 then
if uni_frac then
if e<0 then
r &= utf32_to_utf8({SMNUS})
e = -e
end if
r &= unicode_superscripts(e)
else
r &= sprintf("^%d",e)
end if
end if
end if
end if
end for
if r="" then r="0" end if
return r
end function
 
const
function parse(sequence s)
sequence terms = {}
integer sdx = 1, e, f
atom c
s = match_replace("<sup>",s,"^")
s = match_replace("</sup>",s,"")
s = match_replace("**",s,"^")
s = match_replace(" ^",s,"^")
s = match_replace("^ ",s,"^")
s = match_replace({' ',SPLUS},s,{SPLUS})
s = match_replace({' ',SMNUS},s,{SMNUS})
for i=1 to length(EXPONENTS) do
e = EXPONENTS[i]
s = match_replace({' ',e},s,{e})
end for
while sdx<=length(s) do
{e,c,f,sdx} = get_term(s,sdx)
if c!=0 then -- (aside: +5 -5 may yet leave c==0)
terms = append(terms,{e,c,f})
end if
end while
terms = sort(terms)
-- merge, eg "10x^2 + 10x^2" -> 20x^2
for i=length(terms) to 2 by -1 do
if terms[i][EXP] = terms[i-1][EXP] then
if terms[i-1][FRAC]!=terms[i][FRAC] then
?9/0 -- placeholder for more code
else
terms[i-1][COEF] += terms[i][COEF]
end if
terms[i..i] = {} -- (delete 2nd)
end if
end for
return poly(terms)
end function
 
Powers = [("0", "⁰"), ("1", "¹"), ("2", "²"), ("3", "³"), ("4", "⁴"),
sequence alts = {}, -- (unicode versions)
altn = {} ("5", "⁵"), ("6", "⁶"), ("7", --"⁷"), (idx"8", of"⁸"), ascii("9", equivalents"⁹")]
lines = read_lines("Unicode_polynomial_equation.txt")
 
Fractions = [(".25", "¼"), (".5", "½"), (".75", "¾"), (".14285714285714", "⅐"),
if lines[1][1..3] = UTF8BOM then
(".11111111111111", "⅑"), (".1", "⅒"), (".33333333333333", "⅓"),
-- remove/ignore any utf8 byte order mark
(".66666666666667", "⅔"), (".2", "⅕"), (".4", "⅖"), (".6", "⅗"),
lines[1] = lines[1][4..$]
(".8", "⅘"), (".16666666666667", "⅙"), (".83333333333333", "⅚"),
end if
(".125", "⅛"), (".375", "⅜"), (".625", "⅝"), (".875", "⅞")]
 
Reps1 = [(",", ""), (" ", ""), ("¼", ".25"), ("½", ".5"), ("¾", ".75"),
for i=2 to length(lines) do
("⅐", ".14285714285714"), ("⅑", ".11111111111111"), ("⅒", ".1"),
if length(lines[i])>5
("⅓", ".33333333333333"), ("⅔", ".66666666666667"), ("⅕", ".2"),
and lines[i][1..5] = "===> " then
("⅖", ".4"), ("⅗", ".6"), ("⅘", ".8"), ("⅙", ".16666666666667"),
alts = append(alts,lines[i-1][5..$])
("⅚", ".83333333333333"), ("⅛", ".125"), ("⅜", ".375"), ("⅝", ".625"),
altn = append(altn,i)
("⅞", ".875"), ("↉", ".0"), ("⏨", "e"), ("⁄", "/")]
end if
end for
 
Reps2 = [("⁰", "0"), ("¹", "1"), ("²", "2"), ("³", "3"), ("⁴", "4"), ("⁵", "5"),
for i=2 to length(lines) do
("⁶", "6"), ("⁷", "7"), ("⁸", "8"), ("⁹", "9"), ("⁻⁻", ""), ("⁻", "-"),
if length(lines[i])>4
("⁺", ""), ("**", ""), ("^", ""), ("↑", ""), ("⁄", "/")]
and lines[i][1..4] = "==> " then
 
sequence line = utf8_to_utf32(lines[i-1])
Eqs = [
sequence res = parse(line)
"-0.00x⁺¹⁰ + 1.0·x ** 5 + -2e0x^4 + +0,042.00 × x ⁺³ + +.0x² + 20.000 000 000x¹ - -1x⁺⁰ + .0x⁻¹ + 20.x¹",
sequence expected = lines[i][5..$]
"x⁵ - 2x⁴ + 42x³ + 0x² + 40x + 1",
if res=expected then
"0e+0x⁰⁰⁷ + 00e-00x + 0x + .0x⁰⁵ - 0.x⁴ + 0×x³ + 0x⁻⁰ + 0/x + 0/x³ + 0x⁻⁵",
-- (res is the unicode version)
"1x⁵ - 2x⁴ + 42x³ + 40x + 1x⁰",
if platform()!=WINDOWS or res="0" then
"+x⁺⁵ + -2x⁻⁻⁴ + 42x⁺⁺³ + +40x - -1",
printf(1,"%2d: %40s ok\n",{i-1,res})
"x^5 - 2x**4 + 42x^3 + 40x + else1",
"x↑5 - 2.00·x⁴ + 42.00·x³ + 40.00·x + 1",
-- (unicode output on windows consoles is fiddly...)
"x⁻⁵ - 2⁄x⁴ + 42x⁻³ + 40/x + 1x⁻⁰",
printf(1,"%2d: ok\n",i-1)
"x⁵ - 2x⁴ + 42.000 000x³ + 40x end+ if1",
"x⁵ - 2x⁴ + 0,042x³ + 40.000,000x + 1",
else
"0x⁷ + 10x + 10x + x⁵ - integer2x⁴ k+ =42x³ find(expected+ 20x + 1",alts)
"1E0x⁵ - 2,000,000.e-6x⁴ + 4.2⏨1x³ + .40e+2x + 1",
if k and res=lines[altn[k]][6..$] then
"x⁵ - x⁴⁄2 + 405x³⁄4 + 403x⁄4 + 5⁄2",
-- (res is the ascii equivalent)
"x⁵ - 0.5x⁴ + 101.25x³ + 100.75x + 2.5",
printf(1,"%2d: %40s ok\n",{i-1,res})
"x⁻⁵ - 2⁄x⁴ + 42x⁻³ - else40/x",
"⅐x⁵ - ⅓x⁴ - ⅔x⁴ + 42⅕x³ + ⅑x - 40⅛ - ⅝"]
printf(1,"%d: error - %s\n",{i-1,res})
 
end if
type Coefs = Table[int, float]
end if
 
end if
proc printEquation(coefs: Coefs) =
end for</lang>
stdout.write "=> "
if coefs.len == 0:
echo "0\n"
return
 
var max = int.low
var min = int.high
for k in coefs.keys:
if k > max: max = k
if k < min: min = k
 
for p in countdown(max, min):
var c = coefs.getOrDefault(p)
if c != 0:
if p < max:
var sign = '+'
if c < 0:
sign = '-'
c = -c
stdout.write ' ', sign, ' '
 
if c != 1 or (c == 1 and p == 0):
var cs = $c
cs.trimZeros()
let ix = cs.find('.')
if ix >= 0:
let d = cs[ix..^1]
for frac in Fractions:
if d == frac[0]:
cs = cs.replace(d, frac[1])
break
if cs[0] == '0' and cs.len > 1 and cs[1] != '.':
cs = cs[1..^1]
stdout.write cs
 
if p != 0:
var ps = ($p).multiReplace(Powers)
if ps == "¹": ps = ""
stdout.write 'x', ps
 
echo '\n'
 
 
template getFloat(s: string): float =
try:
s.parseFloat()
except ValueError:
quit "Expected float, got: " & s, QuitFailure
 
let rgx = re"\s+(\+|-)\s+"
 
for eq in Eqs:
echo eq
let terms = eq.split(rgx)
let ops = toSeq(eq.findAll(rgx)).mapIt(it.strip())
var coefs: Coefs
for i, term in terms:
 
let s = term.split("x")
var t = s[0]
t = unicode.strip(t, runes = "·× ".toRunes)
t = t.multiReplace(Reps1)
var c = 1.0
var inverse = false
if t == "" or t == "+" or t == "-": t &= '1'
 
let ix = t.find('/')
if ix == t.high:
inverse = true
t.setLen(t.high)
c = t.getFloat()
elif ix >= 0:
let u = t.split('/')
let m = u[0].getFloat()
let n = u[1].getFloat()
c = m / n
else:
c = t.getFloat()
if i > 0 and ops[i - 1] == "-": c = -c
if c == -0.0: c = 0.0
 
if s.len == 1:
coefs[0] = coefs.getOrDefault(0) + c
continue
 
var u = s[1].strip()
if u.len == 0:
let p = if inverse: -1 else: 1
if c != 0:
coefs[p] = coefs.getOrDefault(p) + c
continue
 
u = u.multiReplace(Reps2)
let jx = u.find('/')
var p: int
if jx >= 0:
let v = u.split('/')
p = try: v[0].parseInt() except ValueError: 1
let d = v[1].getFloat()
c /= d
else:
p = try: u.strip().parseInt() except ValueError: 1
if inverse: p = -p
if c != 0: coefs[p] = coefs.getOrDefault(p) + c
 
printEquation(coefs)</syntaxhighlight>
 
{{out}}
<pre>-0.00x⁺¹⁰ + 1.0·x ** 5 + -2e0x^4 + +0,042.00 × x ⁺³ + +.0x² + 20.000 000 000x¹ - -1x⁺⁰ + .0x⁻¹ + 20.x¹
=> x⁵ - 2x⁴ + 42x³ + 40x + 1
 
x⁵ - 2x⁴ + 42x³ + 0x² + 40x + 1
=> x⁵ - 2x⁴ + 42x³ + 40x + 1
 
0e+0x⁰⁰⁷ + 00e-00x + 0x + .0x⁰⁵ - 0.x⁴ + 0×x³ + 0x⁻⁰ + 0/x + 0/x³ + 0x⁻⁵
=> 0
 
1x⁵ - 2x⁴ + 42x³ + 40x + 1x⁰
=> x⁵ - 2x⁴ + 42x³ + 40x + 1
 
+x⁺⁵ + -2x⁻⁻⁴ + 42x⁺⁺³ + +40x - -1
=> x⁵ - 2x⁴ + 42x³ + 40x + 1
 
x^5 - 2x**4 + 42x^3 + 40x + 1
=> x⁵ - 2x⁴ + 42x³ + 40x + 1
 
x↑5 - 2.00·x⁴ + 42.00·x³ + 40.00·x + 1
=> x⁵ - 2x⁴ + 42x³ + 40x + 1
 
x⁻⁵ - 2⁄x⁴ + 42x⁻³ + 40/x + 1x⁻⁰
=> 1 + 40x-¹ + 42x-³ - 2x-⁴ + x-⁵
 
x⁵ - 2x⁴ + 42.000 000x³ + 40x + 1
=> x⁵ - 2x⁴ + 42x³ + 40x + 1
 
x⁵ - 2x⁴ + 0,042x³ + 40.000,000x + 1
=> x⁵ - 2x⁴ + 42x³ + 40x + 1
 
0x⁷ + 10x + 10x + x⁵ - 2x⁴ + 42x³ + 20x + 1
=> x⁵ - 2x⁴ + 42x³ + 40x + 1
 
1E0x⁵ - 2,000,000.e-6x⁴ + 4.2⏨1x³ + .40e+2x + 1
=> x⁵ - 2x⁴ + 42x³ + 40x + 1
 
x⁵ - x⁴⁄2 + 405x³⁄4 + 403x⁄4 + 5⁄2
=> x⁵ - ½x⁴ + 101¼x³ + 100¾x + 2½
 
x⁵ - 0.5x⁴ + 101.25x³ + 100.75x + 2.5
=> x⁵ - ½x⁴ + 101¼x³ + 100¾x + 2½
 
x⁻⁵ - 2⁄x⁴ + 42x⁻³ - 40/x
=> -40x-¹ + 42x-³ - 2x-⁴ + x-⁵
 
⅐x⁵ - ⅓x⁴ - ⅔x⁴ + 42⅕x³ + ⅑x - 40⅛ - ⅝
=> ⅐x⁵ - x⁴ + 42⅕x³ + ⅑x - 40¾</pre>
 
=={{header|Phix}}==
To simplify this task I first created a test file (save as utf8, Unicode_polynomial_equation.e):
<!--<syntaxhighlight lang="phix">(phixonline)-->
<span style="color: #008080;">constant</span> <span style="color: #000000;">raw_text</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"""
-0.00x⁺¹⁰ + 1.0·x ** 5 + -2e0x^4 + +0,042.00 × x ⁺³ + +.0x² + 20.000 000 000x¹ - -1x⁺⁰ + .0x⁻¹ + 20.x¹
==&gt; x⁵ - 2x⁴ + 42x³ + 40x + 1
===&gt; x^5 - 2x^4 + 42x^3 + 40x + 1
x⁵ - 2x⁴ + 42x³ + 0x² + 40x + 1
==&gt; x⁵ - 2x⁴ + 42x³ + 40x + 1
0e+0x⁰⁰⁷ + 00e-00x + 0x + .0x⁰⁵ - 0.x⁴ + 0×x³ + 0x⁻⁰ + 0/x + 0/x³ + 0x⁻⁵
==&gt; 0
1x⁵ - 2x⁴ + 42x³ + 40x + 1x⁰
==&gt; x⁵ - 2x⁴ + 42x³ + 40x + 1
+x⁺⁵ + -2x⁻⁻⁴ + 42x⁺⁺³ + +40x - -1
==&gt; x⁵ - 2x⁴ + 42x³ + 40x + 1
x^5 - 2x**4 + 42x^3 + 40x + 1
==&gt; x⁵ - 2x⁴ + 42x³ + 40x + 1
x↑5 - 2.00·x⁴ + 42.00·x³ + 40.00·x + 1
==&gt; x⁵ - 2x⁴ + 42x³ + 40x + 1
x⁻⁵ - 2⁄x⁴ + 42x⁻³ + 40/x + 1x⁻⁰
==&gt; 1 + 40x⁻¹ + 42x⁻³ - 2x⁻⁴ + x⁻⁵
===&gt; 1 + 40x^-1 + 42x^-3 - 2x^-4 + x^-5
x⁵ - 2x⁴ + 42.000 000x³ + 40x + 1
==&gt; x⁵ - 2x⁴ + 42x³ + 40x + 1
x⁵ - 2x⁴ + 0,042x³ + 40.000,000x + 1
==&gt; x⁵ - 2x⁴ + 42x³ + 40x + 1
0x⁷ + 10x + 10x + x⁵ - 2x⁴ + 42x³ + 20x + 1
==&gt; x⁵ - 2x⁴ + 42x³ + 40x + 1
1E0x⁵ - 2,000,000.e-6x⁴ + 4.2⏨1x³ + .40e+2x + 1
==&gt; x⁵ - 2x⁴ + 42x³ + 40x + 1
x⁵ - x⁴⁄2 + 405x³⁄4 + 403x⁄4 + 5⁄2
==&gt; x⁵ - ½x⁴ + 101¼x³ + 100¾x + 2½
===&gt; x^5 - 0.5x^4 + 101.25x^3 + 100.75x + 2.5
x⁵ - ½x⁴ + 101¼x³ + 100¾x + 2½
==&gt; x⁵ - ½x⁴ + 101¼x³ + 100¾x + 2½
x&lt;sup&gt;5&lt;/sup&gt; - 2x&lt;sup&gt;4&lt;/sup&gt; + 42x&lt;sup&gt;3&lt;/sup&gt; + 40x + 1
==&gt; x⁵ - 2x⁴ + 42x³ + 40x + 1
x^5 - 2x^4 + 42x^3 + 40x + 1
==&gt; x⁵ - 2x⁴ + 42x³ + 40x + 1
x⁵ - 2x⁴ + 42x³ + 40x + 1
==&gt; x⁵ - 2x⁴ + 42x³ + 40x + 1
x5 - 2x4 + 42x3 + 40x + 1
==&gt; x⁵ - 2x⁴ + 42x³ + 40x + 1
"""</span>
<span style="color: #008080;">global</span> <span style="color: #008080;">function</span> <span style="color: #000000;">get_lines</span><span style="color: #0000FF;">()</span>
<span style="color: #008080;">return</span> <span style="color: #7060A8;">split</span><span style="color: #0000FF;">(</span><span style="color: #000000;">raw_text</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"\n"</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<!--</syntaxhighlight>-->
Explanation: <br>
On finding a line beginning with "==> ", parse the previous line and check that the output matches the rest of the line.<br>
Lines beginning "===> " contain alternative (valid) representations of the previous line, for use when uni_frac is false. Note these equivalences can then be used further on, eg the result on line 5 maps to line 3 via 2, not that it matters should the same equivalent be defined twice, and also note that "==> " should always be the unicode version and "===> " the ascii one.
 
Obviously this is not well tested and //will// fail on the next thing thrown at it, but
it shows the basic approach. Error handling omitted using that good ol' standby excuse
"for clarity".
 
Note that space is not skipped when getting exponents, otherwise it might wrongly treat
say "x + 2" as "x^2", since we /are/ allowing exponentiation symbols to be omitted. At
the start of parse() we strip spaces around '^' (etc) to help with that.
 
Processing the input in utf32 form is a complete no-brainer; whereas constructing utf8
output is a little more subtle, but avoids creating a utf32 "string" just because all
bytes happen to be less than 255, which would not necessarily be valid utf8/32.
 
<!--<syntaxhighlight lang="phix">(phixonline)-->
<span style="color: #000080;font-style:italic;">-- demo\rosetta\Unicode_polynomial_equation.exw</span>
<span style="color: #008080;">constant</span> <span style="color: #000000;">uni_frac</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">platform</span><span style="color: #0000FF;">()!=</span><span style="color: #004600;">WINDOWS</span> <span style="color: #000080;font-style:italic;">-- if true output unicode superscripts and vulgar fractions</span>
<span style="color: #008080;">constant</span> <span style="color: #000000;">UTF8BOM</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">#EF</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#BB</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#BF</span><span style="color: #0000FF;">},</span>
<span style="color: #000000;">SPTWO</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">#00B2</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">-- superscript two</span>
<span style="color: #000000;">STHRE</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">#00B3</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">-- superscript three</span>
<span style="color: #000000;">MIDOT</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">#00B7</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">-- middle dot</span>
<span style="color: #000000;">SPONE</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">#00B9</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">-- superscript one</span>
<span style="color: #000000;">QUART</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">#00BC</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">-- one quarter</span>
<span style="color: #000000;">AHALF</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">#00BD</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">-- one half</span>
<span style="color: #000000;">THQTR</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">#00BE</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">-- three quarters</span>
<span style="color: #000000;">MULTY</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">#00D7</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">-- multiplication sign</span>
<span style="color: #000000;">DIVDE</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">#2044</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">-- division sign</span>
<span style="color: #000000;">SZERO</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">#2070</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">-- superscript zero</span>
<span style="color: #000000;">SFOUR</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">#2074</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">-- superscript four</span>
<span style="color: #000000;">SFIVE</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">#2075</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">-- superscript five</span>
<span style="color: #000000;">SPSIX</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">#2076</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">-- superscript six</span>
<span style="color: #000000;">SSEVN</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">#2077</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">-- superscript seven</span>
<span style="color: #000000;">SEGHT</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">#2078</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">-- superscript eight</span>
<span style="color: #000000;">SNINE</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">#2079</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">-- superscript nine</span>
<span style="color: #000000;">SPLUS</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">#207A</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">-- superscript plus</span>
<span style="color: #000000;">SMNUS</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">#207B</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">-- superscript minus</span>
<span style="color: #000000;">SVNTH</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">#2150</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">-- one seventh</span>
<span style="color: #000000;">NINTH</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">#2151</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">-- one ninth</span>
<span style="color: #000000;">TENTH</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">#2152</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">-- one tenth</span>
<span style="color: #000000;">THIRD</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">#2153</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">-- one third</span>
<span style="color: #000000;">TWTHD</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">#2154</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">-- two thirds</span>
<span style="color: #000000;">FIFTH</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">#2155</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">-- one fifth</span>
<span style="color: #000000;">TWFTH</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">#2156</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">-- two fifths</span>
<span style="color: #000000;">THFTH</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">#2157</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">-- three fifths</span>
<span style="color: #000000;">FRFTH</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">#2158</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">-- four fifths</span>
<span style="color: #000000;">SIXTH</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">#2159</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">-- one sixth</span>
<span style="color: #000000;">FVSIX</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">#215A</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">-- five sixths</span>
<span style="color: #000000;">EIGTH</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">#215B</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">-- one eigth</span>
<span style="color: #000000;">THEGH</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">#215C</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">-- three eigths</span>
<span style="color: #000000;">FVEGH</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">#215D</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">-- five eigths</span>
<span style="color: #000000;">UPARW</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">#2191</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">-- uparrow</span>
<span style="color: #000000;">BASET</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">#23E8</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">-- base 10</span>
<span style="color: #000000;">SPACE</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">' '</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">-- space</span>
<span style="color: #000000;">T</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">10</span> <span style="color: #000080;font-style:italic;">-- align nxt tbl</span>
<span style="color: #008080;">constant</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">vulgar_fractions</span><span style="color: #0000FF;">,</span><span style="color: #000000;">unicode_vulgar_fractions</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">columnize</span><span style="color: #0000FF;">({{{</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">4</span><span style="color: #0000FF;">},</span><span style="color: #000000;">QUART</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{{</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">2</span><span style="color: #0000FF;">},</span><span style="color: #000000;">AHALF</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{{</span><span style="color: #000000;">3</span><span style="color: #0000FF;">,</span><span style="color: #000000;">4</span><span style="color: #0000FF;">},</span><span style="color: #000000;">THQTR</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{{</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">7</span><span style="color: #0000FF;">},</span><span style="color: #000000;">SVNTH</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{{</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">9</span><span style="color: #0000FF;">},</span><span style="color: #000000;">NINTH</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{{</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">T</span><span style="color: #0000FF;">},</span><span style="color: #000000;">TENTH</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{{</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">3</span><span style="color: #0000FF;">},</span><span style="color: #000000;">THIRD</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{{</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">3</span><span style="color: #0000FF;">},</span><span style="color: #000000;">TWTHD</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{{</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">5</span><span style="color: #0000FF;">},</span><span style="color: #000000;">FIFTH</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{{</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">5</span><span style="color: #0000FF;">},</span><span style="color: #000000;">TWFTH</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{{</span><span style="color: #000000;">3</span><span style="color: #0000FF;">,</span><span style="color: #000000;">5</span><span style="color: #0000FF;">},</span><span style="color: #000000;">THFTH</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{{</span><span style="color: #000000;">4</span><span style="color: #0000FF;">,</span><span style="color: #000000;">5</span><span style="color: #0000FF;">},</span><span style="color: #000000;">FRFTH</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{{</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">6</span><span style="color: #0000FF;">},</span><span style="color: #000000;">SIXTH</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{{</span><span style="color: #000000;">5</span><span style="color: #0000FF;">,</span><span style="color: #000000;">6</span><span style="color: #0000FF;">},</span><span style="color: #000000;">FVSIX</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{{</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">8</span><span style="color: #0000FF;">},</span><span style="color: #000000;">EIGTH</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{{</span><span style="color: #000000;">3</span><span style="color: #0000FF;">,</span><span style="color: #000000;">8</span><span style="color: #0000FF;">},</span><span style="color: #000000;">THEGH</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{{</span><span style="color: #000000;">5</span><span style="color: #0000FF;">,</span><span style="color: #000000;">8</span><span style="color: #0000FF;">},</span><span style="color: #000000;">FVEGH</span><span style="color: #0000FF;">}})</span>
<span style="color: #008080;">constant</span> <span style="color: #000000;">EXPONENTS</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">SZERO</span><span style="color: #0000FF;">,</span><span style="color: #000000;">SPONE</span><span style="color: #0000FF;">,</span><span style="color: #000000;">SPTWO</span><span style="color: #0000FF;">,</span><span style="color: #000000;">STHRE</span><span style="color: #0000FF;">,</span><span style="color: #000000;">SFOUR</span><span style="color: #0000FF;">,</span><span style="color: #000000;">SFIVE</span><span style="color: #0000FF;">,</span><span style="color: #000000;">SPSIX</span><span style="color: #0000FF;">,</span><span style="color: #000000;">SSEVN</span><span style="color: #0000FF;">,</span><span style="color: #000000;">SEGHT</span><span style="color: #0000FF;">,</span><span style="color: #000000;">SNINE</span><span style="color: #0000FF;">}</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">skip</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000000;">sdx</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">sequence</span> <span style="color: #000000;">set</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">while</span> <span style="color: #000000;">sdx</span><span style="color: #0000FF;"><=</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">and</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">sdx</span><span style="color: #0000FF;">],</span><span style="color: #000000;">set</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
<span style="color: #000000;">sdx</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
<span style="color: #008080;">return</span> <span style="color: #000000;">sdx</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">get_sign</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000000;">sdx</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">bool</span> <span style="color: #000000;">allow_superscripts</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">sgn</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">ch</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">sdx</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
<span style="color: #000000;">ch</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">sdx</span><span style="color: #0000FF;">]</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">allow_superscripts</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">ch</span> <span style="color: #0000FF;">=</span> <span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #000000;">ch</span><span style="color: #0000FF;">=</span><span style="color: #000000;">SPLUS</span><span style="color: #0000FF;">?</span><span style="color: #008000;">'+'</span><span style="color: #0000FF;">:</span>
<span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #000000;">ch</span><span style="color: #0000FF;">=</span><span style="color: #000000;">SMNUS</span><span style="color: #0000FF;">?</span><span style="color: #008000;">'-'</span><span style="color: #0000FF;">:</span>
<span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #000000;">ch</span><span style="color: #0000FF;">=</span><span style="color: #000000;">SPACE</span><span style="color: #0000FF;">?</span><span style="color: #008000;">'?'</span><span style="color: #0000FF;">:</span><span style="color: #000000;">ch</span><span style="color: #0000FF;">)))</span> <span style="color: #000080;font-style:italic;">-- (do not skip spaces, see note)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">ch</span><span style="color: #0000FF;">!=</span><span style="color: #008000;">'+'</span>
<span style="color: #008080;">and</span> <span style="color: #000000;">ch</span><span style="color: #0000FF;">!=</span><span style="color: #008000;">' '</span> <span style="color: #008080;">then</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">ch</span><span style="color: #0000FF;">!=</span><span style="color: #008000;">'-'</span> <span style="color: #008080;">then</span> <span style="color: #008080;">exit</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #000000;">sgn</span> <span style="color: #0000FF;">*=</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">1</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #000000;">sdx</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">return</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">sgn</span><span style="color: #0000FF;">,</span><span style="color: #000000;">sdx</span><span style="color: #0000FF;">}</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">get_num</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000000;">sdx</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">atom</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">bool</span> <span style="color: #000000;">allow_superscripts</span><span style="color: #0000FF;">=</span><span style="color: #004600;">false</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">as_fraction</span><span style="color: #0000FF;">=</span><span style="color: #004600;">false</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">sgn</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">ch</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">f</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">e10</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">d</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span>
<span style="color: #004080;">atom</span> <span style="color: #000000;">p10</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">10</span>
<span style="color: #004080;">bool</span> <span style="color: #000000;">none</span> <span style="color: #0000FF;">=</span> <span style="color: #008080;">not</span> <span style="color: #000000;">as_fraction</span> <span style="color: #000080;font-style:italic;">-- (cope with "x" == "1x^1" and != "0x^0")
-- (but not when processing the "34" of "12.34", obvs)</span>
<span style="color: #008080;">if</span> <span style="color: #008080;">not</span> <span style="color: #000000;">as_fraction</span> <span style="color: #008080;">then</span>
<span style="color: #0000FF;">{</span><span style="color: #000000;">sgn</span><span style="color: #0000FF;">,</span><span style="color: #000000;">sdx</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">get_sign</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,</span><span style="color: #000000;">sdx</span><span style="color: #0000FF;">,</span><span style="color: #000000;">allow_superscripts</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">if</span> <span style="color: #008080;">not</span> <span style="color: #000000;">allow_superscripts</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">sdx</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">skip</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,</span><span style="color: #000000;">sdx</span><span style="color: #0000FF;">,{</span><span style="color: #008000;">' '</span><span style="color: #0000FF;">})</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">sdx</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
<span style="color: #000000;">ch</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">sdx</span><span style="color: #0000FF;">]</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">ch</span><span style="color: #0000FF;">>=</span><span style="color: #008000;">'0'</span> <span style="color: #008080;">and</span> <span style="color: #000000;">ch</span><span style="color: #0000FF;"><=</span><span style="color: #008000;">'9'</span> <span style="color: #008080;">then</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">as_fraction</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">n</span> <span style="color: #0000FF;">+=</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">ch</span><span style="color: #0000FF;">-</span><span style="color: #008000;">'0'</span><span style="color: #0000FF;">)/</span><span style="color: #000000;">p10</span>
<span style="color: #000000;">p10</span> <span style="color: #0000FF;">*=</span> <span style="color: #000000;">10</span>
<span style="color: #008080;">else</span>
<span style="color: #000000;">n</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">*</span><span style="color: #000000;">10</span><span style="color: #0000FF;">+</span><span style="color: #000000;">ch</span><span style="color: #0000FF;">-</span><span style="color: #008000;">'0'</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #000000;">none</span> <span style="color: #0000FF;">=</span> <span style="color: #004600;">false</span>
<span style="color: #008080;">elsif</span> <span style="color: #000000;">allow_superscripts</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">f</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #000000;">ch</span><span style="color: #0000FF;">,</span><span style="color: #000000;">EXPONENTS</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">f</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span> <span style="color: #008080;">exit</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #000000;">n</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">*</span><span style="color: #000000;">10</span><span style="color: #0000FF;">+</span><span style="color: #000000;">f</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span>
<span style="color: #000000;">none</span> <span style="color: #0000FF;">=</span> <span style="color: #004600;">false</span>
<span style="color: #008080;">elsif</span> <span style="color: #008080;">not</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #000000;">ch</span><span style="color: #0000FF;">,</span><span style="color: #008000;">" ,"</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span>
<span style="color: #008080;">exit</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #000000;">sdx</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">if</span> <span style="color: #008080;">not</span> <span style="color: #000000;">allow_superscripts</span> <span style="color: #008080;">then</span>
<span style="color: #008080;">if</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #000000;">ch</span><span style="color: #0000FF;">,{</span><span style="color: #008000;">'e'</span><span style="color: #0000FF;">,</span><span style="color: #008000;">'E'</span><span style="color: #0000FF;">,</span><span style="color: #000000;">BASET</span><span style="color: #0000FF;">})</span> <span style="color: #008080;">then</span>
<span style="color: #0000FF;">{</span><span style="color: #000000;">e10</span><span style="color: #0000FF;">,</span><span style="color: #000000;">f</span><span style="color: #0000FF;">,</span><span style="color: #000000;">sdx</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">get_num</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,</span><span style="color: #000000;">sdx</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">f</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span> <span style="color: #0000FF;">?</span><span style="color: #000000;">9</span><span style="color: #0000FF;">/</span><span style="color: #000000;">0</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #000000;">n</span> <span style="color: #0000FF;">*=</span> <span style="color: #7060A8;">power</span><span style="color: #0000FF;">(</span><span style="color: #000000;">10</span><span style="color: #0000FF;">,</span><span style="color: #000000;">e10</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">elsif</span> <span style="color: #000000;">ch</span><span style="color: #0000FF;">=</span><span style="color: #008000;">'.'</span> <span style="color: #008080;">then</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">as_fraction</span> <span style="color: #008080;">then</span> <span style="color: #0000FF;">?</span><span style="color: #000000;">9</span><span style="color: #0000FF;">/</span><span style="color: #000000;">0</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #0000FF;">{</span><span style="color: #000000;">n</span><span style="color: #0000FF;">,</span><span style="color: #000000;">f</span><span style="color: #0000FF;">,</span><span style="color: #000000;">sdx</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">get_num</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,</span><span style="color: #000000;">sdx</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">n</span><span style="color: #0000FF;">,</span><span style="color: #000000;">as_fraction</span><span style="color: #0000FF;">:=</span><span style="color: #004600;">true</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">f</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span> <span style="color: #0000FF;">?</span><span style="color: #000000;">9</span><span style="color: #0000FF;">/</span><span style="color: #000000;">0</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #000000;">none</span> <span style="color: #0000FF;">=</span> <span style="color: #004600;">false</span>
<span style="color: #008080;">else</span>
<span style="color: #000000;">f</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #000000;">ch</span><span style="color: #0000FF;">,</span><span style="color: #000000;">unicode_vulgar_fractions</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">f</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">as_fraction</span> <span style="color: #008080;">then</span> <span style="color: #0000FF;">?</span><span style="color: #000000;">9</span><span style="color: #0000FF;">/</span><span style="color: #000000;">0</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #004080;">integer</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">vfn</span><span style="color: #0000FF;">,</span><span style="color: #000000;">vfd</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">vulgar_fractions</span><span style="color: #0000FF;">[</span><span style="color: #000000;">f</span><span style="color: #0000FF;">]</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">uni_frac</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">n</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">*</span><span style="color: #000000;">vfd</span> <span style="color: #0000FF;">+</span> <span style="color: #000000;">vfn</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">d</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span> <span style="color: #0000FF;">?</span><span style="color: #000000;">9</span><span style="color: #0000FF;">/</span><span style="color: #000000;">0</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #000000;">d</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">vfd</span>
<span style="color: #008080;">else</span>
<span style="color: #000000;">n</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">vfn</span><span style="color: #0000FF;">/</span><span style="color: #000000;">vfd</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #000000;">sdx</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span>
<span style="color: #000000;">none</span> <span style="color: #0000FF;">=</span> <span style="color: #004600;">false</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">none</span> <span style="color: #008080;">then</span> <span style="color: #000000;">n</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #000000;">n</span> <span style="color: #0000FF;">*=</span> <span style="color: #000000;">sgn</span>
<span style="color: #008080;">return</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">n</span><span style="color: #0000FF;">,</span><span style="color: #000000;">d</span><span style="color: #0000FF;">,</span><span style="color: #000000;">sdx</span><span style="color: #0000FF;">}</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">get_term</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000000;">sdx</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">last_sdx</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">sdx</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">-- (infinite loop check/prevent)</span>
<span style="color: #000000;">e</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span>
<span style="color: #004080;">atom</span> <span style="color: #000000;">c</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">d</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">f</span>
<span style="color: #004080;">bool</span> <span style="color: #000000;">sdiv</span> <span style="color: #0000FF;">=</span> <span style="color: #004600;">false</span>
<span style="color: #0000FF;">{</span><span style="color: #000000;">c</span><span style="color: #0000FF;">,</span><span style="color: #000000;">d</span><span style="color: #0000FF;">,</span><span style="color: #000000;">sdx</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">get_num</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,</span><span style="color: #000000;">sdx</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">sdx</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">skip</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,</span><span style="color: #000000;">sdx</span><span style="color: #0000FF;">,{</span><span style="color: #008000;">' '</span><span style="color: #0000FF;">,</span><span style="color: #000000;">MIDOT</span><span style="color: #0000FF;">,</span><span style="color: #000000;">MULTY</span><span style="color: #0000FF;">})</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">sdx</span><span style="color: #0000FF;"><=</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">and</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">sdx</span><span style="color: #0000FF;">]=</span><span style="color: #008000;">'/'</span> <span style="color: #008080;">or</span>
<span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">sdx</span><span style="color: #0000FF;">]=</span><span style="color: #000000;">DIVDE</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">sdx</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">sdx</span><span style="color: #0000FF;"><=</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">and</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">sdx</span><span style="color: #0000FF;">]!=</span><span style="color: #008000;">'x'</span> <span style="color: #008080;">then</span>
<span style="color: #0000FF;">{</span><span style="color: #000000;">d</span><span style="color: #0000FF;">,</span><span style="color: #000000;">f</span><span style="color: #0000FF;">,</span><span style="color: #000000;">sdx</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">get_num</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,</span><span style="color: #000000;">sdx</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">f</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span> <span style="color: #0000FF;">?</span><span style="color: #000000;">9</span><span style="color: #0000FF;">/</span><span style="color: #000000;">0</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">if</span> <span style="color: #008080;">not</span> <span style="color: #000000;">uni_frac</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">c</span> <span style="color: #0000FF;">/=</span> <span style="color: #000000;">d</span>
<span style="color: #000000;">d</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">else</span>
<span style="color: #000000;">sdiv</span> <span style="color: #0000FF;">=</span> <span style="color: #004600;">true</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">sdx</span><span style="color: #0000FF;"><=</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">and</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">sdx</span><span style="color: #0000FF;">]=</span><span style="color: #008000;">'x'</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">sdx</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">skip</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,</span><span style="color: #000000;">sdx</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,{</span><span style="color: #008000;">'^'</span><span style="color: #0000FF;">,</span><span style="color: #008000;">'*'</span><span style="color: #0000FF;">,</span><span style="color: #000000;">SPLUS</span><span style="color: #0000FF;">,</span><span style="color: #000000;">UPARW</span><span style="color: #0000FF;">})</span>
<span style="color: #0000FF;">{</span><span style="color: #000000;">e</span><span style="color: #0000FF;">,</span><span style="color: #000000;">f</span><span style="color: #0000FF;">,</span><span style="color: #000000;">sdx</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">get_num</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,</span><span style="color: #000000;">sdx</span><span style="color: #0000FF;">,</span><span style="color: #000000;">allow_superscripts</span><span style="color: #0000FF;">:=</span><span style="color: #004600;">true</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">f</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span> <span style="color: #0000FF;">?</span><span style="color: #000000;">9</span><span style="color: #0000FF;">/</span><span style="color: #000000;">0</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">sdiv</span> <span style="color: #008080;">then</span> <span style="color: #000000;">e</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">e</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">else</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">sdiv</span> <span style="color: #008080;">then</span> <span style="color: #0000FF;">?</span><span style="color: #000000;">9</span><span style="color: #0000FF;">/</span><span style="color: #000000;">0</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">sdx</span><span style="color: #0000FF;"><=</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">and</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">sdx</span><span style="color: #0000FF;">]=</span><span style="color: #008000;">'/'</span> <span style="color: #008080;">or</span>
<span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">sdx</span><span style="color: #0000FF;">]=</span><span style="color: #000000;">DIVDE</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">d</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span> <span style="color: #0000FF;">?</span><span style="color: #000000;">9</span><span style="color: #0000FF;">/</span><span style="color: #000000;">0</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #0000FF;">{</span><span style="color: #000000;">d</span><span style="color: #0000FF;">,</span><span style="color: #000000;">f</span><span style="color: #0000FF;">,</span><span style="color: #000000;">sdx</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">get_num</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,</span><span style="color: #000000;">sdx</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">f</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span> <span style="color: #0000FF;">?</span><span style="color: #000000;">9</span><span style="color: #0000FF;">/</span><span style="color: #000000;">0</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">if</span> <span style="color: #008080;">not</span> <span style="color: #000000;">uni_frac</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">c</span> <span style="color: #0000FF;">/=</span> <span style="color: #000000;">d</span>
<span style="color: #000000;">d</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">sdx</span><span style="color: #0000FF;">=</span><span style="color: #000000;">last_sdx</span> <span style="color: #008080;">then</span> <span style="color: #0000FF;">?</span><span style="color: #000000;">9</span><span style="color: #0000FF;">/</span><span style="color: #000000;">0</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">return</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">e</span><span style="color: #0000FF;">,</span><span style="color: #000000;">c</span><span style="color: #0000FF;">,</span><span style="color: #000000;">d</span><span style="color: #0000FF;">,</span><span style="color: #000000;">sdx</span><span style="color: #0000FF;">}</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">unicode_superscripts</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">e</span><span style="color: #0000FF;">)</span>
<span style="color: #000080;font-style:italic;">-- display helper</span>
<span style="color: #004080;">string</span> <span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">""</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">e</span><span style="color: #0000FF;">></span><span style="color: #000000;">9</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">unicode_superscripts</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">floor</span><span style="color: #0000FF;">(</span><span style="color: #000000;">e</span><span style="color: #0000FF;">/</span><span style="color: #000000;">10</span><span style="color: #0000FF;">))</span>
<span style="color: #000000;">e</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">remainder</span><span style="color: #0000FF;">(</span><span style="color: #000000;">e</span><span style="color: #0000FF;">,</span><span style="color: #000000;">10</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #000000;">res</span> <span style="color: #0000FF;">&=</span> <span style="color: #7060A8;">utf32_to_utf8</span><span style="color: #0000FF;">({</span><span style="color: #000000;">EXPONENTS</span><span style="color: #0000FF;">[</span><span style="color: #000000;">e</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]})</span>
<span style="color: #008080;">return</span> <span style="color: #000000;">res</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">enum</span> <span style="color: #000000;">EXP</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">COEF</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">FRAC</span> <span style="color: #000080;font-style:italic;">-- contents of terms[i]</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">poly</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">terms</span><span style="color: #0000FF;">)</span>
<span style="color: #000080;font-style:italic;">-- display helper</span>
<span style="color: #004080;">string</span> <span style="color: #000000;">r</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">""</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">t</span><span style="color: #0000FF;">=</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">terms</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">to</span> <span style="color: #000000;">1</span> <span style="color: #008080;">by</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">1</span> <span style="color: #008080;">do</span>
<span style="color: #0000FF;">{</span><span style="color: #004080;">integer</span> <span style="color: #000000;">e</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">atom</span> <span style="color: #000000;">c</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000000;">f</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">terms</span><span style="color: #0000FF;">[</span><span style="color: #000000;">t</span><span style="color: #0000FF;">]</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">c</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">c</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">and</span> <span style="color: #000000;">f</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">and</span> <span style="color: #000000;">e</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">r</span> <span style="color: #0000FF;">&=</span> <span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #000000;">r</span><span style="color: #0000FF;">=</span><span style="color: #008000;">""</span><span style="color: #0000FF;">?</span> <span style="color: #008000;">""</span><span style="color: #0000FF;">:</span><span style="color: #008000;">" + "</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">elsif</span> <span style="color: #000000;">c</span><span style="color: #0000FF;">=-</span><span style="color: #000000;">1</span> <span style="color: #008080;">and</span> <span style="color: #000000;">f</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">and</span> <span style="color: #000000;">e</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">r</span> <span style="color: #0000FF;">&=</span> <span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #000000;">r</span><span style="color: #0000FF;">=</span><span style="color: #008000;">""</span><span style="color: #0000FF;">?</span><span style="color: #008000;">"-"</span><span style="color: #0000FF;">:</span><span style="color: #008000;">" - "</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">else</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">r</span><span style="color: #0000FF;">!=</span><span style="color: #008000;">""</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">r</span> <span style="color: #0000FF;">&=</span> <span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #000000;">c</span><span style="color: #0000FF;"><</span><span style="color: #000000;">0</span><span style="color: #0000FF;">?</span><span style="color: #008000;">" - "</span><span style="color: #0000FF;">:</span><span style="color: #008000;">" + "</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">c</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">abs</span><span style="color: #0000FF;">(</span><span style="color: #000000;">c</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">f</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span> <span style="color: #000080;font-style:italic;">-- (hence/only when uni_frac==true)</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">k</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">({</span><span style="color: #7060A8;">remainder</span><span style="color: #0000FF;">(</span><span style="color: #000000;">c</span><span style="color: #0000FF;">,</span><span style="color: #000000;">f</span><span style="color: #0000FF;">),</span><span style="color: #000000;">f</span><span style="color: #0000FF;">},</span><span style="color: #000000;">vulgar_fractions</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">k</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">c</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">floor</span><span style="color: #0000FF;">(</span><span style="color: #000000;">c</span><span style="color: #0000FF;">/</span><span style="color: #000000;">f</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">c</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span> <span style="color: #000000;">r</span> <span style="color: #0000FF;">&=</span> <span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"%d"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">c</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #000000;">r</span> <span style="color: #0000FF;">&=</span> <span style="color: #7060A8;">utf32_to_utf8</span><span style="color: #0000FF;">({</span><span style="color: #000000;">unicode_vulgar_fractions</span><span style="color: #0000FF;">[</span><span style="color: #000000;">k</span><span style="color: #0000FF;">]})</span>
<span style="color: #008080;">else</span>
<span style="color: #000000;">r</span> <span style="color: #0000FF;">&=</span> <span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"%g"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">c</span><span style="color: #0000FF;">/</span><span style="color: #000000;">f</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">else</span>
<span style="color: #000000;">r</span> <span style="color: #0000FF;">&=</span> <span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"%g"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">c</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">e</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">r</span> <span style="color: #0000FF;">&=</span> <span style="color: #008000;">'x'</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">e</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">uni_frac</span> <span style="color: #008080;">then</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">e</span><span style="color: #0000FF;"><</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">r</span> <span style="color: #0000FF;">&=</span> <span style="color: #7060A8;">utf32_to_utf8</span><span style="color: #0000FF;">({</span><span style="color: #000000;">SMNUS</span><span style="color: #0000FF;">})</span>
<span style="color: #000000;">e</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">e</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #000000;">r</span> <span style="color: #0000FF;">&=</span> <span style="color: #000000;">unicode_superscripts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">e</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">else</span>
<span style="color: #000000;">r</span> <span style="color: #0000FF;">&=</span> <span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"^%d"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">e</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">r</span><span style="color: #0000FF;">=</span><span style="color: #008000;">""</span> <span style="color: #008080;">then</span> <span style="color: #000000;">r</span><span style="color: #0000FF;">=</span><span style="color: #008000;">"0"</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">return</span> <span style="color: #000000;">r</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">parse</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">sequence</span> <span style="color: #000000;">terms</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{}</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">sdx</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">e</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">f</span>
<span style="color: #004080;">atom</span> <span style="color: #000000;">c</span>
<span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">match_replace</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"&lt;sup&gt;"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"^"</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">match_replace</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"&lt;/sup&gt;"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,</span><span style="color: #008000;">""</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">match_replace</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"**"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"^"</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">match_replace</span><span style="color: #0000FF;">(</span><span style="color: #008000;">" ^"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"^"</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">match_replace</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"^ "</span><span style="color: #0000FF;">,</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"^"</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">match_replace</span><span style="color: #0000FF;">({</span><span style="color: #008000;">' '</span><span style="color: #0000FF;">,</span><span style="color: #000000;">SPLUS</span><span style="color: #0000FF;">},</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">SPLUS</span><span style="color: #0000FF;">})</span>
<span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">match_replace</span><span style="color: #0000FF;">({</span><span style="color: #008000;">' '</span><span style="color: #0000FF;">,</span><span style="color: #000000;">SMNUS</span><span style="color: #0000FF;">},</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">SMNUS</span><span style="color: #0000FF;">})</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">EXPONENTS</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
<span style="color: #000000;">e</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">EXPONENTS</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span>
<span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">match_replace</span><span style="color: #0000FF;">({</span><span style="color: #008000;">' '</span><span style="color: #0000FF;">,</span><span style="color: #000000;">e</span><span style="color: #0000FF;">},</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">e</span><span style="color: #0000FF;">})</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">while</span> <span style="color: #000000;">sdx</span><span style="color: #0000FF;"><=</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
<span style="color: #0000FF;">{</span><span style="color: #000000;">e</span><span style="color: #0000FF;">,</span><span style="color: #000000;">c</span><span style="color: #0000FF;">,</span><span style="color: #000000;">f</span><span style="color: #0000FF;">,</span><span style="color: #000000;">sdx</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">get_term</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,</span><span style="color: #000000;">sdx</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">c</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span> <span style="color: #000080;font-style:italic;">-- (aside: +5 -5 may yet leave c==0)</span>
<span style="color: #000000;">terms</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">append</span><span style="color: #0000FF;">(</span><span style="color: #000000;">terms</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">e</span><span style="color: #0000FF;">,</span><span style="color: #000000;">c</span><span style="color: #0000FF;">,</span><span style="color: #000000;">f</span><span style="color: #0000FF;">})</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
<span style="color: #000000;">terms</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sort</span><span style="color: #0000FF;">(</span><span style="color: #000000;">terms</span><span style="color: #0000FF;">)</span>
<span style="color: #000080;font-style:italic;">-- merge, eg "10x^2 + 10x^2" -&gt; 20x^2</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">terms</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">to</span> <span style="color: #000000;">2</span> <span style="color: #008080;">by</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">1</span> <span style="color: #008080;">do</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">terms</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">][</span><span style="color: #000000;">EXP</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">terms</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">][</span><span style="color: #000000;">EXP</span><span style="color: #0000FF;">]</span> <span style="color: #008080;">then</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">terms</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">][</span><span style="color: #000000;">FRAC</span><span style="color: #0000FF;">]!=</span><span style="color: #000000;">terms</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">][</span><span style="color: #000000;">FRAC</span><span style="color: #0000FF;">]</span> <span style="color: #008080;">then</span>
<span style="color: #0000FF;">?</span><span style="color: #000000;">9</span><span style="color: #0000FF;">/</span><span style="color: #000000;">0</span> <span style="color: #000080;font-style:italic;">-- placeholder for more code</span>
<span style="color: #008080;">else</span>
<span style="color: #000000;">terms</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">][</span><span style="color: #000000;">COEF</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">terms</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">][</span><span style="color: #000000;">COEF</span><span style="color: #0000FF;">]</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #000000;">terms</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">..</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{}</span> <span style="color: #000080;font-style:italic;">-- (delete 2nd)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">return</span> <span style="color: #000000;">poly</span><span style="color: #0000FF;">(</span><span style="color: #000000;">terms</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">include</span> <span style="color: #000000;">Unicode_polynomial_equation</span><span style="color: #0000FF;">.</span><span style="color: #000000;">e</span>
<span style="color: #004080;">sequence</span> <span style="color: #000000;">alts</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{},</span> <span style="color: #000080;font-style:italic;">-- (unicode versions)</span>
<span style="color: #000000;">altn</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{},</span> <span style="color: #000080;font-style:italic;">-- (idx of ascii equivalents)
-- lines = read_lines("Unicode_polynomial_equation.txt")</span>
<span style="color: #000000;">lines</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">get_lines</span><span style="color: #0000FF;">()</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">lines</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">][</span><span style="color: #000000;">1</span><span style="color: #0000FF;">..</span><span style="color: #000000;">3</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">UTF8BOM</span> <span style="color: #008080;">then</span>
<span style="color: #000080;font-style:italic;">-- remove/ignore any utf8 byte order mark</span>
<span style="color: #000000;">lines</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">lines</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">][</span><span style="color: #000000;">4</span><span style="color: #0000FF;">..$]</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">2</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">lines</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">lines</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">])></span><span style="color: #000000;">5</span>
<span style="color: #008080;">and</span> <span style="color: #000000;">lines</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">][</span><span style="color: #000000;">1</span><span style="color: #0000FF;">..</span><span style="color: #000000;">5</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"===&gt; "</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">alts</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">append</span><span style="color: #0000FF;">(</span><span style="color: #000000;">alts</span><span style="color: #0000FF;">,</span><span style="color: #000000;">lines</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">][</span><span style="color: #000000;">5</span><span style="color: #0000FF;">..$])</span>
<span style="color: #000000;">altn</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">append</span><span style="color: #0000FF;">(</span><span style="color: #000000;">altn</span><span style="color: #0000FF;">,</span><span style="color: #000000;">i</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">2</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">lines</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">lines</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">])></span><span style="color: #000000;">4</span>
<span style="color: #008080;">and</span> <span style="color: #000000;">lines</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">][</span><span style="color: #000000;">1</span><span style="color: #0000FF;">..</span><span style="color: #000000;">4</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"==&gt; "</span> <span style="color: #008080;">then</span>
<span style="color: #004080;">sequence</span> <span style="color: #000000;">line</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">utf8_to_utf32</span><span style="color: #0000FF;">(</span><span style="color: #000000;">lines</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]),</span>
<span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">parse</span><span style="color: #0000FF;">(</span><span style="color: #000000;">line</span><span style="color: #0000FF;">),</span>
<span style="color: #000000;">expected</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">lines</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">][</span><span style="color: #000000;">5</span><span style="color: #0000FF;">..$]</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">res</span><span style="color: #0000FF;">=</span><span style="color: #000000;">expected</span> <span style="color: #008080;">then</span>
<span style="color: #000080;font-style:italic;">-- (res is the unicode version)</span>
<span style="color: #008080;">if</span> <span style="color: #7060A8;">platform</span><span style="color: #0000FF;">()!=</span><span style="color: #004600;">WINDOWS</span> <span style="color: #008080;">or</span> <span style="color: #000000;">res</span><span style="color: #0000FF;">=</span><span style="color: #008000;">"0"</span> <span style="color: #008080;">then</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%2d: %40s ok\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">i</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">res</span><span style="color: #0000FF;">})</span>
<span style="color: #008080;">else</span>
<span style="color: #000080;font-style:italic;">-- (unicode output on windows consoles is fiddly...)</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%2d: ok\n"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">i</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">else</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">k</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #000000;">expected</span><span style="color: #0000FF;">,</span><span style="color: #000000;">alts</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">k</span> <span style="color: #008080;">and</span> <span style="color: #000000;">res</span><span style="color: #0000FF;">=</span><span style="color: #000000;">lines</span><span style="color: #0000FF;">[</span><span style="color: #000000;">altn</span><span style="color: #0000FF;">[</span><span style="color: #000000;">k</span><span style="color: #0000FF;">]][</span><span style="color: #000000;">6</span><span style="color: #0000FF;">..$]</span> <span style="color: #008080;">then</span>
<span style="color: #000080;font-style:italic;">-- (res is the ascii equivalent)</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%2d: %40s ok\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">i</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">res</span><span style="color: #0000FF;">})</span>
<span style="color: #008080;">else</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%d: error - %s\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">i</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">res</span><span style="color: #0000FF;">})</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #0000FF;">?</span><span style="color: #008000;">"done"</span>
<span style="color: #0000FF;">{}</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">wait_key</span><span style="color: #0000FF;">()</span>
<!--</syntaxhighlight>-->
{{out}}
uni_frac = false (ie windows)
<pre>
1: x^5 - 2x^4 + 42x^3 + 40x + 1 ok
Line 474 ⟶ 1,155:
38: x^5 - 2x^4 + 42x^3 + 40x + 1 ok
</pre>
uni_frac = true (linux or pwa/p2js only, unless you have managed to find and install a decent windows console unicode font, which I haven't)
uni_frac = true (linux only)
<pre>
1: x⁵ - 2x⁴ + 42x³ + 40x + 1 ok
Line 494 ⟶ 1,175:
36: x⁵ - 2x⁴ + 42x³ + 40x + 1 ok
38: x⁵ - 2x⁴ + 42x³ + 40x + 1 ok
</pre>
 
=={{header|Wren}}==
{{trans|Go}}
{{libheader|Wren-pattern}}
<syntaxhighlight lang="wren">import "./pattern" for Pattern
 
var powers = [
["0", "⁰"],
["1", "¹"],
["2", "²"],
["3", "³"],
["4", "⁴"],
["5", "⁵"],
["6", "⁶"],
["7", "⁷"],
["8", "⁸"],
["9", "⁹"],
["-", "⁻"]
]
 
var fractions = [
[".25", "¼"],
[".5", "½"],
[".75", "¾"],
[".14285714285714", "⅐"],
[".11111111111111", "⅑"],
[".1", "⅒"],
[".33333333333333", "⅓"],
[".66666666666667", "⅔"],
[".2", "⅕"],
[".4", "⅖"],
[".6", "⅗"],
[".8", "⅘"],
[".16666666666667", "⅙"],
[".83333333333333", "⅚"],
[".125", "⅛"],
[".375", "⅜"],
[".625", "⅝"],
[".875", "⅞"]
]
 
var printEquation = Fn.new { |coefs|
System.write("=> ")
if (coefs.isEmpty) {
System.print("0\n")
return
}
var keys = coefs.keys.toList
var max = keys[0]
var min = keys[0]
for (k in keys.skip(1)) {
if (k > max) max = k
if (k < min) min = k
}
for (p in max..min) {
var c = coefs[p] ? coefs[p] : 0
if (c != 0) {
if (p < max) {
var sign = "+"
if (c < 0) {
sign = "-"
c = -c
}
System.write(" %(sign) ")
}
if (c != 1 || (c == 1 && p == 0)) {
var cs = c.toString
var ix = cs.indexOf(".")
if (ix >= 0) {
var dec = cs[ix..-1]
for (frac in fractions) {
if (dec == frac[0]) {
cs = cs[0...ix] + frac[1]
break
}
}
}
if (cs[0] == "0" && cs.count > 1 && cs[1] != ".") cs = cs[1..-1]
System.write(cs)
}
if (p != 0) {
var ps = p.toString
for (power in powers) ps = ps.replace(power[0], power[1])
if (ps == "¹") ps = ""
System.write("x%(ps)")
}
}
}
System.print("\n")
}
 
var equs = [
"-0.00x⁺¹⁰ + 1.0·x ** 5 + -2e0x^4 + +0,042.00 × x ⁺³ + +.0x² + 20.000 000 000x¹ - -1x⁺⁰ + .0x⁻¹ + 20.x¹",
"x⁵ - 2x⁴ + 42x³ + 0x² + 40x + 1",
"0e+0x⁰⁰⁷ + 00e-00x + 0x + .0x⁰⁵ - 0.x⁴ + 0×x³ + 0x⁻⁰ + 0/x + 0/x³ + 0x⁻⁵",
"1x⁵ - 2x⁴ + 42x³ + 40x + 1x⁰",
"+x⁺⁵ + -2x⁻⁻⁴ + 42x⁺⁺³ + +40x - -1",
"x^5 - 2x**4 + 42x^3 + 40x + 1",
"x↑5 - 2.00·x⁴ + 42.00·x³ + 40.00·x + 1",
"x⁻⁵ - 2⁄x⁴ + 42x⁻³ + 40/x + 1x⁻⁰",
"x⁵ - 2x⁴ + 42.000 000x³ + 40x + 1",
"x⁵ - 2x⁴ + 0,042x³ + 40.000,000x + 1",
"0x⁷ + 10x + 10x + x⁵ - 2x⁴ + 42x³ + 20x + 1",
"1E0x⁵ - 2,000,000.e-6x⁴ + 4.2⏨1x³ + .40e+2x + 1",
"x⁵ - x⁴⁄2 + 405x³⁄4 + 403x⁄4 + 5⁄2",
"x⁵ - 0.5x⁴ + 101.25x³ + 100.75x + 2.5",
"x⁻⁵ - 2⁄x⁴ + 42x⁻³ - 40/x",
"⅐x⁵ - ⅓x⁴ - ⅔x⁴ + 42⅕x³ + ⅑x - 40⅛ - ⅝"
]
 
var pattern = Pattern.new("+1/s/n+1/s")
 
var reps = [
[",", ""],
[" ", ""],
["¼", ".25"],
["½", ".5"],
["¾", ".75"],
["⅐", ".14285714285714"],
["⅑", ".11111111111111"],
["⅒", ".1"],
["⅓", ".33333333333333"],
["⅔", ".66666666666667"],
["⅕", ".2"],
["⅖", ".4"],
["⅗", ".6"],
["⅘", ".8"],
["⅙", ".16666666666667"],
["⅚", ".83333333333333"],
["⅛", ".125"],
["⅜", ".375"],
["⅝", ".625"],
["⅞", ".875"],
["↉", ".0"],
["⏨", "e"],
["⁄", "/"]
]
 
var reps2 = [
["⁰", "0"],
["¹", "1"],
["²", "2"],
["³", "3"],
["⁴", "4"],
["⁵", "5"],
["⁶", "6"],
["⁷", "7"],
["⁸", "8"],
["⁹", "9"],
["⁻⁻", ""],
["⁻", "-"],
["⁺", ""],
["**", ""],
["^", ""],
["↑", ""],
["⁄", "/"]
]
 
for (equ in equs) {
System.print(equ)
var terms = pattern.splitAll(equ)
var ops = pattern.findAll(equ).map { |m| m.text.trim() }.toList
var coefs = {}
var i = 0
for (term in terms) {
var s = term.split("x")
var t = s[0].trimEnd("·× ")
for (rep in reps) t = t.replace(rep[0], rep[1])
var c = 1
var inverse = false
if (t == "" || t == "+" || t == "-") t = t + "1"
var ix = t.indexOf("/")
if (ix == t.count - 1) {
inverse = true
t = t[0..-2]
c = Num.fromString(t)
} else if (ix >= 0) {
var u = t.split("/")
var m = Num.fromString(u[0])
var n = Num.fromString(u[1])
c = m / n
} else {
c = Num.fromString(t)
}
if (i > 0 && ops[i-1] == "-") c = -c
if (c == -0) c = 0
var cont = false
if (s.count == 1) {
coefs[0] = coefs[0] ? coefs[0] + c : c
cont = true
}
if (!cont) {
var u = s[1].trim()
if (u == "") {
var p = 1
if (inverse) p = -1
if (c != 0) coefs[p] = coefs[p] ? coefs[p] + c : c
cont = true
}
if (!cont) {
for (rep in reps2) u = u.replace(rep[0], rep[1])
var jx = u.indexOf("/")
var p = 1
if (jx >= 0) {
var v = u.split("/")
p = Num.fromString(v[0])
if (p == null) p = 1
var d = Num.fromString(v[1])
c = c / d
} else {
p = Num.fromString(u.trim())
if (p == null) p = 1
}
if (inverse) p = -p
if (c != 0) coefs[p] = coefs[p] ? coefs[p] + c : c
}
}
i = i + 1
}
printEquation.call(coefs)
}</syntaxhighlight>
 
{{out}}
<pre>
-0.00x⁺¹⁰ + 1.0·x ** 5 + -2e0x^4 + +0,042.00 × x ⁺³ + +.0x² + 20.000 000 000x¹ - -1x⁺⁰ + .0x⁻¹ + 20.x¹
=> x⁵ - 2x⁴ + 42x³ + 40x + 1
 
x⁵ - 2x⁴ + 42x³ + 0x² + 40x + 1
=> x⁵ - 2x⁴ + 42x³ + 40x + 1
 
0e+0x⁰⁰⁷ + 00e-00x + 0x + .0x⁰⁵ - 0.x⁴ + 0×x³ + 0x⁻⁰ + 0/x + 0/x³ + 0x⁻⁵
=> 0
 
1x⁵ - 2x⁴ + 42x³ + 40x + 1x⁰
=> x⁵ - 2x⁴ + 42x³ + 40x + 1
 
+x⁺⁵ + -2x⁻⁻⁴ + 42x⁺⁺³ + +40x - -1
=> x⁵ - 2x⁴ + 42x³ + 40x + 1
 
x^5 - 2x**4 + 42x^3 + 40x + 1
=> x⁵ - 2x⁴ + 42x³ + 40x + 1
 
x↑5 - 2.00·x⁴ + 42.00·x³ + 40.00·x + 1
=> x⁵ - 2x⁴ + 42x³ + 40x + 1
 
x⁻⁵ - 2⁄x⁴ + 42x⁻³ + 40/x + 1x⁻⁰
=> 1 + 40x⁻¹ + 42x⁻³ - 2x⁻⁴ + x⁻⁵
 
x⁵ - 2x⁴ + 42.000 000x³ + 40x + 1
=> x⁵ - 2x⁴ + 42x³ + 40x + 1
 
x⁵ - 2x⁴ + 0,042x³ + 40.000,000x + 1
=> x⁵ - 2x⁴ + 42x³ + 40x + 1
 
0x⁷ + 10x + 10x + x⁵ - 2x⁴ + 42x³ + 20x + 1
=> x⁵ - 2x⁴ + 42x³ + 40x + 1
 
1E0x⁵ - 2,000,000.e-6x⁴ + 4.2⏨1x³ + .40e+2x + 1
=> x⁵ - 2x⁴ + 42x³ + 40x + 1
 
x⁵ - x⁴⁄2 + 405x³⁄4 + 403x⁄4 + 5⁄2
=> x⁵ - ½x⁴ + 101¼x³ + 100¾x + 2½
 
x⁵ - 0.5x⁴ + 101.25x³ + 100.75x + 2.5
=> x⁵ - ½x⁴ + 101¼x³ + 100¾x + 2½
 
x⁻⁵ - 2⁄x⁴ + 42x⁻³ - 40/x
=> -40x⁻¹ + 42x⁻³ - 2x⁻⁴ + x⁻⁵
 
⅐x⁵ - ⅓x⁴ - ⅔x⁴ + 42⅕x³ + ⅑x - 40⅛ - ⅝
=> ⅐x⁵ - x⁴ + 42⅕x³ + ⅑x - 40¾
</pre>
 
9,476

edits