Re: Adding and subtracting digits

"Gilles Arcas [email protected] [sed-users]" <[email protected]> Wed, 28 Nov 2018 21:21:24 +0000
Newsgroups gmane.editors.sed.user
Message-ID <VI1PR10MB1886C31E5C4502A4CDDBC652EAD10@VI1PR10MB1886.EURPRD10.PROD.OUTLOOK.COM>
--IPJuqE-eNKO4bv0MI9ZYi0mo8Eu0XsHqGbi4pij
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit

Hi Daniel,

I try to answer to all your comments.

1/ Examples

I see you have spent some time to run your own examples. Actually, the figures are incomplete but the test_add_sub.py script gives examples for all pairs of digits. If you execute:

$ python test_add_sub.py colorize ADD_90_90

You will see in line 67:

67 543210765432109876543210

   |blue |green  |magenta

             ^(3yellow)^(3 in yellow)

This is exactly what you have written with some colors to make it more readable.

2/ Using .* rather than \d* or [0-9]* in s/(.)(.);.*\1(.*);(.*(\2.*))/\3\5\4/

Of course this is possible but note that when used in numsed, PS contains not only the two digits but also the rest of the numbers to be added followed by the whole execution context (names spaces and stack) which could be of any size. Using .* would leads to a lot of backtracking.

3/ Removing the nested backtrack in s/(.)(.);.*\1(.*);(.*(\2.*))/\3\5\4/

This is perhaps a matter of style (and was my initial choice) but the sequence 9876543210 (or 0123456789 depending on the variant) would be repeated two times. Also in dc, once the initial PS content is constructed depending on the operation (add or sub), the following instructions are common (including this subst) to both operations thanks to this nested backref.

4/ s[x] = (r + s)[x + len(r)]     (i)

This one is really simple but all the demonstrations rely on that. s and r are strings and x is an index. To take an example:

'bar'[2] = ('foo' + 'bar')[2 + len('foo')]

and (i) is just a reference to be used in demonstration.

I see you are as interested in this as I am! Thanks a lot for comments and suggestions.

Gilles


[Non-text portions of this message have been removed]


--IPJuqE-eNKO4bv0MI9ZYi0mo8Eu0XsHqGbi4pij
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: 7bit




<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
</head>






 
<body style="background-color: #fff;">
<span style="display:none">&nbsp;</span>

<!--~-|**|PrettyHtmlStartT|**|-~-->
<div id="ygrp-mlmsg" style="position:relative;">
  <div id="ygrp-msg" style="z-index: 1;">
<!--~-|**|PrettyHtmlEndT|**|-~-->

    <div id="ygrp-text" >
      
      
      <p>Hi Daniel,<br>
