Python 3.4: creating an asterisk diamond - python

so I've been trying to create a program where you prompt the user for the number of rows, and then the program prints out a diamond with input number of rows.
This is what the program is supposed to do:(image)
This is what my code looks like
def main():
ROWS = get_input()
draw_pattern(ROWS)
def get_input():
return int(input("Enter the number of rows (or -1 or -99 to quit): "))
def draw_pattern(ROWS):
if ROWS == -1 or ROWS == -99:
quit
else:
for x in range(0,(int)((ROWS/2)+1),1):
print ((int)((ROWS/2)-(2*x+1)/2)*" " + (2*x+1) * '*')
for t in range((int)(x),0,-1):
print((int)((ROWS/2)-(2*t-1)/2)*" " + (2*t-1) * '*')
main()
This is what it ends up doing:
Enter the number of rows (or -1 or -99 to quit): 7
*
***
*
*****
***
*
*******
*****
***
*
So what am I doing wrong? I assume it's something in my for loop that makes the rows not line up correctly. Can anyone give me a little help? Thanks.

I got it to work like this. (< 3 mins) (DO NOT use even numbers its going to look odd)
def main():
ROWS = get_input()
draw_pattern(ROWS)
def get_input():
return int(input("Enter the number of rows (or -1 or -99 to quit): "))
def draw_pattern(ROWS):
if ROWS == -1 or ROWS == -99:
return
else:
for x in range(1, ROWS, 2):
print(' ' * int(ROWS / 2.0 - x / 2.0) + ("*" * x))
for x in range(ROWS, 1, -2):
print(' ' * int(ROWS / 2.0 - x / 2.0) + ("*" * x))
if x != 1:
print(' ' * int(ROWS / 2.0 - 1 / 2.0) + ("*" * 1))
main()

There are many ways to do this, you can generate all the strings then print them out using formatting to center the diamond, e.g.:
>>> row = 5
>>> d = ('*' * (n if n <= row else 2*row-n) for n in range(1, 2*row, 2))
>>> for i in d:
... print('{:^{w}}'.format(i, w=row))
*
***
*****
***
*
For row = 4:
*
***
***
*

