Giordano/FunzioniStringa
By Giordano Cignani
// 22/03/2020
Char=function(x){if(x==37 or x==38 or x>=127)->"null" else char(x)};
ASC=function(){var asc=ones(8,16);var k=-1;
var tt=MAP(x->(k+=1),asc);MAP(x->[x,Char(x)],tt)};
// in una stringa legge il carattere alla posizione kk
readc=function(s,kk){var k = (kk==null) ? 0 : kk;s[k]};
// [primo char di un stringa,la parte rimanente]
shiftc=function(s){var sl=string:split(s,"");
[shift(sl),string:join(sl)]};
// posizione del carattere "c" nella stringa "s"; altrimenti -1
findc=function(c,ss){var s=vertype(ss,"string","");var k=0;var j =len(s);
while ((k<j) and (readc(s,k) != c)) ->k+=1;k<j ? k : -1};
//trova un carattere di "str" in "s". [posizione,carattere]; altrimenti [-1,null]
findstr=function(str,ss){var s=vertype(ss,"string","");
var k=0;var j =len(s);var c="";var p=-1;
while (k<j) -> (c=readc(s,k);
p=findc(c,str);
if (p == -1) -> (k+=1) else (j=k));
(p== -1)? [-1,null] : [k,s[k]]};
// sottostringa dalla posizione k per una lunghezza lun o fine stringa,
substr=function(ss,k,lun){var s=vertype(ss,"string","");
var (sj,j,sl)=[[],k,string:split(s,"")];
while (j< min(k+lun,len(s)))->(push(sj,sl[j]);j+=1);
string:join(sj)};
// [valore della prima sequenza numerica in strng,parte residua della stringa]
val2=function(strng){var t:ss=(strng==null) ? "" : clone(strng);
var (d,v,cif,f,fd,segno,buono,ex,due)=[0,0,clone(cifre),false,false,1,true,0,true];
// Funzioni
var est=function(ch,st){findc(ch,st) != -1};
var aggiornastr=function(valid,dest){var cc=findstr(valid,dest)[0];
(cc != -1) ? substr(dest,cc,len(dest)): ""};
var azzera=function(){segno= 1;fd=false;v=0;d=0};
var GUT=function(){
while (buono) -> (
var (c,t:ss)=(var nn=shiftc(t:ss);if (nn[0]==null) -> nn[0]="";nn);
CASE([
(est(c,cifre) or (c=="")),x-> buono=false;
est(c,"+-"), x-> (if (c=="-")->segno*= -1);
(c==".") and est(t:ss[0],cifre), x-> fd=true;
due, x-> (t:ss=aggiornastr(concat("+-.",cifre),t:ss);azzera());
not due, x-> buono=false
]));
if (not fd) -> cif=concat(".",cif);
while (findc(c,cif) != -1)->(
if fd ->d+=1;
v= (c==".") ? (fd=true;cif=shiftc(cif)[1];v) :(f=true;v*10+(charCode(c)-48));
var(c,t:ss)=shiftc(t:ss));
if (c != null) ->t:ss=concat(c,t:ss);
f ? v*segno*10^ -d : null};
// Fine Funzioni
t:ss=aggiornastr(concat("+-.",cifre),t:ss);
var vv=GUT();
due=false; azzera();
if (f and (findc(t:ss[0],"eE") != -1) and
(findc(t:ss[1],concat("+-.",cifre)) != -1)) ->(
buono=true;
t:ss=shiftc(t:ss)[1];
ex=GUT();ex= (ex==null) ? 0 : ex);
[vv= f ? vv*10^ex : vv,t:ss]
};
// valore della prima sequenza numerica in strg
val=function(strg){val2(strg)[0]};
// tutti i valori delle sequenze numeriche in strg
VAL=function(strg){var sg=[];ss=clone(strg);
while (ss != "") ->(var sn=val2(ss);
if (sn[0] != null) -> push(sg,sn[0]);
ss=sn[1]);sg};
spam? | offensive?
1 Comment
spam?
Sign in to leave a comment