2016-10-06 4 views
0

저는 Python을 처음 접했고 프로젝트 오일러에서 몇 가지 과제를 수행하여 코딩을 향상시키는 것이 좋습니다. 나는 현재 4 번 문제에 봉착하고 무엇이 잘못 될지 확신하지 못한다. (알지 못하는 문제 4는 다음과 같다.)Project Euler - 가장 큰 Palindrome # 4 Python

팔린 드롬 숫자는 같은 방법으로 읽는다.

개의 2 자리 숫자의 생성물로부터 제조 된 큰 회문는 9009 = 91 X 99

두 3 자리 숫자의 생성물로부터 제조 된 큰 회문 찾기이다.

x, y = 999, 999 
palindrome = [] 
while True: 
    palindrome = [i for i in str(x * y)] 
    r_palindrome = palindrome[::-1] 
    if palindrome == r_palindrome: 
     break 
    else: 
     y -= 1 
     if y < 100: 
      y = x 
      x -= 1 
print x, y, palindrome 

나는 지독하게 낮은 느낌 대답 987 * 286 = 282282을받을 것으로 보인다. 누군가이 일을하는 가장 좋은 방법을 설명 할 수 있고 현재 코드가 단순한 "여기에 코드가 있습니다"라고 대답하는 것이 아니라 잘못된 것을 수행 할 수 있습니까?

+1

왜 제품이 평탄한 지 확인하고 계십니까? 내가 놓친 게 있니? –

+0

나는 이것을 실행할 때 "982 869 [ '8', '5', '3', '3', '5', '8'] '를 얻는다. – GreenAsJade

+0

죄송합니다. 편집 할 때 미안합니다. 음, 아마도 내 논리가 끔찍한 것일 수도 있습니다. – Warmley

답변

3

x = 999y = 999에서 시작하고 당신이 감소 x으로 다시 시작하고 먼저 가장 큰 회문을 칠 것이라는 점을 리셋 y 당신을 보장하지 않을 때까지 만 y을 감소시키는.

다음 예를 생각해 봅시다 : 제품에 대한 다른 요구 사항을 상상해 봅시다 (여기서 회문 결과를 망칠 수는 없습니다). x = 999으로 시작하여 처음 "유효한"결과를 얻을 때까지 y = 101에 도달했다고 가정 해보십시오.

귀하의 경우 가장 큰 결과는 999 * 101 = 100899입니다. 그러나 실제로는 전혀 다른 솔루션 인 998 * 998 = 996004이있을 수 있지만 분명히 훨씬 큽니다.

그래서 어떻게하면 멈출 지 결정하고 가장 큰 숫자에 도달했는지 확인해야합니다.


btw. 프로젝트 오일러에 대한 일반적인 힌트 : 특히 첫 번째 문제는 무차별 대입 (즉, 가능한 모든 해결책을 시도)으로 쉽게 해결할 수 있습니다. 이것은 아마도 당신이 현명한 방법으로 문제를 해결했다는 만족감을주지는 못하지만, 거기에 도달하는 방법에 대한 아이디어를 줄 것입니다. 당신은 항상 다음 더 나은 솔루션을 작동하지만 프로젝트 오일러 실제로이 많은 무력을 사용하여 완전히 불가능 문제 어쨌든, 당신에 대해 나중에 걱정할 정도로 그래서 것을 명심 수)이 특정 들어

문제는, 당신은 모든 문장을 줄 것이고 최대를 얻을 수있는 목록 이해력을 쓸 수 있습니다. 그것은 한 - 라이너입니다; 그것은 매우 비효율적하지만 특히 작은 입력 도메인에 대해, 그것은 여전히 ​​당신에게 즉시 대답을 줄만큼 빨리 :의 사용하자, 바로 해결책을 찾기 위해, 무력

max([(x * y, x, y) for x in range(100, 1000) for y in range(100, 1000) if str(x * y) == str(x * y)[::-1]]) 
0

확인을 :

>>> prod = itertools.product(range(999,99,-1),range(999,99,-1)) 
>>> palindromes = [(x*y,x,y) for x,y in prod if str(x*y) == str(x*y)[::-1]] 
>>> max(palindromes, key=lambda t: t[0]) 
(906609, 993, 913) 

가 툭를 약간의 시간이 있지만, 적어도 우리에게는 해답이 있습니다.나는 매우 빠르게 작동하는 솔루션을 일했다, 나는 당신이 달성하려고했는지의 본질합니다 생각 : 기본적으로

>>> x = 999 
>>> palindromes = [] 
>>> floor = 99 
>>> while x > floor: 
...  for i in range(x,floor,-1): 
...   product = x*i 
...   candidate = str(product) 
...   if candidate == candidate[::-1]: 
...    palindromes.append((product,x,i)) 
...    floor = i 
...    break 
...  x -= 1 
... 
>>> palindromes 
[(580085, 995, 583), (906609, 993, 913), (886688, 968, 916), (888888, 962, 924)] 
>>> 

을,이 마지막으로 우리에게 회문을 준 낮은 번호와 함께 바닥을 업데이트 . 우리는 매번 저것보다 낮게 보지 않아도된다는 것을 압니다.