#1
  1. No Profile Picture
    Registered User
    Devshed Newbie (0 - 499 posts)

    Join Date
    Sep 2013
    Posts
    3
    Rep Power
    0

    Hopelessly stuck, please shed some light


    Guys heres my problem:

    I am trying to read an integer from the user(e.g. 12345)

    How can i check if the pattern "34" exists in the first integer?

    My constraint is that i cannot convert it to string and cannot use arrays.

    Here is what i managed to write to print some of the patterns that exists in 12345:

    import math

    int1 = int(input("input an integer: "))

    #I used this to find out how many digits are in the integer
    count = math.ceil(math.log10(int1))

    for i in range(count):
    print (int1 % (10 ** (i+1)))
    print (int1 // (10 ** (i+1)))
  2. #2
  3. No Profile Picture
    Contributing User
    Devshed Novice (500 - 999 posts)

    Join Date
    May 2009
    Posts
    510
    Rep Power
    33
    To work with integers only you have to use some form of divide by 10 to strip off each digit and then search for 4 then 3 since the digitis are the lowest significant digit .
    Code:
    int1=12345
    prev=0
    while int1:   ## same as while int1 != 0
        int1, remain = divmod(int1, 10)
        print int1, remain
        if prev==4 and remain==3:
            print "     FOUND"
        prev = remain
    Last edited by dwblas; September 12th, 2013 at 12:29 PM.
  4. #3
  5. Contributing User
    Devshed Demi-God (4500 - 4999 posts)

    Join Date
    Aug 2011
    Posts
    4,905
    Rep Power
    481
    The builtin divmod function computes quotient and remainder together. Your approach is fine. Save the digits in an array, then use pattern matching.

    spoiler. Note that I wrote the tests first, and relied on them. There are fewer bugs than if I had used no tests.

    14


    13


    12


    11


    10


    9


    8


    7


    6


    5


    4


    3


    2


    1


    0

    Code:
    # python3 code.  Look for ->bool
    
    def antibase(quotient, divisor=10):
        '''
            >>. antibase(9)
    	[0]
    	>>> antibase(415)
    	[4, 1, 5]
        '''
        if (not isinstance(quotient, int)) or (quotient < 0):
    	raise ValueError("lazy programmer won't write good code")
        if not quotient:
    	return [0]
        result = []
        while quotient:  # I liked ceil(log10(    This is another way.
    	(quotient, remainder,) = divmod(quotient, divisor)
    	result.append(remainder)
        return list(reversed(result))
    
    def digits_in(pattern, search_me, base=10)->bool:
        '''
            return True iff the pattern appears in search_me
    
    	>>> [digits_in(34, a) for a in (12345, 4443321087, 34, 0)]
    	[True, False, True, False]
        '''
        p = antibase(pattern, base)
        s = antibase(search_me, base)
        # next comes a crumby pattern matching algorithm.
        L = len(p)
        for i in range(len(s)):
    	if p == s[i:i+L]:
    	    return True
        return False
    [code]Code tags[/code] are essential for python code and Makefiles!
  6. #4
  7. No Profile Picture
    Registered User
    Devshed Newbie (0 - 499 posts)

    Join Date
    Sep 2013
    Posts
    3
    Rep Power
    0
    thank you very much guys, btw i did some thinking and came up with this, now i got a new problem

    Code:
    import math
    def algorithm(y,z):
        count = math.ceil(math.log10(y))
        count2 = math.ceil(math.log10(z))
        x = 10 ** count2
        counter = 0
        for i in range(count):
            if (y // (10 ** i)) % x == z:
                print("Matched at position ",i)
                counter += 1
        
        if counter == 0:
            print("Did not find any match")
        
        print("End: found ",counter," matches")
    
    #Part 1: ask user to input 2 integers, second one must be shorter than the first
    #there should also be no zeros in the integers
    
    haystack = int(input("input a positive longer integer: "))
    needle = int(input("input a positive shorter integer: "))
    
    algorithm(haystack, needle)
    When I input the longer integer 12312121234123123 and the shorter integer 123, I got this output:

    >>>
    input a positive longer integer: 12312121234123123
    input a positive shorter integer: 123
    Matched at position 0
    Matched at position 3
    Matched at position 7
    Matched at position 14
    End: found 4 matches

    What I need it to do is print out the position of the shorter integer in the longer integer from the left to right (12312121234123123), as you guys can see here, it is matching from the right to the left.
    12312121234123123

    input a positive longer integer: 12312121234123123
    input a positive shorter integer: 123
    Matched at position 0
    Matched at position 7
    Matched at position 11
    Matched at position 14
    End: found 4 matches
  8. #5
  9. No Profile Picture
    Registered User
    Devshed Newbie (0 - 499 posts)

    Join Date
    Sep 2013
    Posts
    3
    Rep Power
    0
    Originally Posted by b49P23TIvg
    The builtin divmod function computes quotient and remainder together. Your approach is fine. Save the digits in an array, then use pattern matching.

    spoiler. Note that I wrote the tests first, and relied on them. There are fewer bugs than if I had used no tests.

    14


    13


    12


    11


    10


    9


    8


    7


    6


    5


    4


    3


    2


    1


    0

    Code:
    # python3 code.  Look for ->bool
    
    def antibase(quotient, divisor=10):
        '''
            >>. antibase(9)
    	[0]
    	>>> antibase(415)
    	[4, 1, 5]
        '''
        if (not isinstance(quotient, int)) or (quotient < 0):
    	raise ValueError("lazy programmer won't write good code")
        if not quotient:
    	return [0]
        result = []
        while quotient:  # I liked ceil(log10(    This is another way.
    	(quotient, remainder,) = divmod(quotient, divisor)
    	result.append(remainder)
        return list(reversed(result))
    
    def digits_in(pattern, search_me, base=10)->bool:
        '''
            return True iff the pattern appears in search_me
    
    	>>> [digits_in(34, a) for a in (12345, 4443321087, 34, 0)]
    	[True, False, True, False]
        '''
        p = antibase(pattern, base)
        s = antibase(search_me, base)
        # next comes a crumby pattern matching algorithm.
        L = len(p)
        for i in range(len(s)):
    	if p == s[i:i+L]:
    	    return True
        return False
    Your code is great, but I cannot use arrays, lists, strings...etc i can only use mathematics
  10. #6
  11. Contributing User
    Devshed Demi-God (4500 - 4999 posts)

    Join Date
    Aug 2011
    Posts
    4,905
    Rep Power
    481
    oops, I overlooked the "no arrays" requirement.
    Last edited by b49P23TIvg; September 13th, 2013 at 07:27 AM.
    [code]Code tags[/code] are essential for python code and Makefiles!

IMN logo majestic logo threadwatch logo seochat tools logo