2012-12-10 6 views
1

정말 코드에 도움이 필요합니다. 사용자는 10 개의 정수를 입력해야하며 프로그램은 가장 가까운 쌍을 표시해야합니다. itertools를 사용하여 할 수 있었지만 내 교수는 .sort(), min(), enumerate() 등을 수락하지 않습니다. 수동으로해야합니다. 여기 내가 사용 itertools 할 수 있었다 코드입니다 : 수동 가장 가까운 쌍 프로그램파이썬에서 원시 데이터 형식 만 가진 10 개의 정수 중 가장 가까운 쌍

import itertools 

a = [0,1,2,3,4,5,6,7,8,9] 

a[0]=input() 
a[1]=input() 
a[2]=input() 
a[3]=input() 
a[4]=input() 
a[5]=input() 
a[6]=input() 
a[7]=input() 
a[8]=input() 
a[9]=input() 


a.sort() 

for item in enumerate(a):    
c = min(itertools.combinations(b, 2), 
        key=lambda item: abs(item[0]-item[1])) 

print 'The closest pair/One of the closest pair is: ', c 

가 여기 내 코드는 지금까지 있습니다 :

a=[0,1,2,3,4,5,6,7,8,9] 
a[0]=input() 
a[1]=input() 
a[2]=input() 
a[3]=input() 
a[4]=input() 
a[5]=input() 
a[6]=input() 
a[7]=input() 
a[8]=input() 
a[9]=input() 

#Sorting the Array 
b = True    #para sa swapping 
while b==True: 
b= False 
for i in range(0,len(a)-1): 
    if (a[i]>a[i+1]): 
     c=a[i] 
     a[i]=a[i+1] 
     a[i+1]=c 
     b=True 

#Generate all the posible combinations of 

내가 아무리 열심히 그것을 완료 할 수 없습니다 ... 노력과 연구가 ... 내가 어떤 도움을 주셔서 감사합니다 것

감사합니다, Ailen

+0

* 내 생각에는 받아 들일 수 없습니다. * 파이썬을 전혀 사용하지 못하게합니까? – eumiro

+0

실제로는 아니지만 그는 스와핑 프로그램을 통해 나를 허용합니다. 그는 내장 된 함수를 사용하지 않고도이 작업을 수행하기를 원합니다. 나는 그걸 제대로 이해할 수 없습니다 .. 정렬 후에는 모든 것을 가져와야합니다. 가능한 조합을 빼고 서로 빼고 최소값을 얻으십시오. 그렇다면 가장 낮은 대답으로 그 두 가지 조합을 표시 할 것입니다. –

+0

가능한 모든 조합을 얻을 필요는 없으며 인접한 차이의 크기 만 가져올 수 있습니다. – dgl

답변

1

저는 교수님이 불필요하게 비효율적 인 것으로 itertools.combinations()을 사용하는 답변을 거절하는 것은 무리가 아니라고 생각합니다. 모든 조합을 볼 필요는 없습니다. 배열을 정렬하면 인접 항목 간의 가장 작은 차이를 찾고 그 항목이 가장 가까운 쌍입니다.

따라서 .sort()을 사용할 수 있는지 (자신의 정렬 알고리즘을 구현할 필요가 없는지) 그리고 인접한 값 사이의 가장 작은 차이를 찾는 루프를 작성하는 방법을 알고 있는지 여부에 대한 질문이 나옵니다. 나는 그 두 가지를 모두 연습 문제로 남겨 둘 것입니다.

+0

네 선생님 던컨, 내가 말했듯이 ... 나는 8 번 반복하면서 사용한다. 오히려 길지만 작동한다 : DI는 게시 할 수 없다. 그것은 여기에 아주 오래 있기 때문에 .. 도와 주셔서 감사합니다 :) –

0
당신은 단지 다음 각 번호보고에 의해 매우에 효율적으로 그렇게 할 수

보라 당신은 그것과 쌍을 이룰 수있는 각 (다른) 번호에 oking. 가능한 쌍마다 반복 한 후에 가장 가까운 쌍을 반환 할 수 있습니다. , 당신이이 일을 왜 이해하려고 노력하는 이유 제안이로

i = -1 
j = -1 
for number1 in numbers: 
    i += 1 
    for number2 in numbers: 
     j += 1 
     if i != j: #Otherwise we'd always have numbers[0], numbers[0] as pair! 
      pair = number1, number2 
      if closest_pair is None or pair_distance(pair) < pair_distance(closest_pair): 
       closest_pair = pair 

숙제입니다 :

numbers = [7,15,0,4,3,12,76] 


def pair_distance(pair): 
    return abs(pair[0] - pair[1]) 

closest_pair = None 

for i, number1 in enumerate(numbers): 
    for j, number2 in enumerate(numbers): 
     if i != j: #Otherwise we'd always have numbers[0], numbers[0] as pair! 
      pair = number1, number2 
      if closest_pair is None or pair_distance(pair) < pair_distance(closest_pair): 
       closest_pair = pair 


print "The closest pair is", closest_pair 

내 나쁜

는, 그 열거 허용되지 놓쳤다 이것을 켜기 전에 비효율적입니다!

의견에서 제안 된대로 목록을 먼저 정렬하면보다 효율적인 솔루션을 제공 할 수 있습니다.


그러나이 작업에는 Python을 사용하지 않아야한다고 생각합니다. 고수준 언어로 저수준 구조를 사용하는 것에 대한 학습 가치는별로 없습니다.

+0

'enumerate'는 분명히 no-no입니다 :) –

+0

' 열거 형'은'range()'또는'len()'에 대해서 금지되어 있습니까? 허용되는 * 것이 있어야합니다. – Duncan

+0

@JonClements 오, 나는 이것을 놓쳤다. 글쎄, 그것을 사용하지 않고 대답을했다. 그러나 어떤 점에서 OP가 파이썬을 사용해야 할지도 모르겠다! –

1

이 내용을 확인해보십시오.

# fill the array with input 
a = [int(num) for num in raw_input().split(" ")] 

# REVERSE sorting the array 
for j in range(len(a) - 1, -1, -1): 
    for i in range(0, j): 
     if (a[i] < a[i+1]): 
      c = a[i] 
      a[i] = a[i+1] 
      a[i+1] = c 

min = a[0] + a[1] 

for i in range(0, len(a) - 1):  
    if min > a[i] - a[i + 1]: 
     min = a[i] - a[i + 1] 

print min