換個角度看問題

閱讀時間約 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都不是在邊界上」,就可解決原本看來是沒法解決的問題。寫程式時經常會有卡關的現象,這時候不要一味蠻幹,轉換一下看問題的角度,說不定就能過關。
為什麼會看到廣告
avatar-img
15會員
129內容數
寫點東西自娛娛人
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
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
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
你弟就是只想靠自己,我覺得由他吧,幫了可能還傷感情,由他自己發展。其實這樣也好,靠自己,你看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
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
你弟就是只想靠自己,我覺得由他吧,幫了可能還傷感情,由他自己發展。其實這樣也好,靠自己,你看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後續更新*