[reportlab-users] code128.py

Klaas Feenstra klaas at feenstra.es
Mon Jan 4 19:13:45 EST 2016


Robin, I made a little modification and I think this is now working
correctly.

def _trailingDigitsToC(self, l):
        # Optimization: trailing digits -> set C double-digits

        i = 0
        nl = []
        while i < len(l):
                startpos = i
                rl = []
                savings = -1 # the TO_C costs one character
                while i < len(l):
                        if l[i] in (['START_B','TO_A','TO_B']):
                                j = i
                                break
                        elif l[i] == '\xf1':
                                rl.append(l[i])
                                i += 1
                                continue
                        elif len(l[i]) == 1 and l[i] in digits \
                         and len(l[i+1]) == 1 and l[i+1] in digits:
                                rl.append(l[i] + l[i+1])
                                i += 2
                                savings += 1
                                continue
                        else:
                                break

                ta = not (l[i]=='STOP' or j==i)
                if savings > int(ta) or savings > (startpos-1): #In case of
starting with C
                        nl += ['TO_C']+rl
                        if ta:
                                nl.append('TO'+l[j][-2:])
                        nl.append(l[i])
                else:
                        nl += l[startpos:i+1]
                i += 1
        return nl

On Tue, Jan 5, 2016 at 12:21 AM, Klaas Feenstra <klaas at feenstra.es> wrote:

> Hi Robin,
>
> Yes, your code is working better, but is also not correct. Try the next:
> 'START_B xf1 1 2 3 4 b STOP' (8)
> should be
> 'START_B TO_C xf1 12 34 TO_B b STOP' (8), but in the function encode
>
>         # Finally, replace START_X,TO_Y with START_Y
>         if l[1] in tos:
>             l[:2] = ['START_' + l[1][-1]]
>
> this will be transformed to
> 'START_C xf1 12 34 TO_B b STOP' (7)
>
>
>
> On Mon, Jan 4, 2016 at 3:04 PM, Robin Becker <robin at reportlab.com> wrote:
>
>> Hi Klaas,
>>
>> had a chance to look at this code and figured out you're doing a forward
>> pass over the translated sets.
>>
>> Nothing terribly wrong with the code, but I did come to the conclusion
>> that we might be missing something related to the actual optimality
>>
>>
>> I ran this code as a test
>>
>> ttdigskf.py
>>
>> rom string import digits
>>
>> def _trailingDigitsToC(self, l):
>>         # Optimization: trailing digits -> set C double-digits
>>
>>         i = 0
>>         nl = []
>>         while i < len(l):
>>                 startpos = i
>>                 rl = ['TO_C']
>>                 savings = -1 # the TO_C costs one character
>>                 while i < len(l):
>>                         if l[i] in (['START_B','TO_A','TO_B']):
>>                                 set = 'TO' + l[i][-2:]
>>                                 break
>>                         elif l[i] == '\xf1':
>>                                 rl.append(l[i])
>>                                 i += 1
>>                                 continue
>>                         elif len(l[i]) == 1 and l[i] in digits \
>>                          and len(l[i+1]) == 1 and l[i+1] in digits:
>>                                 rl.append(l[i] + l[i+1])
>>                                 i += 2
>>                                 savings += 1
>>                                 continue
>>                         else:
>>                                 break
>>
>>                 if savings > 0:
>>                         nl = nl + rl
>>                         if not l[i]=='STOP':
>>                                 nl.append(set)
>>                         nl.append(l[i])
>>                 else:
>>                         nl = nl + l[startpos:i+1]
>>                 i += 1
>>         return nl
>>
>> for x,l in enumerate((
>>                 'START_B b b b b 1 2 3 4 5 6 b b b STOP',
>>                 'START_B b b b b 1 2 3 4 5 b b b STOP',
>>                 'START_B b b b b 1 2 3 4 b b b STOP',
>>                 'START_B b b b b 1 2 3 b b b STOP',
>>                 'START_B b b b b 1 2 b b b STOP',
>>                 'START_B b b b b 1 b b b STOP',
>>                 'START_B b b b b 1 2 3 4 5 6 TO_A a a STOP',
>>                 'START_B b b b b 1 2 3 4 TO_A a a STOP',
>>                 'START_B b b b b 1 2 3 TO_A a a STOP',
>>                 'START_B b b b b 1 2 TO_A a a STOP',
>>                 'START_B b b b b 1 TO_A a a STOP',
>>                 'START_B b b b b 1 2 3 4 5 6 STOP',
>>                 'START_B b b b b 1 2 3 4 5 STOP',
>>                 'START_B b b b b 1 2 3 4 STOP',
>>                 'START_B b b b b 1 2 3 STOP',
>>                 'START_B b b b b 1 2 STOP',
>>                 'START_B b b b b 1 STOP',
>>                 )):
>>         l = l.split()
>>         lo = _trailingDigitsToC(None, l)
>>         print '%2d: %s(%d) --> %s(%d)' % (x,' '.join(l),len(l),'
>> '.join(lo),len(lo))
>>
>> result is
>>
>> C:\code\hg-repos\reportlab>tmp\ttdigskf.py
>>  0: START_B b b b b 1 2 3 4 5 6 b b b STOP(15) --> START_B b b b b TO_C
>> 12 34 56 TO_B b b b STOP(14)
>>  1: START_B b b b b 1 2 3 4 5 b b b STOP(14) --> START_B b b b b TO_C 12
>> 34 TO_B 5 b b b STOP(14)
>>  2: START_B b b b b 1 2 3 4 b b b STOP(13) --> START_B b b b b TO_C 12 34
>> TO_B b b b STOP(13)
>>  3: START_B b b b b 1 2 3 b b b STOP(12) --> START_B b b b b 1 2 3 b b b
>> STOP(12)
>>  4: START_B b b b b 1 2 b b b STOP(11) --> START_B b b b b 1 2 b b b
>> STOP(11)
>>  5: START_B b b b b 1 b b b STOP(10) --> START_B b b b b 1 b b b STOP(10)
>>  6: START_B b b b b 1 2 3 4 5 6 TO_A a a STOP(15) --> START_B b b b b
>> TO_C 12 34 56 TO_A TO_A a a STOP(14)
>>  7: START_B b b b b 1 2 3 4 TO_A a a STOP(13) --> START_B b b b b TO_C 12
>> 34 TO_A TO_A a a STOP(13)
>>  8: START_B b b b b 1 2 3 TO_A a a STOP(12) --> START_B b b b b 1 2 3
>> TO_A a a STOP(12)
>>  9: START_B b b b b 1 2 TO_A a a STOP(11) --> START_B b b b b 1 2 TO_A a
>> a STOP(11)
>> 10: START_B b b b b 1 TO_A a a STOP(10) --> START_B b b b b 1 TO_A a a
>> STOP(10)
>> 11: START_B b b b b 1 2 3 4 5 6 STOP(12) --> START_B b b b b TO_C 12 34
>> 56 STOP(10)
>> 12: START_B b b b b 1 2 3 4 5 STOP(11) --> START_B b b b b TO_C 12 34
>> TO_B 5 STOP(11)
>> 13: START_B b b b b 1 2 3 4 STOP(10) --> START_B b b b b TO_C 12 34
>> STOP(9)
>> 14: START_B b b b b 1 2 3 STOP(9) --> START_B b b b b 1 2 3 STOP(9)
>> 15: START_B b b b b 1 2 STOP(8) --> START_B b b b b 1 2 STOP(8)
>> 16: START_B b b b b 1 STOP(7) --> START_B b b b b 1 STOP(7)
>>
>> where clearly something is wrong with #6, #7  (TO_A duplicated) and #2,
>> #12 switches to C without a net gain (because we needed a TO_B to go back).
>>
>> I changed the algorithm slightly to avoid doing some work early and this
>> version appears to work slightly better
>>
>> def _trailingDigitsToC(self, l):
>>         # Optimization: trailing digits -> set C double-digits
>>
>>         i = 0
>>         nl = []
>>         while i < len(l):
>>                 startpos = i
>>                 rl = []
>>                 savings = -1 # the TO_C costs one character
>>                 while i < len(l):
>>                         if l[i] in (['START_B','TO_A','TO_B']):
>>                                 j = i
>>                                 break
>>                         elif l[i] == '\xf1':
>>                                 rl.append(l[i])
>>                                 i += 1
>>                                 continue
>>                         elif len(l[i]) == 1 and l[i] in digits \
>>                          and len(l[i+1]) == 1 and l[i+1] in digits:
>>                                 rl.append(l[i] + l[i+1])
>>                                 i += 2
>>                                 savings += 1
>>                                 continue
>>                         else:
>>                                 break
>>
>>                 ta = not (l[i]=='STOP' or j==i)
>>                 if savings > int(ta):
>>                         nl += ['TO_C']+rl
>>                         if ta:
>>                                 nl.append('TO'+l[j][-2:])
>>                         nl.append(l[i])
>>                 else:
>>                         nl += l[startpos:i+1]
>>                 i += 1
>>         return nl
>>
>>
>> if I use that then the tests show this
>>
>> C:\code\hg-repos\reportlab>tmp\ttdigs.py
>>  0: START_B b b b b 1 2 3 4 5 6 b b b STOP(15) --> START_B b b b b TO_C
>> 12 34 56 TO_B b b b STOP(14)
>>  1: START_B b b b b 1 2 3 4 5 b b b STOP(14) --> START_B b b b b 1 2 3 4
>> 5 b b b STOP(14)
>>  2: START_B b b b b 1 2 3 4 b b b STOP(13) --> START_B b b b b 1 2 3 4 b
>> b b STOP(13)
>>  3: START_B b b b b 1 2 3 b b b STOP(12) --> START_B b b b b 1 2 3 b b b
>> STOP(12)
>>  4: START_B b b b b 1 2 b b b STOP(11) --> START_B b b b b 1 2 b b b
>> STOP(11)
>>  5: START_B b b b b 1 b b b STOP(10) --> START_B b b b b 1 b b b STOP(10)
>>  6: START_B b b b b 1 2 3 4 5 6 TO_A a a STOP(15) --> START_B b b b b
>> TO_C 12 34 56 TO_A a a STOP(13)
>>  7: START_B b b b b 1 2 3 4 TO_A a a STOP(13) --> START_B b b b b TO_C 12
>> 34 TO_A a a STOP(12)
>>  8: START_B b b b b 1 2 3 TO_A a a STOP(12) --> START_B b b b b 1 2 3
>> TO_A a a STOP(12)
>>  9: START_B b b b b 1 2 TO_A a a STOP(11) --> START_B b b b b 1 2 TO_A a
>> a STOP(11)
>> 10: START_B b b b b 1 TO_A a a STOP(10) --> START_B b b b b 1 TO_A a a
>> STOP(10)
>> 11: START_B b b b b 1 2 3 4 5 6 STOP(12) --> START_B b b b b TO_C 12 34
>> 56 STOP(10)
>> 12: START_B b b b b 1 2 3 4 5 STOP(11) --> START_B b b b b 1 2 3 4 5
>> STOP(11)
>> 13: START_B b b b b 1 2 3 4 STOP(10) --> START_B b b b b TO_C 12 34
>> STOP(9)
>> 14: START_B b b b b 1 2 3 STOP(9) --> START_B b b b b 1 2 3 STOP(9)
>> 15: START_B b b b b 1 2 STOP(8) --> START_B b b b b 1 2 STOP(8)
>> 16: START_B b b b b 1 STOP(7) --> START_B b b b b 1 STOP(7)
>>
>> what do you think?
>> --
>> Robin Becker
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://pairlist2.pair.net/pipermail/reportlab-users/attachments/20160105/a797311b/attachment-0001.html>


More information about the reportlab-users mailing list