> 백엔드 개발 > 파이썬 튜토리얼 > 시적인 도전!?

시적인 도전!?

DDD
풀어 주다: 2024-09-18 17:41:29
원래의
760명이 탐색했습니다.

2024년 9월 6일: 문제 자체에 대한 논의로 넘어가기 전에 배경 이야기를 살펴보겠습니다. 책 속의 열린 수학 도전,
도서관에 있는 1984년의 오래된 책. 이름은 잊어버렸지만 "추가 읽을거리..." 섹션에서 매우 흥미로운 문제에 대한 그림을 얻었습니다.
A, 어, 시적 수수께끼... 네, 잘 들으셨죠. 고대 영어 시 형식으로 쓰여진 수학 문제입니다.
고등학교 때부터 나는 시의 팬이 아니었는데, 이 시가 내 관심을 끌었습니다. 읽으면서 뭔가 이해한 것 같았지만 완전히 이해하지는 못했습니다. 우화, 용 등에 관한 퍼즐을 이해하기 위해 6시간 이상을 소비합니다. 하지만 한 가지가 나를 사로 잡았습니다. 바로 보석이었습니다. 여기를 완전히 이해할 수 있는 시가 있습니다:

**별들이 고요히 윙윙거리는 조프라리아의 끝없는 경이로운 땅에서

그리고 고대 용이 시간과 조류가 하나인 하늘을 지키고 있습니다.

지혜로운 노현이 조용히 살았고, 그의 지식은 언제나 방대했습니다.

시인이 운율을 만들듯이 누구의 손이 마법의 실을 엮을 수 있었습니까?

어느 날, 높은 하늘에서 불과 금의 날개를 타고

신화와 전설에 따르면 현자에게 내려진 선물은 다음과 같습니다.

별의 파편처럼 빛나는 보석으로 가득한 광대한 보물

그러나 화성만큼 오래된 규칙을 지닌 운명의 예언에 묶여 있습니다.

하늘이 그에게 부드럽지만 분명한 메시지를 속삭였습니다.

"이 빛나는 보석을 신중한 마음과 귀로 둘로 나누십시오.

여러분이 제작한 두 그릇이 거의 공유되는 무게를 지탱하게 하세요.

그들 사이의 조화는 밝고 공정하게 균형을 이루고 있습니다.

하지만 우리의 말을 들어주세요, 현자님, 완벽한 일치가 당신의 판단을 넘어서 패배한다면

탐구에 절망하지 마십시오. 여전히 여정은 끝나지 않을 것입니다.

밸런스가 기울더라도 약간의 변화가 있을 수 있습니다.

하늘은 여전히 ​​당신에게 미소를 지을 것이며, 축복이 넘쳐흐를 것입니다."

용기와 지혜를 겸비한 현자는 신성한 시험을 시작했습니다.

같은 그릇을 만들고, 스타들에게 최선을 다하세요.

용들은 높은 곳에서 원을 그리며 천사들은 비행을 멈추었습니다.

균형을 이루는 이 임무에는 빛처럼 순수한 진실이 놓여 있기 때문입니다.

현자가 바뀌기 전의 과거의 비밀과도 같은 보석

모든 선택으로 운명이 결정되었고 마음은 불타오르기 시작했습니다.

앞으로의 일이 벅찼지만, 스타들은 여전히 ​​감탄했다

꾸준한 손길로 우주의 불의 균형을 찾으려고 노력한 현자입니다.

그리고 끝없는 하늘 아래, 어떻게 이야기가 끝났는가

찾는 사람, 감히 눈을 들어 보는 사람에게만 알려져 있습니다.

오래된 이야기가 지속되는 조프라리아의 끝없는 영역에서

어떤 사람들은 현자가 아직도 마음과 정신이 순수하여 숙고하고 있다고 말합니다.

고요한 하늘에는 훌륭하고 희귀한 균형이 놓여 있습니다.

손재주가 있는 자만이 나눌 수 있는 하모니**

