1

A friend of mine told me that she needs help with some homework, I owe her a favor so I said fine, why not. she needed help with a program that checks a sequence, if the sequence is made of the same 2 chars one after the other it will print "yes" (for example "ABABABAB" or "3$3$3$3:) The program works fine with even length strings (for example "abab") but not with odd length one ("ububu")

I made the code messy and "bad" in purpose, computers is her worst subject so I don't want it to look obvious that someone else wrote the code

the code -

def main():
    StringInput = input('your string here - ')
    GoodOrBad = True
    L1 = StringInput[0]
    L2 = StringInput[1]
    i = 0
    while i <= len(StringInput):
        if i % 2 == 0:
            if StringInput[i] == L1:
                i = i + 1
            else:
                GoodOrBad = False
                break
        if i % 2 != 0:
            if StringInput[i] == L2:
                i = i + 1
            else:
                GoodOrBad = False
                break


    if GoodOrBad == True:
        print("yes")
    elif GoodOrBad != True:
        print("no")

main()

I hope someone will spot the problem, thanks you if you read everything :)

1
  • 2
    "program doesn't work" is a poor description. Show us what the program actually does (including sample input and output), and explain how that isn't what you wanted. Commented May 25, 2020 at 19:26

5 Answers 5

1

How about (assuming s is your string):

len(set(s[::2]))==1 & len(set(s[1::2]))==1 

It checks that there is 1 char in the even locations, and 1 char in the odd locations.

Sign up to request clarification or add additional context in comments.

Comments

1

a) Showing your friend bad and messy code makes her hardly a better programmer. I suggest that you explain to her in a way that she can improve her programming skills.

b) If you check for the character at the even position and find that it is good, you increment i. After that, you check if i is odd (which it is, since you found a valid character at the even position), you check if the character is valid. Instead of checking for odd position, an else should do the trick.

Comments

1

You can do this using two methods-> O(n)-

def main():
    StringInput = input('your string here - ')
    GoodOrBad = True
    L1 = StringInput[0]
    L2 = StringInput[1]
    i = 2
    while i < len(StringInput):
        l=StringInput[i]
        if(l==StringInput[i-2]):
            GoodOrBad=True
        else:
            GoodOrBad=False
        i+=1
    if GoodOrBad == True:
        print("yes")
    elif GoodOrBad == False:
        print("no")
main()

Another method-> O(1)-

def main():
    StringInput = input('your string here - ')
    GoodOrBad = True
    L1 = set(StringInput[0::2])
    L2 = set(StringInput[1::2])
    if len(L1)==len(L2):
        print("yes")
    else:
        print("no")

main()

Comments

1

There is a lot in this that I would change, but I am just showing the minimal changes to get it to work. There are 2 issues.

You have an off by one error in the code:

i = 0
while i <= len(StringInput):
    # in the loop you index into StringInput
    StringInput[i]

Say you have 5 characters in StringInput. Because your while loop is going from i = 0 to i < = len(StringInput), it is going to go through the values [0, 1, 2, 3, 4, 5]. That last index is a problem since it is off the end off StringInput.

It will throw a 'string index out of range' exception.

You need to use:

while i < len(StringInput)

You also need to change the second if to an elif (actually it could just be an else, but...) so you do not try to test both in the same pass of the loop. If you go into the second if after the last char has been tested in the first if it will go out of range again.

    elif i % 2 != 0:

So the corrected code would be:

def main():
    StringInput = input('your string here - ')
    GoodOrBad = True
    L1 = StringInput[0]
    L2 = StringInput[1]
    i = 0
    while i < len(StringInput):
        if i % 2 == 0:
            if StringInput[i] == L1:
                i = i + 1
            else:
                GoodOrBad = False
                break
        elif i % 2 != 0:
            if StringInput[i] == L2:
                i = i + 1
            else:
                GoodOrBad = False
                break


    if GoodOrBad == True:
        print("yes")
    elif GoodOrBad != True:
        print("no")

main()

Comments

0
def main():
    StringInput = input('your string here - ')

    MaxLength = len(StringInput) // 2 + (len(StringInput) % 2 > 0)
    start = StringInput[:2]
    chained = start * MaxLength

    GoodOrBad = chained[:len(StringInput)] == StringInput

    if GoodOrBad == True:
        print("yes")
    elif GoodOrBad != True:
        print("no")

I believe this does what you want. You can make it messier if this isn't bad enough.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.