( связанный )
Тройка Пифагора - это список, (a, b, c)
который удовлетворяет уравнению a 2 + b 2 = c 2 .
Примитивный Пифагор Тройной (ППТ) является одним где a
, b
и c
являются все взаимно простым (т.е. единственным общий делитель между тремя элементами 1
). Например, (3, 4, 5)
правый треугольник - это знаменитая примитивная пифагорейская тройка.
Соревнование
- Учитывая ввод
n
,n
выводим PPT. Или, - Учитывая ввод
n
, выведите первыеn
PPT.
Существует несколько способов упорядочить эти PPT, чтобы сформировать упорядоченный список, чтобы определить, какой именно n
. Вы можете выбрать любой порядок, который захотите, при условии, что вы можете доказать (неофициально это хорошо), что ваш алгоритм может генерировать все возможные уникальные PPT. Например, ваш код не должен выводить оба, (3,4,5)
и, (4,3,5)
поскольку они являются дубликатами одной и той же тройки - одной или другой, пожалуйста.
Точно так же, независимо от того, является ли ваш код нулевым или индексируемым, это нормально, если вы указываете, какой код используете.
Примеры
Для приведенных ниже примеров я использую одноиндексирование, вывод n
th-го PPT и упорядочение по наименьшему c
, затем наименьшему a
, а затем наименьшему b
.
n | output
1 | (3, 4, 5)
2 | (5, 12, 13)
5 | (20, 21, 29)
12| (48, 55, 73)
правила
- Ввод и вывод может быть дан в любом удобном формате .
- В своем представлении, пожалуйста, укажите, как упорядочены ваши записи, а также, проиндексированы ли они 0 или 1.
- Выбранный вами заказ не может создавать дубликаты.
- Допустимы либо полная программа, либо функция. Если функция, вы можете вернуть вывод, а не распечатать его.
- Если возможно, укажите ссылку на среду онлайн-тестирования, чтобы другие люди могли опробовать ваш код!
- Стандартные лазейки запрещены.
- Это код-гольф, поэтому применяются все обычные правила игры в гольф, и выигрывает самый короткий код (в байтах).
источник
Ответы:
Желе ,
2725 байт2 байта благодаря Джонатану Аллану.
Попробуйте онлайн!
Выводит первые
n
1-индексированные тройки[b, a, c]
, отсортированные по возрастанию,b
а затемa
.Использует алгоритм из Википедии :
Это генерирует все примитивные тройки для всех уникальных взаимно простых пар нечетных целых чисел
m > n > 0
.объяснение
источник
g/Ị$Ðf
->g/ÐṂ
сохранить два байта (так как минимальный gcd равен 1, и всегда будет хотя бы одна такая запись).+2ḶḤ‘Œc
на²Rm2Œc
- лом, что он не будет работать для ввода1
:(²ḶḤ‘Œc
был одним из первых, о которых я подумал.)MATL , 36 байт
Вход основан на 1. Порядок вывода гарантирует, что каждая тройка появляется ровно один раз. Порядок объясняется следующим. Объяснение требует немного углубиться в то, как работает программа.
Код продолжает увеличивать счетчик
k
в цикле, начиная с1
. Для каждогоk
он генерирует все пары сa = 1,...,k
,b = 1,...,k
,a < b
, и выбирает те , которые дают пифагореец с тройнымc <= k
. Пары получаются в порядке возрастанияb
, а затемa
.Затем каждая пара делится на свой gcd. Результирующие (возможно, дублированные) пары расположены в виде матрицы из двух столбцов. Эта матрица вертикально соединена с аналогичной матрицей, содержащей накопленные результаты, полученные для меньших значений
k
. Строки матрицы затем стабильно дедуплицируются. Это удаляет два типа дубликатов:Пары, которые были найдены более одного раза для текущего
k
(например3,4
, который также возникает6,8
при делении на его gcd);Пары, которые уже были найдены с меньшими
k
.Фактически, каждая итерация
k
находит все пары, которые уже были найдены для предыдущих итераций. Но он может найти их в другом порядке . Например,k=25
найдет тройку,7,24,25
а не20,21,29
(потому чтоc
не может превыситьk
). Позже, итерацияk=29
найдет оба, но с20,21,29
до7,24,25
(порядок увеличиваетсяb
, тогдаa
). Вот почему вместо того, чтобы сохранять все пары, найденные для последнихk
, мы добавляем их к предыдущим и стабильно дедуплицируем. Это гарантирует, что порядок одинаков для любого вводаn
.Вышеуказанное гарантирует, что каждая примитивная пифагорейская тройка в конечном итоге появится, и она появится только один раз. Для ввода
n
циклk
завершается, когдаn
получены хотя бы действительные тройки; и тогдаn
тройная тройка - это выход.Попробуйте онлайн!
Или используйте этот модифицированный код, чтобы увидеть первые
n
тройки:Попробуйте онлайн!
источник
Haskell , 98 байт
Попробуйте онлайн!
Как это работает
Это интерпретирует биективные 3- значные цифры n как путь вниз по дереву примитивных пифагорейских троек . Он работает без поиска в O (log n ) операциях.
источник
Желе ,
1918 байтПрограмма берет основанный на 1 индекс n и печатает первые n PPT [c, b, a] в лексикографическом порядке.
Это решение O (64 n ) , поэтому TIO будет подавлять входы 4 и выше. Я буду работать над тем, чтобы сделать это быстрее.
Попробуйте онлайн!
Альтернативная версия, O (n 3 ), возможно, действительная
Чтобы найти n- й триплет - [c n , b n , a n ] - в приведенном выше решении предполагается, что c n ≤ 4 n , что легко проверить. Однако A020882 доказывает, что c n ~ 2πn , поэтому существует такое k , что c n ≤ kn для всех n .
Если мы можем принять k = 7 , решение, приведенное ниже, также верно (и намного, намного быстрее).
Попробуйте онлайн!
Как это работает
источник
JavaScript (ES7),
106105103 байтВыводит N-ую PPT. Результаты индексируются 1 и упорядочиваются по значению b .
демонстрация
Показать фрагмент кода
источник
MATL , 63 байта
Попробуйте онлайн!
Урок игры в гольф прошел ужасно неправильно. В любом случае я публикую это, потому что мне интересно, есть ли способы поиграть в гольф лучше.
Я основал это на этой странице Википедии в сочетании с формулой Евклида, чтобы конструктивно генерировать все тройки, а не метод проб и ошибок.
Во-первых, нечетные взаимно простые пары генерируются как троичное дерево. Это делается как большое матричное умножение, учитывающее большую часть количества байтов. Затем применяется формула Евклида, возможно, также очень бесполезно. Если у кого-то есть советы по этим двум частям, я бы хотел их услышать.
Обратите внимание, что для сохранения байтов эта программа генерирует дерево той же глубины, что и вход, а не
log3(n)
. Кроме того, дочерние элементы создаются для каждой строки, а не только для последней строки дерева, а затем снова фильтруются с помощьюXu
. Вот вам и эффективный конструктивный подход.источник
Haskell, 65 байт
Индексирование на основе 0. Для данного
c
,b
работает доc
иa
доb
, такc > b > a
всегда имеет место.Попробуйте онлайн!
источник
Python,
67504846 байтИспользуя формулы, найденные в Википедии,
a=m*n, b=(m^2-n^2)/2, c=(m^2+n^2)/2
где
m>n>0
иm
иn
взаимно просты и нечетны. Вот код-17 байт благодаря @Martin Ender
Попробуйте онлайн
Работает, всегда имея значение
n
переменной в уравнении, равное 1, что означает, что этоm
просто любое другое нечетное значение, в данном случае,3+2*n
гдеn
число примитивной пифагорейской тройки. Это позволяет нам принять значение 1 для всехn
значений.источник
a
(и если вы это сделаете, вы можете избавиться от этих двух пробелов). Я также не уверен, почему выprint
там, вы можете просто вернуть значения из самой лямбды.Шелуха , 18 байт
Попробуйте онлайн!
-4 байта спасибо Згарбу, с вдохновением от Дениса
Подход с использованием супер-медленной грубой силы, не будет работать на TIO для входов больше 1. Вы можете попробовать более управляемую версию, ограниченную a, b≤200 здесь
объяснение
источник
c
? в этом случае это решение должно быть исправленоc
. Это 18-байтовое решение (которое использует другую хитрость Денниса) работает независимо.Mathematica, 89 байт
с помощью Solve по заказу c
Mathematica, 124 байта
источник
R (+ цифры), 88 байт
Для использования встроенной функции для генерации чисел требуется поразительное количество байтов, чтобы получить то, что мы хотим. Встроенный принимает два аргумента
c1
иc2
, и возвращает те тройки, которые имеютc >= c1 & c <= c2
. Это делает его немного раздражающим, чтобы добраться до 3-гоn
триплета. Это будет только увеличиватьc2
1 за раз, пока на выходе не будет достаточно строк.источник
PHP , 273 байта
t($n)
возвращает массив [a, b, c] с упорядочениемa < b < c
Попробуйте онлайн! (там тоже код читаемый)
источник
C 158 байтов
Я считаю, что это мое первое представление здесь, так что вы, скорее всего, можете сделать лучше.
И негольфированная версия:
Для a 2 + b 2 = c 2 упорядочение увеличивается c, затем увеличивается a .
В этом алгоритме не может быть дважды одинакового PPT, как b , по крайней мере, a .источник
Желе ,
2725 байтЭто реализация древовидного подхода из ответа Хаскелла @ AndersKaseorg , с другим порядком ветвления. Программа использует индексирование на основе 0 и получает данные от STDIN.
Попробуйте онлайн!
Задний план
Как уже упоминалось на странице Википедии Дерево примитивных пифагорейских троек , каждый PPT может быть получен путем многократного умножения влево вектора строки (3, 4, 5) на матрицы с определенными свойствами.
В каждой итерации предыдущий результат можно умножить влево на A , B или C , что можно выбрать следующим образом.
Когда А , Б и С фиксированы, каждый PPT может быть получен уникальным образом.
Как это работает
источник
APL (NARS), 90 символов, 180 байтов
если аргумент вышеприведенной функции равен above, то вышеприведенная функция вернет элемент индекса based (на основе 1) массива, который содержит элементы пифагорейских троек (a, b, c), где a <= b <= c и этот массив сначала порядок для a (сторона более короткая), затем для b (другая сторона не гипотенуза). Там было бы что-то не так, потому что там не видел, где я тоже заказываю на b ... test:
это связано с http://oeis.org/A020884 и http://oeis.org/A020884/b020884.txt
A020884: Заказаны короткие ножки из примитивных пифагорейских треугольников.
Я не знаю, верно ли это, кажется, что функция дает правильный результат с первой стороны треугольника до 1000, но я не знаю, для остатка, и возможно, может быть некоторая тройка не так, даже <1000.
источник
JavaScript, 101 байт
По формуле Евклида все примитивные пифагорейские тройки могут быть получены из целых чисел
m
иn
сm>n>0
,m+n
нечетнымgcd(m,n)==1
( Wikipedia )Эта функция перечисляет все
m,n
пары, увеличивающие m, начиная сm=2
и уменьшаяn
на 2, начиная сm-1
(так чтоm+n
это нечетно)Меньше гольфа
Тест
источник