ホームページ  >  記事  >  バックエンド開発  >  詩的な挑戦!?

詩的な挑戦!?

DDD
DDDオリジナル
2024-09-18 17:41:29739ブラウズ

2024 年 9 月 6 日: 問題自体の議論に移る前に、背景を見てみましょう。挑戦、本に書かれたオープンな数学の挑戦。
図書館にある 1984 年の古い本。名前は忘れましたが、「続きを読む...」セクションで非常に興味深い問題の写真を見つけました。
ああ、詩的ななぞなぞ... はい、よく聞きました。古英語の詩の形式で書かれた数学の問題です。
高校時代以来、私は詩のファンではありませんでしたが、これは私の注意を引きました。読んでいると、なんとなくわかったような気がしましたが、完全には理解できていませんでした。ドラゴンなどの寓話のパズルを理解するのに 6 時間以上かかります。しかし、一つ引っかかったのが宝石です。あなたが完全に理解できるように、ここに詩があります:

**星々が静かに口ずさむ、ゾプラリアの果てしなく続く不思議な土地で、

そして古代のドラゴンは時間と潮流が一つである空を守っています

賢明な老賢者は静かに暮らし、その知識はあらゆる時代に及びました、

詩人が韻を踏みながら魔法の糸を紡ぐことができるのは誰の手でしょう。

ある日、天の高いところから、火と金の翼に乗って、

神話と伝説が語るように、賢者に贈られた贈り物:

星のかけらのような、輝く宝石の広大な宝物

しかし、火星と同じくらい古いルールを持つ運命自身の予言に結びついています。

天は彼にささやきました。柔らかく、しかし明確なメッセージでした:

「注意深く心と耳を傾けて、この輝く宝石を 2 つに分けてください。

作成した両方の器に、ほぼ共有に近い重量を保持させてください。

それらの間の調和は、明るく公正なバランスで保たれています。

しかし、賢者よ、完璧な試合があなたのケンタを超えて失われた場合は、私たちの言うことを聞いてください、

あなたの探求に絶望はありません。それでもあなたの旅は終わらないからです。

たとえバランスが傾いても、わずかにずれることがあるかもしれないので、

天は今もあなたに微笑みかけ、祝福は自由に流れ出るでしょう。」

賢者は勇敢かつ賢明な心を持ち、神聖な試練を始めました。

同じような器を作り、スターたちにベストを尽くすこと。

ドラゴンは上空で旋回し、天使たちは飛行を停止しました

なぜなら、このバランスという課題の中に、光のように純粋な真実があるからです。

宝石たちは、賢者になる前の過去の秘密のようなものです

あらゆる選択で運命が形を変え、心は燃え始めました。

これからの仕事は気の遠くなるようなものでしたが、それでもスターたちは賞賛していました

安定した手で宇宙の火のバランスをとろうとした賢者。

そして、果てしなく続く空の下で、物語はどのようにして終焉を迎えたのか

それは、探求し、目を上げようとする者だけが知っています。

古い物語が語り継がれるゾプラリアの無限の領域では、

ある人は、賢者は心も精神も純粋で、今でも熟考していると言う。

静かな天空には、素晴らしく稀なバランスが存在するからです

堅実な手を持つ者だけが共有できるハーモニー。**

これは詩ですが、奇妙に思えますね。そしてそれは数学の本で何をしているのでしょうか。これは新しいパズルではなく、現代のウェストミンスターのどこかで書かれた、古い 1600 年代のパズルです。
それにもかかわらず、AI は私たちの良き友人です。そうです、AI に尋ねると、答えは奇妙で、AI ですら何も理解していないようです。

A Poetic Challenge !?
私が作ったと思っていましたが、そうではありませんでした。では、GPT-4 はどうでしょうか?それがたわごとを知っているかどうか尋ねてみましょう。それが私の英語の先生になりました。

A Poetic Challenge !?

A Poetic Challenge !?

わかりました、自分でデコードする必要があります。試してみましょう。

2024 年 9 月 9 日: 「注意深く心と耳を傾けて、これらの輝く宝石を 2 つに分けてください。

作成した両方の器に、ほぼ共有に近い重量を保持させてください。

それらの間の調和は、明るく公正なバランスで保たれています。

しかし、賢者よ、完璧な試合があなたのケンタを超えて失われた場合は、私たちの言うことを聞いてください、

あなたの探求に絶望はありません。それでもあなたの旅は終わらないからです。

たとえバランスが傾いても、わずかにずれることがあるかもしれないので、

