[Tutor] problem solving with lists

Dennis Lee Bieber wlfraed at ix.netcom.com
Fri Mar 18 13:56:00 EDT 2022


On Fri, 18 Mar 2022 18:21:19 +0100, <marcus.luetolf at bluewin.ch> declaimed
the following:

	Since the OP appears to be conducting a private email conversation with
Mr. Gauld -- having never even acknowledged any other posts provided by
others -- I'm going to do something I normally wouldn't on the basis that
the OP probably won't notice this post either

	Provide my working code! Both versions... (though I see my comments are
a bit out of date -- current code is parameterized rather than hard-coded
to particular lengths)

*****	Assumption: common pairs are ADJACENT letters
"""
        letters.py              based upon a homework question on tutor
list
        dennis l bieber         march 18 2022

        a blend of the original sixteen_letters.py and ooREXX letters.rex

        This version interprets "common pairs" to mean "adjacent" letters
"""

import sys
import string
from itertools import combinations, filterfalse 
import pprint

LETTERS = string.ascii_lowercase

accepted = []   #accumlate good item strings here
def theFilter(item):
    """
        Returns False (accepted) if no adjacent letter pair
        in item is IN any previously accepted item
    """
    rc = False   #assume item will  be accepted
    item = "".join(sorted(item))
    for aitem in accepted:
        for pairx in range(len(item) - 1):
            if item[pairx:pairx+2] in aitem:
                #reject this item, don't test other items
                rc = True
                break
        if rc: break
    return rc

def main(pool_len, item_len):
    #generator of four-letter substrings, then generator of filtered
    items = combinations(LETTERS[:pool_len], item_len)
    itemFilter = filterfalse(theFilter, items)

    #generator unfortunately returns tuples, not strings
    #also, accepted is "global", theFilter reads it
    for item in itemFilter:
        accepted.append("".join(sorted(item)))

    return accepted #even though a global item



if __name__ == "__main__":
    if len(sys.argv) < 3:
        print("\n***\tUsage: letters.py pool_length item_length\n")
    else:
        accepted = main(int(sys.argv[1]), int(sys.argv[2]))
        print("\nAccepted Items: %s" % len(accepted))
        answer = [accepted[i*4:i*4+4] for i in
                  range(round(len(accepted) / 5 + 0.5) + 1)]
        pprint.pp(answer)
-=-=-

*****	Assumption: common pairs are set intersection
"""
        letters_set.py              based upon a homework question on tutor
list
        dennis l bieber         march 18 2022

        a blend of the original sixteen_letters.py and ooREXX letters.rex

        This version interprets "common pairs" to mean "set intersection"
"""

import sys
import string
from itertools import combinations, filterfalse 
import pprint

LETTERS = string.ascii_lowercase

accepted = []   #accumlate good item strings here
def theFilter(item):
    """
        Returns False (accepted) if no adjacent letter pair
        in item is IN any previously accepted item
    """
    rc = False   #assume item will  be accepted
    #not optimized -- should save set() in accepted
    #rather than continually converting
    item = set(item)
    for aitem in accepted:
        if len(item & set(aitem)) >= 2:
            #reject this item, don't test other items
            rc = True
            break
    return rc

def main(pool_len, item_len):
    #generator of four-letter substrings, then generator of filtered
    items = combinations(LETTERS[:pool_len], item_len)
    itemFilter = filterfalse(theFilter, items)

    #generator unfortunately returns tuples, not strings
    #also, accepted is "global", theFilter reads it
    for item in itemFilter:
        accepted.append("".join(sorted(item)))

    return accepted #even though a global item



if __name__ == "__main__":
    if len(sys.argv) < 3:
        print("\n***\tUsage: letters_set.py pool_length item_length\n")
    else:
        accepted = main(int(sys.argv[1]), int(sys.argv[2]))
        print("\nAccepted Items: %s" % len(accepted))
        answer = [accepted[i*4:i*4+4] for i in
                  range(round(len(accepted) / 5 + 0.5))]
        pprint.pp(answer)
-=-=-


-- 
	Wulfraed                 Dennis Lee Bieber         AF6VN
	wlfraed at ix.netcom.com    http://wlfraed.microdiversity.freeddns.org/



More information about the Tutor mailing list