2013-05-03 2 views
3

저는 스스로 공부하고 있습니다 MIT Open Courseware Introduction to Computer Science and Programming입니다. Problem Set 2은 치킨 너겟 상자 (6, 9 또는 20)의 합계를 계산하는 것에 기초한 디오 판틴 방정식을 포함합니다.디오 판틴 방정식을 파이썬에서 자체 목록에 반복하십시오.

알고리즘을 만들려고 생각한 방식은 막대 (막대)에 측정 값 (크기)이 표시되고 다른 조각으로 옮겨지는 가상 측정 막대를 만드는 것과 같았습니다.

숫자 라인에서 사용되었다고 상상했다면 초기 값을 지적 할 것입니다. 여기서 그 지점을 표시하고 영점을 처음 발견 한 지점으로 이동시켜 새로운 값을 만듭니다 표시하고 반복하며 항상 앞으로 나아갑니다.

그래서, 합계의 수식을 가지고 : x=0, a=x+6, 각 지금과 같은 목록에 추가 얻을 b=x+9, c=x+20 : [6,9,20]합니다. 그 다음 내가하고 싶은 일은 x이 목록에서 다음으로 큰 값으로 전환하여 목록에 추가 된 다른 변수에 대한 새 값을 만듭니다. x의 다음 값은 6이되어 다른 변수가 변경되고 결과는 [6,9,20,12,15,26]과 같은 목록이됩니다. 그런 다음 9, 등등.

내 첫 번째 문제는 중복되어 무한 루프가 발생하는 목록의 순서입니다. 나는 목록에 다시 돌아온 목록 집합을 만든 행을 추가하여이를 수정했습니다. 이것은 대부분 효과가있었습니다.

그러나 여기에 문제가 있으며 가능한 모든 값으로 목록을 채우지 않습니다. 예를 들어 48을 목록에 넣지는 않았지만 6의 분명한 배수입니다.

내 생각에 내 문제는 내가 지속적으로 편집중인 목록을 반복한다는 사실과 관련이 있다는 것입니다. /에 추가됩니다.

알고리즘을 사용하여 과제를 재 설계 할 수 있다는 것을 알고 있습니다. 연구를했기 때문에 다른 사람들이이 문제에 대한 답을 코딩 한 방법을 보았고, 지금은 이해하지만 여전히 내 자신의 문제를 해결하고 싶습니다. 문제에 대한 해결책을 프로그래밍하는 방법. 반복이 기본 컬렉션이 변경되지 기대 때문에

## Name some initial variables in diophantine equations 
x=0 
a, b, c= x+6, x+9, x+20 

## Create a list to catch values, aka fish 
fish = [a,b,c] 
## Here goes 
while x <= 60: 
    for i in fish: 
     x = i 
     fish = list(sorted(fish)) 
     a, b, c= x+6, x+9, x+20 
     ## option to see what its doing 
     print x,a,b,c 
     ## catch the values into the list 
     fish.append(a) 
     fish.append(b) 
     fish.append(c) 
     ## get rid of duplicate numbers in the list 
     fish = list(set(fish)) 
     a, b, c= x+6, x+9, x+20 


else: 
    print fish 
## Create new list of values NOT caught by the equation 

lastMissingFish = list(set(range(0,50))-set(fish)) 

## Print the last number not reached by the equation 
print lastMissingFish [-1] 
+0

문제 자체를 게시 할 수 있습니까? – Blender

+0

@Blender 문제는 6, 9 및 20의 정수 배수로 생성 할 수있는 모든 숫자를 출력하고 있다고 생각합니다. – Patashu

+0

@Blender : 문제 세트에 대한 링크를 추가하기 위해 질문을 편집했습니다. –

답변

1

당신이 이상 반복하는 동일한 컬렉션 거의 항상 좋은 생각이 아니다 수정 : 여기에 지금까지 내 코드입니다. 특히 파이썬에서 목록을 반복하면서 수정하는 것은 이상한 결과를 얻은 것 같습니다. 과 같이, 그것은 명시 적으로 인덱스를 목록을 변경 시도하고 대신 인덱스를 증가 : 참고로

## Create a list to catch values, aka fish 
fish = [0] 
## Here goes 
x, i = 0, 0 
while x <= 60 and i < len(fish): 
     x = fish[i] 
     a, b, c = x+6, x+9, x+20 
     ## catch the values into the list 
     fish.append(a) 
     fish.append(b) 
     fish.append(c) 
     ## get rid of duplicate numbers in the list. 
     fish = sorted(set(fish)) 
     i = i + 1 

, 여기에 내가 그것을 해결할 것 방법입니다. 집합에 추가 할 숫자는 모두 6의 배수 + 9의 배수 + 20의 배수로 표현할 수있는 숫자입니다. 따라서 모든 것을 반복하고 그 다음 집합으로 목록을 만듭니다. 최대 값보다 작거나 같은 모든 요소 :

def solvechickenboxes(max, x, y, z): 

    sums = set() 

    for a in range((max/x)+1): 
     for b in range((max/y)+1): 
      for c in range ((max/z)+1): 
       sums.add(a*x + b*y + c*z) 

    return [x for x in sums if x <= max] 

solvechickenboxes(50, 6, 9, 20) 

[0, 6, 9, 12, 15, 18, 20, 21, 24, 26, 27, 29, 30, 32, 33, 35, 36, 38, 39, 40, 41 
, 42, 44, 45, 46, 47, 48, 49, 50] 
+0

도와 줘서 고마워, Patashu 외. 나는 세트에서 조금 읽었지 만 튜플과 같았고 추가되거나 재주문 될 수 없다고 생각했다. 두 번째 예제의 솔루션은 내 것보다 훨씬 우아하며, 다른 생각을하는 데 도움이됩니다.그러나 첫 번째 예에서는 여전히 기발합니다. 예를 들어 0 * 6 + 1 * 9 + 2 * 20 = 49이지만 49는 목록에서 제외됩니다. 어쩌면 내 방식은 단순히 잘못된 방법 일뿐입니다. 나는 그것이 왜 잘못되었는지 이해하고 싶습니다. –

+0

@ Jason Powell'set'은 불가능하지 않고'frozenset'이 있습니다. 주문 세트에 관해서는 ... 세트의 목록()이 항상 정렬되는 것은 아니며 평소와 다릅니다. 블루? 글쎄, 그걸 보면서 '옙, 그것은 정렬되어있다.'라고 말하는 것입니다. 'list()'를'sorted()'로 변경하면 알고리즘이 작동합니다 ^^ – Patashu

+0

Patashu! 다시 ​​한 번 감사드립니다! –

관련 문제