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> |