<br>
I try to answer to all your comments.<br>
<br>
1/ Examples<br>
<br>
I see you have spent some time to run your own examples. Actually, the figures are incomplete but the test_add_sub.py script gives examples for all pairs of digits. If you execute:<br>
<br>
$ python test_add_sub.py colorize ADD_90_90<br>
<br>
You will see in line 67:<br>
<br>
67 543210765432109876543210<br>
<br>
|blue |green  |magenta<br>
<br>
^(3yellow)^(3 in yellow)<br>
<br>
This is exactly what you have written with some colors to make it more readable.<br>
<br>
2/ Using .* rather than &#92;d* or [0-9]* in s/(.)(.);.*&#92;1(.*);(.*(&#92;2.*))/&#92;3&#92;5&#92;4/<br>
<br>
Of course this is possible but note that when used in numsed, PS contains not only the two digits but also the rest of the numbers to be added followed by the whole execution context (names spaces and stack) which could be of any size. Using .* would leads to a lot of backtracking.<br>
<br>
3/ Removing the nested backtrack in s/(.)(.);.*&#92;1(.*);(.*(&#92;2.*))/&#92;3&#92;5&#92;4/<br>
<br>
This is perhaps a matter of style (and was my initial choice) but the sequence 9876543210 (or 0123456789 depending on the variant) would be repeated two times. Also in dc, once the initial PS content is constructed depending on the operation (add or sub), the following instructions are common (including this subst) to both operations thanks to this nested backref.<br>
<br>
4/ s[x] = (r + s)[x + len(r)]     (i)<br>
<br>
This one is really simple but all the demonstrations rely on that. s and r are strings and x is an index. To take an example:<br>
<br>
&#39;bar&#39;[2] = (&#39;foo&#39; + &#39;bar&#39;)[2 + len(&#39;foo&#39;)]<br>
<br>
and (i) is just a reference to be used in demonstration.<br>
<br>
I see you are as interested in this as I am! Thanks a lot for comments and suggestions.<br>
<br>
Gilles<br>
<br>
[Non-text portions of this message have been removed]<br>
<br>
</p>

    </div>
     

    <!--~-|**|PrettyHtmlStart|**|-~-->
    <div style="color: #fff; height: 0;">__._,_.___</div>

          
  
 

    
    <div style="clear:both"> </div>

    <div id="fromDMARC" style="margin-top: 10px;">
        <hr style="height:2px ; border-width:0; color:#E3E3E3; background-color:#E3E3E3;">
        Posted by: Gilles Arcas &lt;[email protected]&gt;        <hr style="height:2px ; border-width:0; color:#E3E3E3; background-color:#E3E3E3;">
     </div>
    <div style="clear:both"> </div>

    <table cellspacing=4px style="margin-top: 10px; margin-bottom: 10px; color: #2D50FD;">
      <tbody>
        <tr>
          <td style="font-size: 12px; font-family: arial; font-weight: bold; padding: 7px 5px 5px;"  >
                          <a style="text-decoration: none; color: #2D50FD" href="https://groups.yahoo.com/neo/groups/sed-users/conversations/messages/9971;_ylc=X3oDMTJwbWUxZ21zBF9TAzk3MzU5NzE0BGdycElkAzI0ODk2MzkEZ3Jwc3BJZAMxNzA5MzM1MDAyBG1zZ0lkAzk5NzEEc2VjA2Z0cgRzbGsDcnBseQRzdGltZQMxNTQzNDQwOTEz?act=reply&messageNum=9971">Reply via web post</a>
                      </td>
          <td>&bull;</td>
          <td style="font-size: 12px; font-family: arial; padding: 7px 5px 5px;" >
            <a href="mailto:[email protected]?subject=Re%3A%20Adding%20and%20subtracting%20digits" style="text-decoration: none; color: #2D50FD;">
               Reply to sender            </a>
          </td>
          <td>&bull;</td>
          <td style="font-size: 12px; font-family: arial; padding: 7px 5px 5px;">
            <a href="mailto:[email protected]?subject=Re%3A%20Adding%20and%20subtracting%20digits" style="text-decoration: none; color: #2D50FD">
              Reply to group            </a>
          </td>
          <td>&bull;</td>
          <td style="font-size: 12px; font-family: arial; padding: 7px 5px 5px;" >
            <a href="https://groups.yahoo.com/neo/groups/sed-users/conversations/newtopic;_ylc=X3oDMTJlZjQwMWtrBF9TAzk3MzU5NzE0BGdycElkAzI0ODk2MzkEZ3Jwc3BJZAMxNzA5MzM1MDAyBHNlYwNmdHIEc2xrA250cGMEc3RpbWUDMTU0MzQ0MDkxMw--" style="text-decoration: none; color: #2D50FD">Start a New Topic</a>
          </td>
          <td>&bull;</td>
          <td style="font-size: 12px; font-family: arial; padding: 7px 5px 5px;color: #2D50FD;" >
                            <a href="https://groups.yahoo.com/neo/groups/sed-users/conversations/topics/9965;_ylc=X3oDMTM0MXUyZnU5BF9TAzk3MzU5NzE0BGdycElkAzI0ODk2MzkEZ3Jwc3BJZAMxNzA5MzM1MDAyBG1zZ0lkAzk5NzEEc2VjA2Z0cgRzbGsDdnRwYwRzdGltZQMxNTQzNDQwOTEzBHRwY0lkAzk5NjU-" style="text-decoration: none; color: #2D50FD;">Messages in this topic</a>
                (7)
                      </td>
        </tr>
      </tbody>
    </table>

        
