Numerical and alphabetical suffixes: Difference between revisions

Content added Content deleted
m (→‎{{header|REXX}}: added zkl header)
(→‎{{header|zkl}}: added code)
Line 738: Line 738:


=={{header|zkl}}==
=={{header|zkl}}==
Uses GMP (GNU Multiple Precision Arithmetic Library for big ints.
<lang zkl></lang>
Floats are limited to 64 bit IEEE754.
<lang zkl></lang>
Error checking is nonexistent.
<lang zkl>var [const] BI=Import.lib("zklBigNum"); // GMP
var kRE,kD, aRE,aD;

kRE,kD = ki();
aRE,aD = abrevCreate();

fcn naSuffixes(numStr){
var [const]
numRE=RegExp(0'^([+-]*\.*\d+[.]*\d*[Ee]*[+-]*\d*)^),
bangRE=RegExp(0'^(!+)^);

nstr:=(numStr - " ,").toUpper();
numRE.search(nstr);
nstr=nstr[numRE.matched[0][1],*];
r:=numRE.matched[1];
if(r.matches("*[.eE]*")) r=r.toFloat(); // arg!
else r=BI(r);

reg z;
do{
z=nstr; // use this to see if we actually did anything
if(aRE.search(nstr)){
ns,k := aRE.matched; // ((0,3),"SCO")
re,b := aD[k]; // (RegExp("R|RE|RES"),BI(20)),
nstr = nstr[ns[1],*];
if(re.search(nstr)) nstr=nstr[re.matched[0][1],*]; # remove abbrev tail
r=r*b;
continue;
}else if(kRE.search(nstr)){
r*=kD[kRE.matched[1]]; // "K":1000 ...
nstr=nstr[kRE.matched[0][1],*];
continue;
}else if(bangRE.search(nstr)){ // floats are converted to int
n,k,z := r.toInt(), bangRE.matched[0][1], n - k;
r,nstr = BI(n), nstr[k,*];
while(z>0){ r.mul(z); z-=k; }
continue;
}
}while(nstr and z!=nstr);
r
}

fcn ki{ // case insensitive: k, ki,
ss:="K M G T P E Z Y X W V U".split();
d:=Dictionary();
ss.zipWith(d.add,[3..3*(ss.len()),3].apply(BI(10).pow)); # E:1e+18
ss.apply("append","I")
.zipWith(d.add,[10..10*(ss.len()),10].apply(BI(2).pow)); # EI:1.15292e+18
re:="([%s]I\\?)".fmt(ss.concat()); // "([KMGTPEZYXWVU]I\?)"
return(RegExp(re),d);
}
fcn abrevCreate{
var upDown=RegExp("([A-Z]+)(.*)");
s:="PAIRs 2; SCOres 20; DOZens 12; GREATGRoss 1728; GRoss 144; GOOGOLs 10e100".split(";");
abrevs,re := Dictionary(), Sink(String);
foreach an in (s){
a,n := an.split();
upDown.search(a);
u,d := upDown.matched[1,2];
d=d.len().pump(List, // "R|RE|RES"
'+(1),d.get.fp(0),"toUpper").reverse().concat("|");
abrevs.add(u,T(RegExp(d),BI(n)));
re.write(u," ");
}
// "PAIR|SCO|DOZ|GR|GREATGR|GOOGOL"
re=RegExp("(%s)".fmt(re.close().strip().replace(" ","|")));
return(re,abrevs);
}</lang>
<lang zkl>foreach na in (T("2greatGRo", "24Gros", "288Doz", "1,728pairs", "172.8SCOre",
"1,567", "+1.567k", "0.1567e-2m",
"25.123kK", "25.123m", "2.5123e-00002G",
"25.123kiKI", "25.123Mi", "2.5123e-00002Gi", "+.25123E-7Ei",
"-.25123e-34Vikki", "2e-77gooGols",
"9!", "9!!", "9!!!", "9!!!!", "9!!!!!", "9!!!!!!",
"9!!!!!!!", "9!!!!!!!!", "9!!!!!!!!!",
"9!!!!!!!!!k", ".017k!!", "4 dozensK")){
if((r:=naSuffixes(na)).isType(Float)) println("%16s : %,f".fmt(na,r));
else println("%16s : %,d".fmt(na,r));
}</lang>
{{out}}
{{out}}
<pre style="height:45ex">
<pre>
2greatGRo : 3,456
24Gros : 3,456
288Doz : 3,456
1,728pairs : 3,456
172.8SCOre : 3,456.000000
1,567 : 1,567
+1.567k : 1,567.000000
0.1567e-2m : 1,567.000000
25.123kK : 25,123,000.000000
25.123m : 25,123,000.000000
2.5123e-00002G : 25,123,000.000000
25.123kiKI : 26,343,374.848000
25.123Mi : 26,343,374.848000
2.5123e-00002Gi : 26,975,615.844352
+.25123E-7Ei : 28,964,846,960.237816
-.25123e-34Vikki : -33,394.194938
2e-77gooGols : 1,999,999,999,999,999,698,010,112.000000
9! : 362,880
9!! : 945
9!!! : 162
9!!!! : 45
9!!!!! : 36
9!!!!!! : 27
9!!!!!!! : 18
9!!!!!!!! : 9
9!!!!!!!!! : 9
9!!!!!!!!!k : 9,000
.017k!! : 34,459,425
4 dozensK : 48,000
</pre>
</pre>