換個角度看問題

閱讀時間約 3 分鐘
Game of Life所設定的世界,是在無窮大的二維平面中。當然啦,寫程式時可沒有「無窮大」這回事,只能侷限在某一個有限的範圍內,必要時,再用平移的方式來處理。
既然是在有限的範圍內,那勢必會有邊界產生,而位於邊界和非邊界的cell,在處理上會有所不同。在檢查某個cell在下一代是不是活著時,必須去數周圍的cell中,有多少個是活著的。對於在universe內部的cell來說,這個不成問題,周圍一定是有8個其他的cell圍繞著。但是對於位於邊界的cell來說,可就不是這麼回事了。以universe[0][0]這個位於左上角邊界的cell來說,周圍的cell只有3個;但對於universe[1][0]這個cell來說,周圍的cell卻有5個。所以啊,在算某個cell周圍有多少活著的cell前,必須先判斷這個cell是不是位於邊界上,而且還要知道是在上、下、左、右、四個角落的哪一個邊界上。
要判斷某個cell是不是位於universe的邊界,其實也不是什麼困難的事,幾個if條件判斷式就解決了。可是啊,程式裡頭有一堆if,看起來還真是挺礙眼的,讓人不開心。除了這種個人的喜好和風格問題外,程式的效率問題也應該考慮一下。使用if來判斷cell是否位於邊界,直球對決,是很直接,不需多花腦筋,但卻很沒效率。那有沒有辦法把那礙眼的if給踢開不用呢?
不用if條件判斷式,就能知道cell是不是位於universe的邊界,看來是沒法做到的。不過,現在的目的是甩掉那一堆礙眼的if,這跟需不需要用if來判斷cell是不是位於邊界,還是有那麼一些不同。如果自始至終,都能保證所有的cell都不是在邊界上,那不是根本就不需要去特別處理邊界問題了嗎?這想法挺誘人的,問題是,怎麼做?
「保證所有的cell都不是在universe的邊界上」,換句話說,就是「保證所有的cell都在universe的內部」囉!這好辦!把universe弄大一些,然後把要處理的部分放中間,這樣就可以了。假設原先的universe高跟寬分別是height和width。現在在周圍,也就是上、下、左、右都加寬一行,變成高和寬分別加大成(height + 2)和(width + 2)。這樣子在高range(1, height+1)和寬range(1, width+1)內的所有cell,就是原來要處理的cell,而這些cell,就都位於這個比較大的universe的內部了。
簡單的一個動作,就把所有的cell從邊界挪到內部,但是啊但是,怎麼知道這樣子不會影響到後面的結果?以原來位在左上角邊界[0][0]這個位置的cell來看,原先周圍的cell有3個,現在被挪到[1][1],所以周圍的cell有8個。換句話說,在數周圍有多少活著的cell時,會多出新增加的5個cell。還好!我們在意的,是周圍有多少活著的cell,多出來的這5個,如果永遠都不是活著的,那就不會有什麼影響了。所以囉,只要設定在原來的universe周圍多加進來的cell不是活著的,而且永遠不會活過來,那就不用擔心會影響到結果了。至於怎樣才能讓這些額外引入的cell永遠不會活過來呢?其實很簡單,就不要理他們就好了!也就是說,只處理高range(1, height+1)和寬range(1, width+1)這個範圍內的cell就好了。
有時候簡單的轉換一下觀點,本來難以解決的問題就會變得簡單許多。把問題從「不使用if來判斷cell是不是位於邊界上」,轉換成「讓所有的cell都不是在邊界上」,就可解決原本看來是沒法解決的問題。寫程式時經常會有卡關的現象,這時候不要一味蠻幹,轉換一下看問題的角度,說不定就能過關。
為什麼會看到廣告
15會員
129內容數
寫點東西自娛娛人
留言0
查看全部
發表第一個留言支持創作者!
ysf的沙龍 的其他內容
在Python中,所有東西都是物件。執行程式碼a = 5,會建立5這個物件,然後給a一個reference,這個reference就是告訴a,它的值放在記憶體的哪個位置,要用時,就到那裡去拿。 看到這裡,很直覺的反應是:這不就是C裡頭的pointer嗎?!然後就沒再多想了。
comprehension應該可說是Python的絕學之一吧。不過既然是絕學,總是會有讓人容易在運氣時一個不小心走錯經脈的地方。現在我需要一個二維的list,利用comprehension來造一個,應該是再好不過的選擇。只是這地方,就是個容易出錯的地方。
蝦蜜?!Python沒有內建array?!剛發現這件事時,還真的有點傻眼,怎麼會沒有array這麼好用的data type呢?
寫程式時,很傷腦筋的一件事,就是變數的名稱該怎麼取。其實變數名稱隨便取,並不會影響程式的正確性,但對程式的可讀性,以及後續的維護,那可就影響深遠了。
第一個要拿來練功的題目是:Game of Life。
呼!寫文章真是比寫程式還要燒腦、燒時間。一開始是沒想到要寫這「隨筆」的,是有天程式寫著寫著,腦海中就冒出這麼個想法來,要把跟Python交往的過程寫下來。
在Python中,所有東西都是物件。執行程式碼a = 5,會建立5這個物件,然後給a一個reference,這個reference就是告訴a,它的值放在記憶體的哪個位置,要用時,就到那裡去拿。 看到這裡,很直覺的反應是:這不就是C裡頭的pointer嗎?!然後就沒再多想了。
comprehension應該可說是Python的絕學之一吧。不過既然是絕學,總是會有讓人容易在運氣時一個不小心走錯經脈的地方。現在我需要一個二維的list,利用comprehension來造一個,應該是再好不過的選擇。只是這地方,就是個容易出錯的地方。
蝦蜜?!Python沒有內建array?!剛發現這件事時,還真的有點傻眼,怎麼會沒有array這麼好用的data type呢?
寫程式時,很傷腦筋的一件事,就是變數的名稱該怎麼取。其實變數名稱隨便取,並不會影響程式的正確性,但對程式的可讀性,以及後續的維護,那可就影響深遠了。
第一個要拿來練功的題目是:Game of Life。
呼!寫文章真是比寫程式還要燒腦、燒時間。一開始是沒想到要寫這「隨筆」的,是有天程式寫著寫著,腦海中就冒出這麼個想法來,要把跟Python交往的過程寫下來。
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
你弟就是只想靠自己,我覺得由他吧,幫了可能還傷感情,由他自己發展。其實這樣也好,靠自己,你看beckham那些兒子,職業就是某人的兒子而己。 昨天鴨仔whatsapp我,我人在大陸,隔半天才回他,他就問我最近怎樣,我回了幾句他又沒回應,我想可能我說完自己平日工作很忙,沒有反問他 ‘那你呢?‘,所以
因為視覺中樞受損,左眼有時會看不到東西,所以去針灸了一年。因為主治醫師調走了,才沒有繼續下去。 有次有位實習醫生問我,不會懷疑兩千多年前的理論跟技術嗎? 我的回答是,一種技術可以持續兩千多年,一定有可取之處,問題是你們到底有沒有弄清楚正確的方法!鍋子也用了快三千年了,今天不是還在用鍋子嗎?材質可
在公園的長椅上,我觀察著陽光穿透樹葉的斑駁光影,回想起與老友因觀點不同而爭執的經歷。通過沉思,發現分歧源於角度不同,並以陽光下的樹影為喻,闡述了看待事物的多元視角。文章提醒我們,在判斷事物前,不妨換個角度,或許會有意想不到的發現,並領悟到自己堅信的真理並非絕對。
Thumbnail
當將ACG中,各種巨人的作為與能力投射到自己身上時,再回到現實後,人類已經是超越始祖巨人的存在,我們不僅更理想、更崇高,還已實現作品中完全做不到的事、解決作品中產生的種種令人費解的難題。 我們是始祖巨人,正用著進擊的姿態,讓世界充滿文明。
讓人為意志對環境的加速,帶來氣流改變所形成的風,在一個心法的具體運作下,就成為了大將之風的氣質。
Thumbnail
早安,謝謝大家陪伴我經歷的七天的身心靈之旅。今天是七天日更的最後一天,想要跟大家講一下自己的一些經歷。 其實在開啟這段七天日更旅程的時候,對自己所下的目標就是好好整理,關於身心靈的一些想法跟看法。今天就把我一些比較屬於自身感受的觀點,當作這七天之旅的一個小結語。
Thumbnail
遊船是觀看城市的另一個角度 很多的大城市都有河川流過,莫斯科河之於莫斯科、等同塞納河之於巴黎、伏爾塔瓦河之於布拉格,潺潺的河水大大的增添了城市的風采。莫斯科河長達500公里,流經莫斯科市區部分約80公里,經過城市的中心,經過很多著名的建築、景點,遊一趟河,等於看遍了半個莫斯科市。
Thumbnail
現今討論注意力多傾向直接提出注意力的類型,例如提到注意力問題,不可避免的會討論到由Sohlberg 與Mateer所提出的注意力臨床模式中的五種向度,分別是持續性、集中性、選擇性、交替性,以及分配性等五種。只是我還是覺得溯本根源還是很重要的,從最根本開始瞭解會更清楚『注意力』課題。我總覺得只單純討論
Thumbnail
如果說,設計遊戲就是提取現實生活中的靈感,發揮我們的想像力來創作。那麼遊戲化,就可以說是將遊戲設計中的一些機制,放到現實生活裡,發揮它有趣的魔力。今天,就藉著朋友的問題,來跟各位分享2個遊戲機制吧!
Thumbnail
關於昨晚(11/29)到今天(11/30)早上,批踢踢還有幾家台灣媒體都在講「NIKE在日本最新的廣告被『炎上』」。先說結論,這支影片在我看來沒有「被炎上」。 *本文綜合了2020.11.30的貼文與2020.12.02後續更新*
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
你弟就是只想靠自己,我覺得由他吧,幫了可能還傷感情,由他自己發展。其實這樣也好,靠自己,你看beckham那些兒子,職業就是某人的兒子而己。 昨天鴨仔whatsapp我,我人在大陸,隔半天才回他,他就問我最近怎樣,我回了幾句他又沒回應,我想可能我說完自己平日工作很忙,沒有反問他 ‘那你呢?‘,所以
因為視覺中樞受損,左眼有時會看不到東西,所以去針灸了一年。因為主治醫師調走了,才沒有繼續下去。 有次有位實習醫生問我,不會懷疑兩千多年前的理論跟技術嗎? 我的回答是,一種技術可以持續兩千多年,一定有可取之處,問題是你們到底有沒有弄清楚正確的方法!鍋子也用了快三千年了,今天不是還在用鍋子嗎?材質可
在公園的長椅上,我觀察著陽光穿透樹葉的斑駁光影,回想起與老友因觀點不同而爭執的經歷。通過沉思,發現分歧源於角度不同,並以陽光下的樹影為喻,闡述了看待事物的多元視角。文章提醒我們,在判斷事物前,不妨換個角度,或許會有意想不到的發現,並領悟到自己堅信的真理並非絕對。
Thumbnail
當將ACG中,各種巨人的作為與能力投射到自己身上時,再回到現實後,人類已經是超越始祖巨人的存在,我們不僅更理想、更崇高,還已實現作品中完全做不到的事、解決作品中產生的種種令人費解的難題。 我們是始祖巨人,正用著進擊的姿態,讓世界充滿文明。
讓人為意志對環境的加速,帶來氣流改變所形成的風,在一個心法的具體運作下,就成為了大將之風的氣質。
Thumbnail
早安,謝謝大家陪伴我經歷的七天的身心靈之旅。今天是七天日更的最後一天,想要跟大家講一下自己的一些經歷。 其實在開啟這段七天日更旅程的時候,對自己所下的目標就是好好整理,關於身心靈的一些想法跟看法。今天就把我一些比較屬於自身感受的觀點,當作這七天之旅的一個小結語。
Thumbnail
遊船是觀看城市的另一個角度 很多的大城市都有河川流過,莫斯科河之於莫斯科、等同塞納河之於巴黎、伏爾塔瓦河之於布拉格,潺潺的河水大大的增添了城市的風采。莫斯科河長達500公里,流經莫斯科市區部分約80公里,經過城市的中心,經過很多著名的建築、景點,遊一趟河,等於看遍了半個莫斯科市。
Thumbnail
現今討論注意力多傾向直接提出注意力的類型,例如提到注意力問題,不可避免的會討論到由Sohlberg 與Mateer所提出的注意力臨床模式中的五種向度,分別是持續性、集中性、選擇性、交替性,以及分配性等五種。只是我還是覺得溯本根源還是很重要的,從最根本開始瞭解會更清楚『注意力』課題。我總覺得只單純討論
Thumbnail
如果說,設計遊戲就是提取現實生活中的靈感,發揮我們的想像力來創作。那麼遊戲化,就可以說是將遊戲設計中的一些機制,放到現實生活裡,發揮它有趣的魔力。今天,就藉著朋友的問題,來跟各位分享2個遊戲機制吧!
Thumbnail
關於昨晚(11/29)到今天(11/30)早上,批踢踢還有幾家台灣媒體都在講「NIKE在日本最新的廣告被『炎上』」。先說結論,這支影片在我看來沒有「被炎上」。 *本文綜合了2020.11.30的貼文與2020.12.02後續更新*