<div id="megaphoneModule">
            <hr style="height:2px ; border-width:0; color:#E3E3E3; background-color:#E3E3E3;">
        <div>
	     <div class="stream" style="margin-bottom:10px;">
        <div style="background-color:white;">
            <div class="sn-img" style="display:inline;"><img name="tn_file" style="padding:0px 10px;vertical-align:top;margin-top:5px;" src="https://s.yimg.com/ru/static/images/yg/img/megaphone/1464031581_phpFA8bON" height="82" width="82"></div>
            <div class="mod-txt" style="display:inline-block;">
                <a rel="nofollow" name="sub_url" target="_blank" href="https://yho.com/1wwmgg" style="color:#0000FF;display:block;margin-left:5px;text-decoration:none;"><span style="font-size:15px;">Have you tried the highest rated email app?</span></a>
                <div style="max-width:530px;padding:2px 5px;">With 4.5 stars in iTunes, the Yahoo Mail app is the highest rated email app on the market. What are you waiting for? Now you can access all your inboxes (Gmail, Outlook, AOL and more) in one place. Never delete an email again with 1000GB of free cloud storage.</div>
            </div>
        </div>
    </div>        </div>  
     
    <hr style="height:2px ; border-width:0; color:#E3E3E3; background-color:#E3E3E3;">
</div>

<!------- Start Nav Bar ------>


    <div id="ygrp-grfd" style="font-family: Verdana; font-size: 12px; padding: 15px 0;">
      
<!-- |**|begin egp html banner|**| -->

      -- <BR>
      
<!-- |**|end egp html banner|**| -->

    </div>
  

 

<!-- |**|begin egp html banner|**| -->
<div id="ygrp-vital" style="background-color: #f2f2f2; font-family: Verdana; font-size: 10px; margin-bottom: 10px; padding: 10px;">

    <span id="vithd" style="font-weight: bold; color: #333; text-transform: uppercase; "><a href="https://groups.yahoo.com/neo/groups/sed-users/info;_ylc=X3oDMTJlaWJxNW9xBF9TAzk3MzU5NzE0BGdycElkAzI0ODk2MzkEZ3Jwc3BJZAMxNzA5MzM1MDAyBHNlYwN2dGwEc2xrA3ZnaHAEc3RpbWUDMTU0MzQ0MDkxMw--" style="text-decoration: none;">Visit Your Group</a></span>

     <ul style="list-style-type: none; margin: 0; padding: 0; display: inline;">
                                                    </ul>
  </div>


<div id="ft" style="font-family: Arial; font-size: 11px; margin-top: 5px; padding: 0 2px 0 0; clear: both;">
  <a href="https://groups.yahoo.com/neo;_ylc=X3oDMTJkaDhib2lqBF9TAzk3MzU5NzE0BGdycElkAzI0ODk2MzkEZ3Jwc3BJZAMxNzA5MzM1MDAyBHNlYwNmdHIEc2xrA2dmcARzdGltZQMxNTQzNDQwOTEz" style="float: left;"><img src="http://l.yimg.com/ru/static/images/yg/img/email/new_logo/logo-groups-137x15.png" height="15" width="137" alt="Yahoo! Groups" style="border: 0;"/></a>
  <div style="color: #747575; float: right;"> &bull; <a href="https://info.yahoo.com/privacy/us/yahoo/groups/details.html" style="text-decoration: none;">Privacy</a> &bull; <a href="mailto:[email protected]?subject=Unsubscribe" style="text-decoration: none;">Unsubscribe</a> &bull; <a href="https://info.yahoo.com/legal/us/yahoo/utos/terms/" style="text-decoration: none;">Terms of Use</a> </div>
</div>
<br>

<!-- |**|end egp html banner|**| -->

  </div> <!-- ygrp-msg -->

 
  <!-- Sponsor -->
  <!-- |**|begin egp html banner|**| -->
  <div id="ygrp-sponsor" style="width:160px; float:right; clear:none; margin:0 0 25px 0; background: #fff;">

<!-- Start Recommendations -->
<div id="ygrp-reco">
     </div>