天は今もあなたに微笑みかけ、祝福は自由に流れ出るでしょう。」

これが物語の主要な部分です。解読してみましょう。
ブレーンストーミングをした後、申し訳ありませんが、3 日以上自分を苦しめながら、ヒントを得ました。
「注意深く心と耳を傾けて」とあるように、宝石は数字かもしれません。
器は集合かもしれませんが、集合という概念はそれまで発見されていなかったので、間違っているかもしれません。
上記の抜粋は、等しい数の要素の 2 つのセット、またはセット内の数値の合計が等しいことを意味している可能性があります。また、合計が異なる場合は、最も近い値が表示される場合があります。

2024 年 9 月 15 日: より複雑な思考を経て、多くの補足記事を公開しました。そう思います。この詩について私は自分の最良の考えを見つけたのかもしれません。
この詩はとても古いものですが、私はこの詩に対する他の解決策を見つけることができませんでした。しかし、私を含め誰もが理解できるように質問を組み立てました。

挑戦

CS の観点から言えば、そうですね、最初に C.S. を行い、その後数学を行うという形でこれを行います。

整数のリストが与えられます。私たちのタスクは、リストを 2 つのサブリストに分割して、それらの合計の差の絶対値が最小化されるようにすることです。完全な分割が存在する場合は、2 つのリストを返す必要があります。それ以外の場合は、合計の差が最小となる 2 つのリストを返します。

例:

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)

コードが私の頭よりもうまく機能するという事実には、ただただ驚くばかりです。

コードの説明

リストを 2 つのサブリストに分割して、それらの合計の差の絶対値が最小になるようにするという問題は、興味深い数学的課題から生じています。提供されている Python コードがこの問題にどのように対処するかを詳しく見てみましょう。

  1. 問題の理解:
    目標は、指定されたリストから 2 つのサブリストを見つけて、それらの合計ができるだけ近くなるようにすることです。完全な分割が存在する場合 (両方のサブリストの合計が等しい場合)、2 つのサブリストを返します。それ以外の場合は、2 つの合計の差が最小になる分割を返します。

  2. コード構造:

コードの核心は、リストから要素の可能なすべての組み合わせを生成して、サブリストの 1 つを形成することにあります。サブリストが選択されると、残りの要素によって他のサブリストが自動的に形成されます。次に、それらの合計を比較して、差が最小限になる最適な分割を見つけます。

  1. 主要な機能と概念:
  • combinations(lst, i): これは、長さ i の可能なすべての組み合わせをリストから生成します。各サブセットについて、サブリストの 1 つをシミュレートし、残りの要素が他のサブリストを形成します。

  • total_sum = sum(lst): リストの合計を計算します。これは、合計から現在のサブセットの合計を減算することで、他のサブリストの合計を簡単に決定するために使用されます。

  • best_diff = float('inf'): これまでに見つかった最小の差を追跡するために、変数 best_diff を大きな数値 (無限大) で初期化します。考えられる各分割を検討する際に、より小さい差が見つかった場合は、この値を更新します。

  • 最適な分割の検索: 生成されたサブセットごとに、コードは 2 つのサブリストの合計の差を計算します。現在の差が best_diff より小さい場合、分割は更新されます。

  1. パフォーマンスに関する考慮事項:
    このコードでは、itertools ライブラリの組み合わせ関数を使用して、さまざまな長さのサブセットを探索します。このアプローチは比較的小さなリストにはうまく機能しますが、サブセットが指数関数的に増加するため、より大きなリストには最適ではない可能性があります。入力が大きい場合は、動的プログラミングなどのより効率的なアルゴリズムを検討できます。

  2. 出力例:

提供された例では:

   lst = [3, 1, 4, 2, 2]
   result = minimize_difference(lst)
   print("Split lists:", result)

この関数はリストを [2, 4] と [3, 1, 2] に分割し、合計はそれぞれ 6 と 6、最小差は 0 になります。これがこの場合の最適解です。

  1. うまく機能する理由: 考えられるすべてのサブセットを探索し、それぞれの差を計算することで、アルゴリズムは可能な限り最小の合計の差を持つ分割を確実に見つけます。この強引なアプローチは直感的で中程度のサイズのリストには効果的であり、この古代の謎に対する明確かつ簡単な解決策を提供します。

あなたが見た上記は私の日記からの抜粋であり、100%真実です。しかし、彼女の同じバージョンのより「ストーリー化された」バージョンが利用可能です

以上が詩的な挑戦!?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。