2024 年 9 月 6 日:在開始討論問題本身之前,讓我們先來看看背景故事。挑戰,書中的開放數學挑戰。
圖書館裡一本 1984 年的舊書,我忘了書名,但我在「更多閱讀內容...」部分看到了它的一個非常有趣的問題的圖片。
一個,呃,詩謎……是的,你沒聽錯,是一道以古英語詩歌形式寫成的數學問題。
從高中起我就不再喜歡詩歌了,但是,這首吸引了我的注意。當我讀到它的時候,我覺得我明白了一些東西,但又不完全明白。花了六個多小時來理解寓言中的謎題,像是龍之類的。但是,有一件事讓我著迷,那就是寶石。為了讓你充分理解,這裡有一首詩:
**在佐普拉里亞無盡而奇妙的土地上,星星靜靜地嗡嗡作響,
遠古巨龍守護著時間與潮汐合一的天空,
一位智慧的老聖人安靜地生活,他的知識跨越了所有的時間,
他們的雙手可以像詩人吟詩一樣編織魔法的絲線。
有一天,從天堂的高處,乘著火與金的翅膀,
正如神話傳說所言,聖人的禮物降臨:
巨大的寶藏-充滿光芒四射的寶石,就像星星的碎片,
然而卻與命運自己的預言連結在一起,其規則與火星一樣古老。
天堂向他低語,一條輕柔但清晰的訊息:
「用心和耳朵將這些發光的寶石分成兩部分。
讓你精心製作的兩個容器承受幾乎共同的重量,
他們之間的和諧是明亮而公平的平衡。
但請聽我們說,賢者,如果完美的匹配超出了你的理解範圍,
不要對你的追求感到絕望,因為你的旅程仍然不會結束。
因為即使平衡傾斜,但可能會有輕微的偏移,
天堂仍會對你微笑,祝福將自由流淌。 ”
聖人懷著勇敢與智慧的心,開始了他神聖的考驗,
把器皿造得差不多,給明星最好的。
龍在高空盤旋,天使在飛行中停頓,
因為在這個平衡的任務中蘊藏著如光般純淨的真理。
寶石,就像來自過去的秘密,在聖人轉變之前,
每一次選擇,命運就已成型,心開始燃燒。
雖然工作艱鉅,但明星們還是很佩服
這位聖人用穩健的雙手尋求平衡宇宙之火。
以及故事如何在無盡的天空下結束,
只有那些尋求並敢於抬起眼睛的人知道。
在佐普拉里亞無邊無際的國度,古老的故事永存,
有人說聖人猶思,心清淨。
因為在寂靜的天空中存在著一種微妙而罕見的平衡,
只有雙手穩健的人才能分享的和諧。 **
這就是這首詩,看起來很奇怪。它在一本數學書中做了什麼。這不是一個新的謎題,而是一個 1600 年代的謎題,寫在現代威斯敏斯特的某個地方。
不過AI是我們的好朋友對吧,我問它回答的很奇怪,看起來連狗屎都聽不懂。
它以為是我創造了它,但其實不是我。但是,GPT-4 呢?我們就問它知不知道什麼。它成了我的英文老師。
好的,需要自己解碼。我們來試試吧。
2024 年 9 月 9 日:「將這些發光的寶石分成兩半,小心心和耳朵。
讓你精心製作的兩個容器承受幾乎共同的重量,
他們之間的和諧是明亮而公平的平衡。
但請聽我們說,賢者,如果完美的匹配超出了你的理解範圍,
不要對你的追求感到絕望,因為你的旅程仍然不會結束。
因為即使平衡傾斜,但可能會有輕微的偏移,
天堂仍會對你微笑,祝福將自由流淌。 ”
這是故事的主要部分,讓我們來解碼它。
經過一番集思廣益,抱歉,連續折磨自己三天多,我終於有了線索。
寶石可能是數字,正如它所說的“用心聆聽”。
容器可能是集合,但集合的概念直到那時才被發現,所以,我可能是錯的。
上述摘錄可能意味著兩組元素數量相等,或該組中的數字總和相等。如果總和不相同,可能會顯示最接近的。
2024年9月15日:經過一些更複雜的思考並發布了許多補充文章。我想是的,我可能在這首詩中找到了我最好的想法。
雖然這首詩已經很古老了,但我找不到任何其他的答案來解釋這首詩。但是,我已經提出了每個人都能理解的問題,包括我。
從C.S.的角度來看,是的,我會先用C.S.的形式,然後再用數學的形式。
我們得到了一個整數列表。我們的任務是將列表分成兩個子列表,以使它們總和的絕對差最小化。如果存在完美分割,我們需要傳回兩個清單。否則,傳回總和差值最小的兩個列表。
Input: [3, 1, 4, 2, 2] Output: ([2, 4], [3, 1, 2])
在此範例中,將列表拆分為 [3, 4] 和 [1, 2, 2] 得出的和為 7 和 5,並且絕對差最小化為 2。
那麼讓我們開始編碼吧。
2024 年 9 月 16 日:
from itertools import combinations def minimize_difference(lst): total_sum = sum(lst) n = len(lst) # Generate all possible subsets best_diff = float('inf') best_split = ([], []) for i in range(1, n//2 + 1): for subset in combinations(lst, i): subset_sum = sum(subset) other_sum = total_sum - subset_sum diff = abs(subset_sum - other_sum) if diff < best_diff: best_diff = diff best_split = (list(subset), [x for x in lst if x not in subset]) return best_split # Example usage lst = [3, 1, 4, 2, 2] result = minimize_difference(lst) print("Split lists:", result)
程式碼比我的大腦運行得更好這一事實真是令人驚訝。
將一個列表分成兩個子列表以使它們總和之間的絕對差異最小化的問題源於一個令人著迷的數學挑戰。讓我們來分析一下所提供的 Python 程式碼是如何解決這個問題的。
理解問題:
目標是從給定列表中找到兩個子列表,使其總和盡可能接近。如果存在完美分割(兩個子列表的總和相等),我們傳回兩個子列表。否則,我們傳回兩個總和之間的差異最小的分割。
程式碼結構:
程式碼的核心在於從清單中產生所有可能的元素組合以形成子清單之一。一旦選擇了一個子列表,另一個子列表將由剩餘的元素自動形成。然後,我們比較它們的總和,以找到差異最小的最佳分割。
combinations(lst, i):這會從清單中產生長度為 i 的所有可能組合。對於每個子集,它模擬一個子列表,而其餘元素形成另一個子列表。
total_sum = sum(lst):計算清單的總和。它用於透過從總和中減去當前子集的總和來輕鬆確定其他子清單的總和。
best_diff = float('inf'):我們用一個大數字(無窮大)初始化變數 best_diff 以追蹤迄今為止發現的最小差異。當我們遍歷每個可能的分割時,如果發現較小的差異,我們就會更新該值。
找到最佳分割:對於產生的每個子集,程式碼計算兩個子列表總和之間的差。如果目前差異小於 best_diff,則更新分割。
效能注意事項:
程式碼使用 itertools 庫中的組合函數來探索不同長度的子集。雖然此方法適用於相對較小的列表,但由於可能的子集呈指數增長,因此對於較大的列表可能不是最佳選擇。對於更大的輸入,可以考慮更有效率的演算法,例如動態規劃。
範例輸出:
在提供的範例中:
lst = [3, 1, 4, 2, 2] result = minimize_difference(lst) print("Split lists:", result)
此函數將列表拆分為 [2, 4] 和 [3, 1, 2],結果分別為 6 和 6,差值最小為 0,這是本例中的最優解。
您看到的以上內容是我的日記摘錄,100%真實。但與她的傳奇版本相比,還有一個更「傳奇」的版本
以上是詩意的挑戰!的詳細內容。更多資訊請關注PHP中文網其他相關文章!