<!-- End Recommendations -->

          
<!-- |**|begin egp html banner|**| -->

    <div id="ygrp-lc">
      <div id="hd">SPONSORED LINKS</div>
      <div id="lc">
        <div class="ad" style="color:#628C2A; font-family:Arial; font-weight:bold;">
                      <script type='text/javascript'>document.write('<a href="https://us.y.atwola.com/?adlink|5113.1|221794|0|16|AdId=-3;BnId=0;itime=440914476;kvmn=y100000;kvssp=brxd;kvpgcolo=bf1;kvadtc%5Fdvmktname=unknown;kvadtc%5Fdvosplt=unknown;kvadtc%5Fdvbrand=unknown;kvadtc%5Fdvtype=unknown;kvadtc%5Fdvmodel=unknown;kvrepo%5Fdvosplt=unknown;kvadtc%5Fdvosversion=UNKNOWN;kvadtc%5Fcrbrand=wifi%5Fus;kvadtc%5Fcrmcc=UNKNOWN;kvadtc%5Fcrmnc=UNKNOWN;kvadtc%5Fcrcountry=us;kvadtc%5Fcontype=wifi;gdpr=0;adclntid=1004;spaceid=1709335002;" target=_top><img src="https://aka-cdn.adtechus.com/images/ATCollapse.gif" border=0 alt="AOL Ad" width="1" height="1" ></a>');
  
