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)]
#根據(jù)輸入的N創(chuàng)建所有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
            #新一行的中心值等于上一行的中心值 + 行號(hào) + 1
            end = array[i][center] - 1
            #從中心值向兩側(cè)賦值
            move = 1
            #每次移動(dòng)1位
            while end > last_center:
            #移動(dòng)到ord值剛好比上一行中心值大1為止
                array[i][center - move] = end
                array[i][center + move] = end
                #中心值兩側(cè)對(duì)稱(chēng)賦值
                end -= 1
                move += 1
            for j in range(2 * N - 1):
            #如果有element的值大于90(Z的ord值)权逗,則減去26囤萤,重新回到A-Z的ord范圍中
                while array[i][j] > 90:
                #注意要使用循環(huán)減去26翩隧,一旦N很大,可能超出多個(gè)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)]
#根據(jù)輸入的N創(chuàng)建所有element為0的矩陣拇勃,在原矩陣兩側(cè)各加一列0,便于boundary計(jì)算

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]
                #新的一行每個(gè)元素等于上一行左上和右上兩個(gè)數(shù)字的加和        

def print_characters():
    space = len(str(max(array[-1])))
    #為了保持輸出格式炒事,確定最長(zhǎng)數(shù)字的長(zhǎng)度
    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開(kāi)始的數(shù)都是(level * 2 - 1) ** 2,坐標(biāo)都是[level, 1 - level]
#再根據(jù)x, y坐標(biāo)的情況判斷處于該層正方形不同邊上位置的數(shù)字是多少
    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]
                #左上右下對(duì)角線的和
            if i + j == n - 1:
                total_diagnal[1] += square[i][j]
                #左下右上對(duì)角線的和
    for e in total_column:
        if e != total:
            return False
    for e in total_diagnal:
        if e!= total:
            return False
    return True
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蔫慧,一起剝皮案震驚了整個(gè)濱河市挠乳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌姑躲,老刑警劉巖睡扬,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異黍析,居然都是意外死亡卖怜,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)阐枣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)韧涨,“玉大人,你說(shuō)我怎么就攤上這事侮繁÷侵啵” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵宪哩,是天一觀的道長(zhǎng)娩贷。 經(jīng)常有香客問(wèn)我,道長(zhǎng)锁孟,這世上最難降的妖魔是什么彬祖? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任茁瘦,我火速辦了婚禮,結(jié)果婚禮上储笑,老公的妹妹穿的比我還像新娘甜熔。我一直安慰自己,他們只是感情好突倍,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布腔稀。 她就那樣靜靜地躺著,像睡著了一般羽历。 火紅的嫁衣襯著肌膚如雪焊虏。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,441評(píng)論 1 310
  • 那天秕磷,我揣著相機(jī)與錄音诵闭,去河邊找鬼。 笑死澎嚣,一個(gè)胖子當(dāng)著我的面吹牛疏尿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播易桃,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼褥琐,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了颈抚?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤嚼鹉,失蹤者是張志新(化名)和其女友劉穎贩汉,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體锚赤,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡匹舞,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了线脚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赐稽。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖浑侥,靈堂內(nèi)的尸體忽然破棺而出姊舵,到底是詐尸還是另有隱情,我是刑警寧澤寓落,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布括丁,位于F島的核電站,受9級(jí)特大地震影響伶选,放射性物質(zhì)發(fā)生泄漏史飞。R本人自食惡果不足惜尖昏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望构资。 院中可真熱鬧抽诉,春花似錦、人聲如沸吐绵。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)拦赠。三九已至巍沙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間荷鼠,已是汗流浹背句携。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留允乐,地道東北人矮嫉。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像牍疏,于是被迫代替她去往敵國(guó)和親蠢笋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • **2014真題Directions:Read the following text. Choose the be...
    又是夜半驚坐起閱讀 9,573評(píng)論 0 23
  • 生老病死乃天道鳞陨, 世間萬(wàn)物不可違昨寞。 仰天大笑無(wú)憾事, 生死相依何懼哉厦滤!
    紫雯閣閱讀 287評(píng)論 0 1
  • 重陽(yáng)登天平山 牧泊 獨(dú)為異客在異鄉(xiāng)援岩,佳節(jié)又侵落重陽(yáng)。 不負(fù)古人登高意...
    牧泊閱讀 583評(píng)論 3 3
  • 01 “二十八歲掏导,其實(shí)我還未成年呢~”享怀,涼夏對(duì)著自拍的手機(jī)鏡頭說(shuō)。 我并不想評(píng)論影片的好與壞趟咆,不想像網(wǎng)上的噴子那般...
    Only怡歡閱讀 506評(píng)論 3 2
  • 對(duì)你的向往 美麗的傳說(shuō) 從此多了一份夢(mèng)想 裝一兜晨露 喚醒沉睡的愿望 讓心不再沉迷于想象 牧羊人和野兔一起奔跑 野...
    劉高莉娟閱讀 163評(píng)論 2 5