var myers=func(src,dst,show_table=0){ (src,dst)=(split("\n",src),split("\n",dst)); append(src,""); append(dst,""); var (src_len,dst_len)=(size(src),size(dst)); var mat=[]; setsize(mat,dst_len*src_len); forindex(var i;mat){ mat[i]=0; } var visited=[]; setsize(visited,dst_len*src_len); forindex(var i;visited){ visited[i]=0; } forindex(var y;dst) forindex(var x;src) mat[y*src_len+x]=(src[x]==dst[y]); if(show_table){ var curve=[ ["+---", "| "], [ "+---", "| \\ "] ]; var s=""; forindex(var y;dst){ forindex(var t;curve[0]){ forindex(var x;src){ s~=curve[mat[y*src_len+x]][t]; } s~=["+","|"][t]~"\n"; } } forindex(var i;src) s~="+---"; print(s~"+\n"); } var total=[]; var path=[]; var vec=[[0,0,-1]]; visited[0]=1; while(size(vec)){ append(total,vec); var tmp=[]; forindex(var i;vec){ var elem=vec[i]; var (x,y)=(elem[1],elem[0]); # find solution if(x==src_len-1 and y==dst_len-1){ append(path,vec[i]); for(var (prev,iter)=(elem[2],size(total)-1);iter>0;iter-=1){ var t=total[iter-1][prev]; append(path,t); prev=t[2]; } if(show_table){ for(var t=size(path)-1;t>=0;t-=1) print("("~path[t][1]~","~path[t][0]~")",t==0?"":"->"); println(); } # reverse path for(var t=0;t