Как я могу исправить эту пифагорейскую программу Triplet? - PullRequest
0 голосов
/ 25 октября 2018
import sys

def pythTrue(a,b,c):
    (A,B,C) = (a*a,b*b,c*c)
    if A + B == C or B + C == A or A + C == B:
        return True

def smallestTrip(a,b,c):
    if pythTrue(a,b,c) == True:
        if (a+b+c)%12 == 0:
            return True
        else:
            return False

def tuplePyth(n):
    list_=[]
    for x in range(1, n):
        for y in range(1, n):
            for z in range (1, n):
                if x+y+z<=n:
                    if smallestTrip(x, y, z)==False:
                        list_.append([x,y,z])
    print (list_)

tuplePyth(int(sys.argv[1]))

Пифагорейские триплеты - это наборы из 3 натуральных чисел a, b, c, удовлетворяющих соотношению a 2 + b 2 = c 2 .Наименьшая и самая известная пифагорейская тройка есть (a, b, c) = (3, 4, 5).Напишите программу, которая читает аргумент командной строки n и выводит на экран все пифагорейские триплеты, сумма которых меньше n (то есть a + b + c

  • функция, которая принимает кортеж и возвращает логическое значение, указывающее, выполняется ли отношение Пифагора или нет.
  • функция, которая принимает кортеж и возвращает логическое значение, указывающее, является ли триплет кратным наименьшего триплета или нет.
  • функция, которая принимает целое число n и генерирует пифагорейские триплеты, как указано выше.Функция должна возвращать список кортежей.

Основная часть вашей программы pythagore.py будет читать данные из командной строки, вызывать последнюю функцию, описанную выше, и печатать результаты по одному триплету на строку..

Моя проблема в том, что я получаю одну и ту же комбинацию в разных заказах, например: (5,12,13), (13,12,5) ... и т. Д.

Ответы [ 4 ]

0 голосов
/ 26 октября 2018

Вы можете использовать itertools:

 import itertools.combinations_with_replacement as cwr
 list_ = [triple for triple in cwr(range(n),3) if sum(triple)<n and not smallestTrip(triple)]

Вы также можете заставить числа быть в порядке с ограничениями.Кроме того, вы можете упростить поиск a, b, c, поняв, что если мы определим a как наименьшее число, то оно должно быть меньше n / 3 (b и c оба будут как минимум такими же большими, как a, поэтому если aбыли бы больше чем n / 3, тогда сумма a, b и c была бы больше чем n).Аналогично, b должно быть меньше, чем n / 2.Как только вы нашли все комбинации a и b, вы можете найти все c, которые больше, чем b, и меньше, чем nab.

list_=[]
for x in range(1, n//3):
    for y in range(x+1, n//2):
        for z in range (x+y+1, n-x-y):
                if not smallestTrip(x, y, z):
                    list_.append([x,y,z])
0 голосов
/ 25 октября 2018

Поскольку три числа никогда не совпадают, вы можете просто изменить второй и третий диапазон с (1, n) на (x + 1, n) и (y + 1, n) соответственно.

0 голосов
/ 25 октября 2018

Простым решением было бы отслеживать те, которые были найдены, и добавлять проверки, чтобы избежать их повторения.Следующее использует set для хранения уже произведенных и сортирует элементы в каждой тройке так, чтобы их порядок не имел значения.

def tuplePyth(n):
    list_=[]
    seen = set()
    for x in range(1, n):
        for y in range(1, n):
            for z in range (1, n):
                if tuple(sorted((x,y,z))) not in seen:
                    if x+y+z <= n:
                        if smallestTrip(x, y, z) == False:
                            list_.append([x,y,z])
                    seen.add((x,y,z))
    print (list_)
0 голосов
/ 25 октября 2018

У вас мало логики в вашей основной рутине.Ничто не может гарантировать, что тройка приходит только в одном порядке: ваши x и y являются взаимозаменяемыми, и вы гарантируете, что вы проверите оба.ограничения, а затем убедитесь, что вы останавливаетесь, когда значение y или z становится слишком большим, чтобы быть жизнеспособным.Обратите внимание, что это избавляет вас от чека на сумму трех.

def tuplePyth(n):
    list_=[]
    for x in range(1, n):
        for y in range(1, n):
            for z in range (1, n):
                if x+y+z<=n:
                    if smallestTrip(x, y, z)==False:
                        list_.append([x,y,z])
    print (list_)

Вместо:

def tuplePyth(n):
    list_=[]
    for x in range(1, n):
        for y in range(x + 1, (n - x) // 2):
            for z in range (y + 1, n - x - y):
                if smallestTrip(x, y, z)==False:
                    list_.append([x,y,z])
    print (list_)

Вывод с n = 100:

[[5, 12, 13], [7, 24, 25], [8, 15, 17], [9, 40, 41], [15, 36, 39], [16, 30, 34], [20, 21, 29]]

Обратите внимание, что у вас все еще есть проблема с smallestTrip: ваш чек логически не эквивалентен «наименьшей тройке».Вместо этого проверьте, что три числа относительно простые.Поскольку переполнение стека допускает только один вопрос на публикацию, и проблема легко исследуется в режиме онлайн, я оставлю это в качестве упражнения для студента.: -)

...