s.zain
s.zain

Reputation: 33

For loop in CS Circles section 7C coding exercise: One Triangle

Here is an example of a for loop inside another for loop.

Example This code prints a 5×5 square of ones.
Note: when we multiply a number X by ten and add one, we're essentially putting an extra 1 digit at the end of X. For example, (1867*10)+1=18671.

for i in range(0, 5):
  X = 0
  for j in range(0, 5):
    X = (X*10)+1
  print(X)

Modify the previous program in two ways. First, instead of a square, make it draw a triangle shaped like this: ◤. Second, instead of always having 5 lines, it should take the desired size as input from input(). For example, if the input is 3, then the output should be

111
11
1

So far the code that I have got is:

X=input()
for i in range(0, 3):
   X = 0
for j in range(0, 3):
   X = (X*10)+1
   print(X)

However this code outputs:

1
11
111

When the expected output should be:

111
11
1

I can't seem to figure out how to change my code that I have so far to get the expected output?

Upvotes: 3

Views: 6249

Answers (6)

Allan Cao
Allan Cao

Reputation: 11

The easiest way is to use the following code;

p = int(input())
for i in range(0,p):
    x = 0
    for j in range(i,p):
        x = (x*10)+1
    print(x)

Upvotes: 0

TheMirsinho
TheMirsinho

Reputation: 11

Here's the solution:

n=int(input()) 
for i in range(0, n):
    X = 0
    for j in range(0, n-i):
        X = (X*10)+1
    print(X) 

Upvotes: 1

Isztvan
Isztvan

Reputation: 1

If you are doing CS Circles than these other answers probably contain code you still haven't come in contact with, at least I haven't, so I'll try to explain it with the knowledge I've gathered so far (couple weeks doing CS Circles).

You are ignoring the first loop and it is where your answer lies. Notice that if you put the print command outside of the loop body it would just output:

111 

That it because your second loop is not in the body of the first, so python just loops the first one 3x and than moves to the second loop. Instead it should be:

for i in range(0, 3):
    X = 0
    for j in range (0, 3):
        X = (X*10)+1
    print(X) 

Now the program outputs:

111
111
111 

But you want one less digit each time print is called again. This is achieved by subtracting the value of "i" (since it neatly goes from 0 to 2) from second loop's range tail value. So now you have :

for i in range(0, 3):
    X = 0
    for j in range(0, 3-i):
        X = (X*10)+1)
    print(X) 

Finally the output is:

111
11
1 

Protip: use the visualizer in CS Circles, it helps you better understand the way code is executed in python, and can provide insight to your problems. Best of luck!

Upvotes: 0

dsgdfg
dsgdfg

Reputation: 1520

This can solve the problem for you:

def test(X,_range):
    x = X
    for j in range(0, _range):
        print int(str((x*10) +1) + ("1"*(_range-1-j)))

test(0,3)
>>> 
111
11
1
>>>

In every loop step the number starts with (X*10)+1
In the next step X has changed and you add the digit 1 to the right side
If want to reverse it, you need to use ("1"*(_range-1-j))

The for iterator changes the X content every step. (he don't use i and j, "For" only for step derivation )

Upvotes: 1

SuperBiasedMan
SuperBiasedMan

Reputation: 9969

This block is very confusing, here's what happens:

X=input()

Get value of X from input.

for i in range(0, 3):
   X = 0

Now set the value of X to 0 three times (overwriting your input)

for j in range(0, 3):
   X = (X*10)+1
   print(X)

Now X is being set to 1, then 11 and then 111.

Even if you meant to nest the for loops, this wont behave right. Instead, you want to get the i value to loop backwards, using the slice operator [::-1]. You should then make j's range be zero to i.

You'll also need to compensate by increasing the value of both numbers in i's range (otherwise the last line will be a zero) but this will work:

for i in range(1, 6)[::-1]:
    X = 0
    for j in range(0, i):
        X = (X*10)+1
    print(X)

Note that I moved the print out of the j loop, as that wasn't how the original code was (and generated the wrong output), pay attention to whitespace. Using 4 spaces is preferable to just 2 for reasons like this.

Upvotes: 0

Rishi
Rishi

Reputation: 131

As you said, 10*X + 1 means putting extra 1 at the end of X. You need an inverse operation: how to remove the last digit of a number. Hint: integer division. Google "python integer division" to get to pages such as Python integer division yields float.

So, then all you've to do is construct 111...11 of the right length, and then iteratively print and remove digits one by one.

Upvotes: 0

Related Questions