Points for obfuscation?
star = lambda rows:'\n'.join(('*'*(2*(i if i<rows//2 else rows-i-1)+1)).center(rows) for i in range(rows))
Odd
print(star(5))
*
***
*****
***
*
Even
print(star(4))
*
***
***
*

Related

print a hollow square using list comprehensions?

Trying to get the hollow square example done using list comprehensions ...
side = int(input())
for i in range(side):
for j in range(side):
print('*' if(i == 0 or i == side - 1 or j == 0 or j == side - 1) else ' ', end='')
print()
my goal is to have the nested loop also in the comprehension format but can't figure it out.
tried it like this.. but it prints out each side of the square in a one line...
side = int(input())
square= ["*" if (i == 0 or i == side - 1 or j == 0 or j == side - 1) else " " for i in range(side) for j in range(side)]
print(''.join(square),end='')
you could do it like this:
side = 5
s = "\n".join("*"+c*(side-2)+"*" for c in f"*{'*':>{side-1}}")
print(s)
*****
* *
* *
* *
*****
or let the print function provide the end of lines:
s = ["*"+c*(side-2)+"*" for c in f"*{'*':>{side-1}}"]
print(*s,sep="\n")
*****
* *
* *
* *
*****
Could be also done with the comprehension inside the print call:
side = 5
s = f"*{'*':>{side-1}}"
print(*(s.replace(' ',c) for c in s),sep="\n")
*****
* *
* *
* *
*****
or
print(*("*"+"* "[i%(n-1)>0]*(side-2)+"*" for i in range(side)),sep="\n")
*****
* *
* *
* *
*****
If you need to use nested comprehensions, you could do this:
s = [["*" if {r,c}&{0,side-1} else " " for c in range(side)]
for r in range(side)]
print(*map(''.join,s),sep="\n")
*****
* *
* *
* *
*****
Here you go
side = int(input())
s = ''.join(['{}{}'.format('*' if (i == 0 or i == side - 1 or j == 0 or j == side - 1) else ' ', '\n' if j == side - 1 else '') for i in range(side) for j in range(side)])
print(s)
This uses format() to output a possible \n if we've reached the end of a row. Format in this case works like "{}{}".format('hey', '123') --> "hey123". You could probably just append the two strings but this looks nicer IMO. The first {} in format is for the * or , the second {} is either empty '' or a newline \n. This makes it print properly.
Cool?
Using nested list comprehension:
side = int(input())
square = ''.join([''.join(["*" if (i * j == 0 or i == side - 1 or j == side - 1) else " " for i in range(side)]) + '\n' for j in range(side)])
print(square)
Prints:
5
*****
* *
* *
* *
*****

How do I print this dynamic pattern using Python?

Ask user to input an 'odd' number greater than or equal to 5 (>=5), and write a block of code to display a square using asterisks that is divided into four triangles.
See examples below to understand the behaviour of the pattern:
For example for number 5, the pattern is:
*****
** **
* * *
** **
*****
For example for number 9, the pattern is:
*********
** **
* * * *
* * * *
* * *
* * * *
* * * *
** **
*********
I tried numerous combinations of code but in vain. I am using the Python 3.7.3 version.
n = int(input("Please enter an odd number greater than or equal to 5: "))
while(n < 5 or n%2==0):
print("Invalid")
break
else:
for a in range(n):
if(a==0 or a==n-1):
print("*"*n,end='')
else:
i=1
j=n-1
for row in range(n-1):
for col in range(n-1):
if(row==i and col==j):
print("*",end="")
i=i+1
j=j-1
elif row==col:
print("*",end="")
else:
print(end="")
print()
I am clearly doing something wrong here and not getting desired output
You could do:
n = int(input("Please enter an odd number greater than or equal to 5: "))
while(n < 5 or n%2==0):
print("Invalid")
n = int(input("Please enter an odd number greater than or equal to 5: "))
x = ['*'*n] + ['*'+' '*i+'*'+' '*(n-4-i*2)+'*'+' '*i+'*' for i in range(int((n-3)/2))]
print('\n'.join(x + ['*'+' '*int((n-3)/2)+'*'+' '*int((n-3)/2)+'*'] + x[::-1]))

How to print a triangle in python?

I want to make a function to print triangle like the following picture. User can insert the row number of the triangle. The total lenght of first row is must an odd.
I try to use below code :
def triangle(n):
k = 2*n - 2
for i in range(0, n):
for j in range(0, k):
print(end=" ")
k = k - 1
for j in range(0, i+1):
print("* ", end="")
print("\r")
n = 5
triangle(n)
Here is the expected output image :
and here is my actual output image :
but I can't remove the star middle star. And it's not Upside - Down Triangle
You could try a different way.
def triangle(n) :
for i in range(1,n+1) :
for j in range(1,i) :
print (" ",end="")
for j in range(1,(n * 2 - (2 * i - 1))
+1) :
if (i == 1 or j == 1 or
j == (n * 2 - (2 * i - 1))) :
print ("*", end="")
else :
print(" ", end="")
print ("")
n = 5
triangle(n)
Not sure how cool implementation is this but it gives results:
def triangle(n):
print(' '.join(['*']*(n+2)))
s = int((n/2)+1)
for i in range(s):
star_list = [' ']*(n+2)
star_list[-i-2] = ' *'
star_list[i+1] = '*'
print(''.join(star_list))
n = 5
triangle(n)
Output:
* * * * * * *
* *
* *
*
for n = 7:
* * * * * * * * *
* *
* *
* *
*
I would try a recursive solution where you call the printTriangle() function. This way, it will print the point first and move it's way down the call stack.

Cantor set code does not give expected output

I have some bugs in cantor set code that I cannot locate. The idea is that given array of numbers you recursively remove 1/3 of middle elements and recurse on two sides and repeat until certain threshold.
Here is the code
import math
full = list(range(80))
l = list(range(80))
threshold = 2
def printl():
for i in full:
if i in l:
print("*", end='')
else:
print(" ", end='')
print()
def cantor(lo, hi):
lowi = math.ceil( (hi-lo) * 1/3 + lo)
highi = int( (hi-lo) * 2/3 + lo)
if len(l[lo:hi]) < threshold:
return
printl()
del l[lowi:highi]
cantor(lo, lowi)
cantor(lowi+1, hi)
cantor(0, len(l)-1)
I get super weird result, not sure why...
A tricky problem -- I calculated the pieces and recursively zip'd them together into an array which I then dump to the terminal:
from math import log
def cantor(length, threshold):
if length >= threshold:
sequence = cantor(length // 3, threshold)
blanks = [" " * (length // 3)] * int(log(length, 3) + 1) # estimate and let zip toss extras
return ["*" * length] + [a + b + c for a, b, c in zip(sequence, blanks, sequence)]
return []
length = 81
threshold = 1
print(*cantor(length, threshold), sep='\n')
OUTPUT
> python3 test.py
*********************************************************************************
*************************** ***************************
********* ********* ********* *********
*** *** *** *** *** *** *** ***
* * * * * * * * * * * * * * * *
>
I think you should change the order of processing the slices to go from last to first because recursing into the lower indexes will invalidate the positions that the prior recursion has for lowi and hi:
cantor(lowi+1, hi)
cantor(lo, lowi)
cantor(0, len(l)-1)
You may want to check the end of ranges in your subscripts because the end of a range is exclusive. i.e. l[2:7] does not include index #7.

Drawing a hollow asterisk square

I'm trying to figure out how to turn my whole square into a hollow one. The few things I've tried so far haven't been very successful as I end up getting presented with a rather distorted triangle!
This is the code I have to form my square currently ..
size = 5
for i in range(size):
print ('*' * size)
When run, this is the result ..
*****
*****
*****
*****
*****
Do I need to run if or while statements when size is greater than 3 to specify a condition?
I think this is what you want to do:
m, n = 10, 10
for i in range(m):
for j in range(n):
print('*' if i in [0, n-1] or j in [0, m-1] else ' ', end='')
print()
Output:
**********
* *
* *
* *
* *
* *
* *
* *
* *
**********
You can also draw a triangle this way:
m, n = 10, 10
for i in range(m):
for j in range(n):
print('*' if i in [j, m-1] or j == 0 else ' ', end='')
print()
Output:
*
**
* *
* *
* *
* *
* *
* *
* *
**********
You can print out a single '*', followed by size-2 spaces, then a single '*'. This will give you the "hollow" portion. The first and last lines need the full length:
size = 5
inner_size = size - 2
print ('*' * size)
for i in range(inner_size):
print ('*' + ' ' * inner_size + '*')
print ('*' * size)
Here is my python code for drawing a square by entered size N.
n = int(input())
print('*' * n)
for i in range(n-2):
print ('*' + ' ' * (n-2) + '*')
print('*' * n)
Basically the first and the last print('*' * n) are drawing the top and the bottom lines and the for cycle prints the body.
Output example: N=3
***
* *
***
Output example: N=5
*****
* *
* *
* *
*****
Try this:
size = 5
for i in range(1,size+1):
if (i==1 or i==size):
print("*"*size)
else:
print("*"+" "*(size-2),end="")
print("*")
output:
*****
* *
* *
* *
*****
Heres my example:
print("Enter width")
width = int(input())
print("Enter height")
height = int(input())
for i in range(height):
if i in[0]:
print("* "*(width))
elif i in[(height-1)]:
print("* "*(width))
else:
print("*"+" "*(width-2)+" *")
input()
Output: Image link
Hope this helps everyone else, who wants to leave spaces between asteriks, while printing a rectangle and if there are any mistakes in my code let me know, because I'm a beginner myself.
size = int(input('Enter the size of square you want to print = '))
for i in range(size): # This defines the rows
for j in range(size): # This defines the columns
print('*' , end=' ') # Printing * and " end=' ' " is giving space after every * preventing from changing line
print() # Giving a command to change row after every column in a row is done
print() # Leaving one line
for k in range(size): # This defines the rows
print('* ' *size) # Defines how many times * should be multiplied
Here is my python 3.6 code for drawing a square using column size and row size inputs:
column = int(input("Enter column size : "))
row = int(input("Enter row size : "))
print('* ' * column)
print(('* ' + " " * (column-2)+ '*'+'\n')*(row -2) + ('* ' * column))
You can also draw a triangle using this simple way:
n = int(input("enter num"))
for i in range (n+1):
if 2>=i :
print (i * "*")
elif n == i:
print ("*" * i)
else:
print ("*"+" "*(i-2)+"*")
Nice python library that will do this...
termshape - https://github.com/zvibazak/termshape
from termshape import get_rectangle
print(get_rectangle(10, 5))
* * * * * * * * * *
* *
* *
* *
* * * * * * * * * *
In this code, there are 2 for loops and this loops will create edges. And "else statements" represents if our point is not on the edge code will print empty character(" "). "i == 0" shows upper edge and "i == length - 1" shows bottom edge. "j == 0" will be left edge and I think you can guess what is for "j == length - 1" and "print()".
def emptySquare(length,char):
for i in range(length):
for j in range(length):
if (i == 0 or i == length-1 or j == 0 or j == length-1):
print(char,end=" ")
else:
print(" ",end=" ")
print()

Categories

Resources