COMP9021 Principles of Programming Lab4

1. Q1

Write a program characters_triangle.py that gets a strictly positive integer N as input and outputs a triangle of height N, following this kind of interaction:

Q1
def running_time(f):
    def g(*args):      
        from time import time
        before = time()
        f(*args)
        after = time()
        print(f'It took {after - before} seconds to execute the function.')
    return g

while True:
    try:
        N = int(input('Enter strictly positive number: '))
        if N < 1:
            raise ValueError
        break
    except ValueError:
        print('The input is illegal. Please input again.')

array = [[0] * (N * 2 - 1) for _ in range(N)]
#根据输入的N创建所有element为0的矩阵

@running_time
def characters_triangle(N):
    center = N - 1
    #所有row的center不变
    array[0][center] = 65
    #初始化第一行的center值,是字母A的ord值
    if N != 1:
        for i in range(1, N):
            last_center = array[i - 1][center]
            array[i][center] = last_center + i + 1
            #新一行的中心值等于上一行的中心值 + 行号 + 1
            end = array[i][center] - 1
            #从中心值向两侧赋值
            move = 1
            #每次移动1位
            while end > last_center:
            #移动到ord值刚好比上一行中心值大1为止
                array[i][center - move] = end
                array[i][center + move] = end
                #中心值两侧对称赋值
                end -= 1
                move += 1
            for j in range(2 * N - 1):
            #如果有element的值大于90(Z的ord值),则减去26,重新回到A-Z的ord范围中
                while array[i][j] > 90:
                #注意要使用循环减去26,一旦N很大,可能超出多个26
                    array[i][j] -= 26
    return array

def print_characters():
    for i in range(N):
        for j in range(2 * N - 1):
            if array[i][j] == 0:
                print(' ', end = '')
            else:
                print(chr(array[i][j]), end = '')
        print()

        
characters_triangle(N)  
print_characters()

2. Q2

Write a program pascal_triangle.py that prompts the user for a number N and prints out the first N + 1 lines of Pascal triangle, making sure the numbers are nicely aligned, following this kind of interaction.

Q2
def running_time(f):
    def g(*args):      
        from time import time
        before = time()
        f(*args)
        after = time()
        print(f'It took {after - before} seconds to execute the function.')
    return g

while True:
    try:
        N = int(input('Enter a nonnegative integer: '))
        if N < 0:
            raise ValueError
        break
    except ValueError:
        print('The input is illegal. Please input again.')

array = [[0] * (N * 2 + 3) for _ in range(N + 1)]
#根据输入的N创建所有element为0的矩阵,在原矩阵两侧各加一列0,便于boundary计算

array[0][N + 1] = 1
#确定初始值,第一行中间值为1
@running_time
def pascal():
    if N > 0:
        for i in range(1, N + 1):
            for j in range(1, N * 2 + 2):
                array[i][j] = array[i - 1][j - 1] + array[i - 1][j + 1]
                #新的一行每个元素等于上一行左上和右上两个数字的加和        

def print_characters():
    space = len(str(max(array[-1])))
    #为了保持输出格式,确定最长数字的长度
    for i in range(N + 1):
        for j in range(1, 2 * N + 3):
            e = array[i][j]
            if e == 0:
                print(' ' * space, sep = '', end = '')
            else:
                print(' ' * (space - len(str(e))), e, sep = '', end = '')
        print()

pascal()
print_characters()

3. Q3

Write a program plane_encoding.py that implements a function encode(a, b) and a function decode(n) for the one-to-one mapping from the set of pairs of integers onto the set of natural numbers, that can be graphically described as follows:

Q3
def encode(x, y):
#每一层x开始的数都是(level * 2 - 1) ** 2,坐标都是[level, 1 - level]
#再根据x, y坐标的情况判断处于该层正方形不同边上位置的数字是多少
    level = max(abs(x), abs(y))
    start = (level * 2 - 1) ** 2
    start_position = [level, 1 - level]
    if x == level and y != -level:
    #该层正方形右边
        return start + (y - start_position[1])
    elif y == level:
    #该层正方形上边
        return start + (2 * level - 1) + (level - x)
    elif x == -level:
    #该层正方形左边
        return start + (2 * level - 1) + (2 * level) + (level - y)
    elif y == -level:
    #该层正方形下边
        return start + (2 * level - 1) + (2 * level) + (2 * level) + (x + level)

def decode(n):
    if n == 0:
        return (0, 0)
    level = 1
    while (2 * level - 1) ** 2 <= n: 
        level += 1
    level -= 1
    start = (level * 2 - 1) ** 2
    start_position = [level, 1 - level]

    if n <= (start + level * 2 - 1):
    #该层正方形右边
        return (level, n - start + start_position[1])
    elif n <= (start + level * 2 - 1) + level * 2:
    #该层正方形上边    
        return (level - (n - (start + 2 * level - 1)), level)
    elif n <= (start + level * 2 - 1) + level * 2 + level * 2:
    #该层正方形左边  
        return (-level, level - (n - (start + 2 * level - 1 + 2 * level)))
    else:
        return (-level + (n - (start + 2 * level - 1 + 2 * level + 2 * level)), -level)

4. Q4

Given a positive integer n, a magic square of order n is a matrix of size n×n that stores all numbers from1 up to n2 and such that the sum of the n rows, the sum of the n columns, and the sum of the two diagonals is constant, hence equal to n(n2 + 1)/2. The function print_square(square) prints a list of lists that represents a square, and the function is_magic_square(square) checks whether a list of lists is a magic square. For instance:

def print_square(square):
    length = len(str(max(max(square))))
    for row in square:
        for i in range(len(row)):
            if i < len(row) - 1:
                print(' ' * (length - len(str(row[i]))), row[i], end = ' ')
            else:
                print(' ' * (length - len(str(row[i]))), row[i])

def is_magic_square(square):
    n = len(square)
    total = int(n * (n ** 2 + 1) / 2)
    for row in square:
        if sum(row) != total:
            return False
    #每一行的和是否成立
    total_column = [0] * n
    total_diagnal = [0] * 2
    for i in range(n):
        for j in range(n):
            total_column[j] += square[i][j]
            #每一列的和
            if i == j:
                total_diagnal[0] += square[i][j]
                #左上右下对角线的和
            if i + j == n - 1:
                total_diagnal[1] += square[i][j]
                #左下右上对角线的和
    for e in total_column:
        if e != total:
            return False
    for e in total_diagnal:
        if e!= total:
            return False
    return True
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容

  • **2014真题Directions:Read the following text. Choose the be...
    又是夜半惊坐起阅读 9,341评论 0 23
  • 生老病死乃天道, 世间万物不可违。 仰天大笑无憾事, 生死相依何惧哉!
    紫雯阁阅读 273评论 0 1
  • 重阳登天平山 牧泊 独为异客在异乡,佳节又侵落重阳。 不负古人登高意...
    牧泊阅读 567评论 3 3
  • 01 “二十八岁,其实我还未成年呢~”,凉夏对着自拍的手机镜头说。 我并不想评论影片的好与坏,不想像网上的喷子那般...
    Only怡欢阅读 492评论 3 2
  • 对你的向往 美丽的传说 从此多了一份梦想 装一兜晨露 唤醒沉睡的愿望 让心不再沉迷于想象 牧羊人和野兔一起奔跑 野...
    刘高莉娟阅读 160评论 2 5