</script>
<!--Pointguard Diagnostic Start {"FAC3.0":{
"FAC IP" : "98.139.229.162",
"AdPosition Name" : "LC1",
"sapyECPM" : "0",
"gemniECPM" : "0",
"oneMobileECPM" : "0",
"gd2NetCpm" : "0",
"issapyEmpty" : "true",
"SapyAdSize" : "",
"SapyCustomSection" : "",
"SapyUrl" : "",
" SapyFedStatus" : "federation is not configured for ad slot",
" FedStatus" : "federation is not configured for ad slot"
}-->                          <img alt="" width=1 height=1 src="http://us.adserver.yahoo.com/l?M=#26/D=yahoo/S=:LC1/A=1234567/rand=933809315">
                              </div>
        <div class="ad" style="color:#628C2A; font-family:Arial; font-weight:bold;">
                      <script type='text/javascript'>document.write('<a href="https://us.y.atwola.com/?adlink|5113.1|221794|0|16|AdId=-3;BnId=0;itime=440914479;kvmn=y100000;kvssp=brxd;kvpgcolo=bf1;kvadtc%5Fdvmktname=unknown;kvadtc%5Fdvosplt=unknown;kvadtc%5Fdvbrand=unknown;kvadtc%5Fdvtype=unknown;kvadtc%5Fdvmodel=unknown;kvrepo%5Fdvosplt=unknown;kvadtc%5Fdvosversion=UNKNOWN;kvadtc%5Fcrbrand=wifi%5Fus;kvadtc%5Fcrmcc=UNKNOWN;kvadtc%5Fcrmnc=UNKNOWN;kvadtc%5Fcrcountry=us;kvadtc%5Fcontype=wifi;gdpr=0;adclntid=1004;spaceid=1709335002;" target=_top><img src="https://aka-cdn.adtechus.com/images/ATCollapse.gif" border=0 alt="AOL Ad" width="1" height="1" ></a>');
  
</script>
<!--Pointguard Diagnostic Start {"FAC3.0":{
"FAC IP" : "98.139.229.162",
"AdPosition Name" : "LC2",
"sapyECPM" : "0",
"gemniECPM" : "0",
"oneMobileECPM" : "0",
"gd2NetCpm" : "0",
"issapyEmpty" : "true",
"SapyAdSize" : "",
"SapyCustomSection" : "",
"SapyUrl" : "",
" SapyFedStatus" : "federation is not configured for ad slot",
" FedStatus" : "federation is not configured for ad slot"
}-->                          <img alt="" width=1 height=1 src="http://us.adserver.yahoo.com/l?M=#26/D=yahoo/S=:LC2/A=1234567/rand=622395248">
                              </div>
        <div class="ad" style="color:#628C2A; font-family:Arial; font-weight:bold;">
                      <script type='text/javascript'>document.write('<a href="https://us.y.atwola.com/?adlink|5113.1|221794|0|16|AdId=-3;BnId=0;itime=440914483;kvmn=y100000;kvssp=brxd;kvpgcolo=bf1;kvadtc%5Fdvmktname=unknown;kvadtc%5Fdvosplt=unknown;kvadtc%5Fdvbrand=unknown;kvadtc%5Fdvtype=unknown;kvadtc%5Fdvmodel=unknown;kvrepo%5Fdvosplt=unknown;kvadtc%5Fdvosversion=UNKNOWN;kvadtc%5Fcrbrand=wifi%5Fus;kvadtc%5Fcrmcc=UNKNOWN;kvadtc%5Fcrmnc=UNKNOWN;kvadtc%5Fcrcountry=us;kvadtc%5Fcontype=wifi;gdpr=0;adclntid=1004;spaceid=1709335002;" target=_top><img src="https://aka-cdn.adtechus.com/images/ATCollapse.gif" border=0 alt="AOL Ad" width="1" height="1" ></a>');
  
</script>
<!--Pointguard Diagnostic Start {"FAC3.0":{
"FAC IP" : "98.139.229.162",
"AdPosition Name" : "LC3",
"sapyECPM" : "0",
"gemniECPM" : "0",
"oneMobileECPM" : "0",
"gd2NetCpm" : "0",
"issapyEmpty" : "true",
"SapyAdSize" : "",
"SapyCustomSection" : "",
"SapyUrl" : "",
" SapyFedStatus" : "federation is not configured for ad slot",
" FedStatus" : "federation is not configured for ad slot"
}-->                          <img alt="" width=1 height=1 src="http://us.adserver.yahoo.com/l?M=#26/D=yahoo/S=:LC3/A=1234567/rand=400924775">
                              </div>
      </div>
    </div>
    
<!-- |**|end egp html banner|**| -->

  

  </div>   <!-- |**|end egp html banner|**| -->

  <div style="clear:both; color: #FFF; font-size:1px;">.</div>
</div>

  <img src="http://geo.yahoo.com/serv?s=97359714/grpId=2489639/grpspId=1709335002/msgId=9971/stime=1543440913/nc1=1234567/nc2=2/nc3=3" width="1" height="1"> <br>

<img src="http://y.analytics.yahoo.com/fpc.pl?ywarid=515FB27823A7407E&a=10001310322279&js=no&resp=img&cf12=CP" width="1" height="1"> 

<div style="color: #fff; height: 0;">__,_._,___</div>
<!--~-|**|PrettyHtmlEnd|**|-~-->

</body>

<!--~-|**|PrettyHtmlStart|**|-~-->
<head>
  <style type="text/css">
  <!--
  #ygrp-mkp {
  border: 1px solid #d8d8d8;
  font-family: Arial;
  margin: 10px 0;
  padding: 0 10px;
}

#ygrp-mkp hr {
  border: 1px solid #d8d8d8;
}

#ygrp-mkp #hd {
  color: #628c2a;
  font-size: 85%;
  font-weight: 700;
  line-height: 122%;
  margin: 10px 0;
}

#ygrp-mkp #ads {
  margin-bottom: 10px;
}

#ygrp-mkp .ad {
  padding: 0 0;
}

#ygrp-mkp .ad p {
  margin: 0;
}

#ygrp-mkp .ad a {
  color: #0000ff;
  text-decoration: none;
}
  #ygrp-sponsor #ygrp-lc {
  font-family: Arial;
}

#ygrp-sponsor #ygrp-lc #hd {
  margin: 10px 0px;
  font-weight: 700;
  font-size: 78%;
  line-height: 122%;
}