이 시가 이상하네요. 그리고 수학책에서는 무엇을 하고 있는 걸까요? 이것은 현대 웨스트민스터 어딘가에 쓰여진 새로운 퍼즐, 1600년대의 퍼즐이 아닙니다.
그래도 AI는 우리의 좋은 친구죠. 뭐가 이상하다고 대답했는지 물어보니 AI도 똥 하나도 못 알아듣는 것 같더라고요.

A Poetic Challenge !?
그것은 내가 창조했다고 생각했지만, 나는 그렇지 않았습니다. 하지만 GPT-4는 어떻습니까? 그것이 똥을 알고 있는지 물어 봅시다. 그 분은 나의 영어 선생님이 되었습니다.

A Poetic Challenge !?

A Poetic Challenge !?

알겠습니다. 직접 디코딩해야 합니다. 시도해 보세요.

2024년 9월 9일: "주의 깊게 마음과 귀를 기울여 이 빛나는 보석을 둘로 나누십시오.

당신이 제작한 두 그릇이 거의 공유되는 무게를 지탱하게 하세요.

그들 사이의 조화는 밝고 공정하게 균형을 이루고 있습니다.

하지만 우리의 말을 들어주세요, 현자님, 완벽한 일치가 당신의 판단을 넘어서 패배한다면

탐구에 절망하지 마십시오. 여전히 여정은 끝나지 않을 것입니다.

밸런스가 기울더라도 약간의 변화가 있을 수 있습니다.

하늘은 여전히 ​​당신에게 미소를 지을 것이며, 축복이 넘쳐날 것입니다."

이것이 이야기의 주요 부분이며 해독해 보겠습니다.
죄송합니다. 3일 넘게 계속해서 고민하다가 힌트를 얻었습니다.
보석은 "주의 깊게 마음과 귀를 기울여"라는 말처럼 숫자가 될 수 있습니다.
그릇은 집합일 수도 있지만 그때까지 집합의 개념이 발견되지 않았기 때문에 틀렸을 수도 있습니다.
위의 추출은 동일한 수의 요소로 구성된 두 세트를 의미하거나 세트의 숫자 합계가 동일함을 의미할 수 있습니다. 합계가 동일하지 않은 경우 가장 가까운 합계가 표시될 수 있습니다.

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 코드가 이 문제를 어떻게 해결하는지 분석해 보겠습니다.

  1. 문제 이해:
    목표는 주어진 목록에서 두 개의 하위 목록을 찾아 그 합이 최대한 가까워지는 것입니다. 완벽한 분할이 존재하는 경우(두 하위 목록의 합이 동일한 경우) 두 개의 하위 목록을 반환합니다. 그렇지 않으면 두 합계의 차이가 가장 작은 분할을 반환합니다.

  2. 코드 구조:

코드의 핵심은 목록에서 가능한 모든 요소 조합을 생성하여 하위 목록 중 하나를 형성하는 데 있습니다. 하위 목록을 선택하면 나머지 요소에 의해 다른 하위 목록이 자동으로 형성됩니다. 그런 다음 그 합을 비교하여 차이가 최소화된 최상의 분할을 찾습니다.

  1. 주요 기능 및 개념:
  • combinations(lst, i): 목록에서 길이 i의 가능한 모든 조합을 생성합니다. 각 하위 집합에 대해 하위 목록 중 하나를 시뮬레이션하고 나머지 요소는 다른 하위 목록을 형성합니다.

  • total_sum = sum(lst): 목록의 총합을 계산합니다. 전체 합에서 현재 하위 집합의 합을 빼서 다른 하위 목록의 합을 쉽게 구할 때 사용됩니다.

  • best_diff = float('inf'): 지금까지 발견된 가장 작은 차이를 추적하기 위해 변수 best_diff를 큰 수(무한대)로 초기화합니다. 가능한 각 분할을 진행하면서 작은 차이가 발견되면 이 값을 업데이트합니다.

  • 최적의 분할 찾기: 생성된 각 하위 집합에 대해 코드는 두 하위 목록 합계 간의 차이를 계산합니다. 현재 차이가 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