تنسيق مثلث باسكال
-
30-09-2019 - |
سؤال
أنا أعمل حاليًا على مهمة الواجب المنزلي لتوليد ما يعرف باسم مثلث باسكال في بيثون.
حتى الآن ، هذا ما لدي:
def mytri(myrange):
trianglevar = [[1]]
for i in range(1, myrange):
tempvar = [1]
for n in range(0, i-1):
tempvar.append(trianglevar[i-1][n]+trianglevar[i-1][n+1])
tempvar.append(1)
trianglevar.append(tempvar)
return trianglevar
def mymenu():
for i in mytri(int(raw_input("Please enter the height of the triangle: "))):
print i
print '\n'
choicevar = raw_input("Would you like to create another triangle? (y/n): ")
if choicevar == "y":
mymenu()
else:
print "Goodbye."
mymenu()
ما يفعله البرنامج حتى هذه النقطة هو إجراء حساب المثلث. يحسب الأرقام في كل صف (بدءًا من 1) ، ويتوقف بعد الوصول إلى عدد الصفوف المحددة من قبل المستخدم.
ومع ذلك ، لست متأكدًا من كيفية تنسيق مثلث بلدي. يطبع حاليًا على النحو التالي:
[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
...etc.
الإخراج الذي أريده هو:
[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
...etc.
(إنه خارج قليلاً بسبب الأقواس/الفواصل ، لكنني أحاول فقط الحصول على التنسيق العام في الوقت الحالي.)
شكرا لكل مساعدة تقدمها!
المحلول
h = int(raw_input("Please enter the height of the triangle: "))
for i in mytri(h):
print " " * (h * 2), i
h -= 1
حتى هنا تقوم بطباعة مساحتين لكل مستوى من هرم. يتم وضع مسافة بادئة للسطر الأول بمقدار ضعف عدد المساحات. كما تنحدر مستوى واحد ، يمكنك تقليل المسافة البادئة بمقدار 2.
نصائح أخرى
بمجرد حصولك على صفوفك ، من المحتمل أن يكون لديك الصف الأخير كأطول.
نظرًا لأنك فقط تطبعها ، يمكنك بعد ذلك أخذ l = len(str(rows[-1]))
ثم ، اجمع ذلك مع أ str(rows[i]).center(l)
لكل صف.
تعديل: لم يكن على علم بأننا يجب أن نعطي جميع الإجابات على الواجبات المنزلية ... إذا كان الأمر كذلك:
def mytri(myrange):
rows = list()
lr = None # Last row
for i in xrange(myrange+1):
try:
lr = [1] + [lr[i] + lr[i+1] for i in range(len(lr) - 1)] + [1]
except TypeError:
lr = [1]
#rows.append(str(lr))
rows.append(' '.join(str(v) for v in lr))
return rows
rows = mytri(10)
l = len(rows[-1])
print '\n'.join(v.center(l) for v in rows)
سوف الإخراج
1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1 1 9 36 84 126 126 84 36 9 1 1 10 45 120 210 252 210 120 45 10 1
بدلاً من تجديد الصفوف السابقة في كل تكرار ، يمكنك إنتاج كل صف أثناء إنشاءه:
def mytri(height):
start = [1]
for _ in xrange(height): # "_" for an unused variable
yield start # loop written "backwards" for simplicity,
# though this does generate one unused row
next_row = [1]
for a, b in zip(start, start[1:]): # slicing creates a new list, not a
next_row.append(a + b) # concern for this problem, but in
next_row.append(1) # others you could use itertools.islice
start = next_row # to avoid that
الآن تعداد الارتفاع للخلف مع كل صف:
height = int(raw_input("Height: "))
for n, row in zip(xrange(height - 1, -1, -1), mytri(height)):
print " " * n, " ".join("%5d" % x for x in row)
لن يصطف هذا بسرعة مع العديد من الصفوف ، ولكن يجب أن يتجه في الاتجاه الصحيح.
تحتاج إلى وضع جميع الأرقام حتى تكون نفس العرض
تحتاج أيضًا إلى إضافة بعض الحشو إلى الجانب الأيسر
def mymenu():
res = mytri(int(raw_input("Please enter the height of the triangle: ")))
width = len(str(res[-1][len(res[-1])/2]))
for i, row in enumerate(res):
print " "*(width*(len(res)-i)/2)+" ".join(str(x).rjust(width) for x in row)
print '\n'
choicevar = raw_input("Would you like to create another triangle? (y/n): ")
if choicevar == "y":
mymenu()
else:
print "Goodbye."
انتاج:
Please enter the height of the triangle: 10
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1
n=input('enter n:')
z=0
d=' '
while z<n:
d=d+' '
z=z+1
print d,1
l1=[1]
l2=[1,1]
def space(n,a):
s=''
while a<n:
s=s+' '
a=a+1
return s
def digit(n):
r=1
k=0
while r!=0:
r=n/10**k
k=k+1
return k-1
def print_l(l1,b):
d=''
d='\n'+space(b-1,0)*3
i=0
while i<len(l1):
d=d+' '*(6-digit(l1[i]))+str(l1[i])
i=i+1
print d
b=n-1
k=1
while k<n:
l2=l1
l1=[1]
i=1
while len(l1)<len(l2):
if i>len(l2)/2:
l1.append(l1[len(l2)-i])
else:
l1.append(l2[i-1]+l2[i])
i=i+1
k=k+1
l1.append(1)
print_l(l1,b)
b=b-1