#ygrp-sponsor #ygrp-lc .ad {
  margin-bottom: 10px;
  padding: 0 0;
}

  #actions {
    font-family: Verdana;
    font-size: 11px;
    padding: 10px 0;
  }

  #activity {
    background-color: #e0ecee;
    float: left;
    font-family: Verdana;
    font-size: 10px;
    padding: 10px;
  }

  #activity span {
    font-weight: 700;
  }

  #activity span:first-child {
    text-transform: uppercase;
  }

  #activity span a {
    color: #5085b6;
    text-decoration: none;
  }

  #activity span span {
    color: #ff7900;
  }

  #activity span .underline {
    text-decoration: underline;
  }

  .attach {
    clear: both;
    display: table;
    font-family: Arial;
    font-size: 12px;
    padding: 10px 0;
    width: 400px;
  }

  .attach div a {
    text-decoration: none;
  }

  .attach img {
    border: none;
    padding-right: 5px;
  }

  .attach label {
    display: block;
    margin-bottom: 5px;
  }

  .attach label a {
    text-decoration: none;
  }
  
  blockquote {
    margin: 0 0 0 4px;
  }

  .bold {
    font-family: Arial;
    font-size: 13px;
    font-weight: 700;
  }

  .bold a {
    text-decoration: none;
  }

  dd.last p a {
    font-family: Verdana;
    font-weight: 700;
  }

  dd.last p span {
    margin-right: 10px;
    font-family: Verdana;
    font-weight: 700;
  }

  dd.last p span.yshortcuts {
    margin-right: 0;
  }

  div.attach-table div div a {
    text-decoration: none;
  }

  div.attach-table {
    width: 400px;
  }

  div.file-title a, div.file-title a:active, div.file-title a:hover, div.file-title a:visited {
    text-decoration: none;
  }

  div.photo-title a, div.photo-title a:active, div.photo-title a:hover, div.photo-title a:visited {
    text-decoration: none;
  }

  div#ygrp-mlmsg #ygrp-msg p a span.yshortcuts {
    font-family: Verdana;
    font-size: 10px;
    font-weight: normal;
  }

  .green {
    color: #628c2a;
  }

  .MsoNormal {
    margin: 0 0 0 0;
  }

  o {
    font-size: 0;
  }

  #photos div {
    float: left;
    width: 72px;
  }

  #photos div div {
    border: 1px solid #666666;
    height: 62px;
    overflow: hidden;
    width: 62px;
  }

  #photos div label {
    color: #666666;
    font-size: 10px;
    overflow: hidden;
    text-align: center;
    white-space: nowrap;
    width: 64px;
  }

  #reco-category {
    font-size: 77%;
  }

  #reco-desc {
    font-size: 77%;
  }

  .replbq {
    margin: 4px;
  }

  #ygrp-actbar div a:first-child {
   /* border-right: 0px solid #000;*/
    margin-right: 2px;
    padding-right: 5px;
  }

  #ygrp-mlmsg {
    font-size: 13px;
    font-family: Arial, helvetica,clean, sans-serif;
    *font-size: small;
    *font: x-small;
  }

  #ygrp-mlmsg table {
    font-size: inherit;
    font: 100%;
  }

  #ygrp-mlmsg select, input, textarea {
    font: 99% Arial, Helvetica, clean, sans-serif;
  }

  #ygrp-mlmsg pre, code {
    font:115% monospace;
    *font-size:100%;
  }

  #ygrp-mlmsg * {
    line-height: 1.22em;
  }

  #ygrp-mlmsg #logo {
    padding-bottom: 10px;
  }


  #ygrp-msg p a {
    font-family: Verdana;
  }

  #ygrp-msg p#attach-count span {
    color: #1E66AE;
    font-weight: 700;
  }

  #ygrp-reco #reco-head {
    color: #ff7900;
    font-weight: 700;
  }

  #ygrp-reco {
    margin-bottom: 20px;
    padding: 0px;
  }

  #ygrp-sponsor #ov li a {
    font-size: 130%;
    text-decoration: none;
  }

  #ygrp-sponsor #ov li {
    font-size: 77%;
    list-style-type: square;
    padding: 6px 0;
  } 

  #ygrp-sponsor #ov ul {
    margin: 0;
    padding: 0 0 0 8px;
  }

  #ygrp-text {
    font-family: Georgia;
  }

  #ygrp-text p {
    margin: 0 0 1em 0;
  }

  #ygrp-text tt {
    font-size: 120%;
  }

  #ygrp-vital ul li:last-child {
    border-right: none !important; 
  } 
  -->
  </style>
</head>

<!--~-|**|PrettyHtmlEnd|**|-~-->
</html>
<!-- end group email -->


--IPJuqE-eNKO4bv0MI9ZYi0mo8Eu0XsHqGbi4pij--