Найти, если список является ABC-тройкой

16

Три натуральных числа A, B, C являются ABC-тройными, если они взаимно просты, с A <B и удовлетворяющими соотношению: A + B = C

Примеры :

  • 1, 8, 9 является ABC-тройкой, поскольку они взаимно просты, 1 <8 и 1 + 8 = 9
  • 6, 8, 14 не потому что они не взаимно просты
  • 7, 5, 12 не потому что 7> 5

Вы можете увидеть эту презентацию Frits Beukers 2005 для более подробной информации о ABC-тройках.

Ввод, вывод

Три целых числа, десятичное написано. Могут быть разделены значения или список. Вывод должен был быть истинным / ложным значением, являются ли три целых числа ABC-тройкой.

Примечание. Важно соблюдать порядок целых чисел в списке, например: 1, 8, 9он не считается тем же списком, что 9, 1, 8и любая другая комбинация. Таким образом, первый ABC-тройной, а второй нет.

Таким образом, A является первым элементом списка, B - вторым, а C - третьим.

Контрольные примеры

Каждый из следующих списков должен выводить истинное значение

[1, 8, 9]
[2, 3, 5]
[2, 6436341, 6436343]
[4, 121, 125]
[121, 48234375, 48234496]

Каждый из следующих списков должен выводить значение Falsey

[1, 1, 2]
[1, 2, 5]
[1, 9, 8]
[4, 12872682, 12872686]
[6, 8, 14]
[7, 5, 12]
Дэвид
источник
Должен ли вывод быть только одним из двух значений, или мы можем вывести разные значения истинности / ложности для разных входов?
Луис Мендо
Я думаю, что это должно быть непротиворечивым: ваш код должен выводить один тип истинных / ложных значений независимо от ввода. Но пара правдивых / ложных может быть тем, что вы хотите, поскольку она выполняет свою работу: дифференцирует списки.
Дэвид
Если мы берем входные данные как список из трех значений, должен ли ввод быть в порядке [A,B,C], или нам также разрешено принимать входные данные в порядке [C,B,A]или [C,A,B]?
Кевин Круйссен
Вы должны соблюдать порядок, так как A <B является критерием в вызове.
Дэвид
1
Я не думаю, что требование определенного порядка списков совместимо с тем, что входные данные можно принимать как отдельные значения, так как отдельные значения изначально неупорядочены и могут быть приняты как список .
Деннис

Ответы:

8

Желе , 10 9 байт

Ṫ=S×</=g/

Попробуйте онлайн!

Как это устроено

Ṫ=S×</=g/  Main link. Argument: [a, b, c] (positive integers)

Ṫ          Tail; pop and yield c.
  S        Take the sum of [a, b], yielding (a + b).
 =         Yield t := (c == a + b).
    </     Reduce by less than, yielding (a < b).
   ×       Multiply, yielding t(a < b).
       g/  Reduce by GCD, yielding gcd(a, b).
      =    Check if t(a < b) == gcd(a, b).
Деннис
источник
8

Haskell , 48 38 29 байт

-10 байт из - за TFeld «S gcdтрюк!

-7 байт благодаря HPWiz за улучшение теста на совместность и определение лишнего пространства!

-2 байта спасибо Ними за предложение инфикс-оператора!

(a!b)c=a<b&&a+b==c&&gcd a b<2

Попробуйте онлайн!

объяснение

Первые два условия a < bи a + b == cдовольно очевидны, третий использует, что gcd(a,b)=gcd(a,c)=gcd(b,c) :

Запись gcd(a,c)=Ua+Vc с использованием тождества Безу и подстановки c=a+b дает:

Ua+V(a+b)=(U+V)a+Vb

Так как НОД это минимальное положительное решение этой идентичности следует , что НОД ( , б ) = НОД ( , гр ) . Другой случай симметричен. gcdgcd(a,b)=gcd(a,c)

ბიმო
источник
1
Кроме того, я считаю, что вам нужно только это gcd a b==1. Так как gcd a bделит a+b=c. то естьgcd(gcd a b)c=gcd a b
H.PWiz
@HPWiz: Ах да, конечно, спасибо! Будет редактировать позже, когда не на мобильном телефоне ..
მოიმო
7

Perl 6 , 33 32 байта

-1 байт благодаря nwellnhof

{(.sum/.[2]/2*[<] $_)==[gcd] $_}

Попробуйте онлайн!

Блок анонимного кода, который принимает список из трех чисел и возвращает True или False.

объяснение

{                              }  # Anonymous code block
                       [gcd] $_   # Is the gcd of all the numbers
 (                  )==           # Equal to
  .sum        # Whether the sum of numbes
      /       # Is equal to
       .[2]/2 # The last element doubled
             *[<] $_   # And elements are in ascending order
Джо Кинг
источник
2
32 байта
nwellnhof
5

Excel, 33 байта

=AND(A1+B1=C1,GCD(A1:C1)=1,A1<B1)
Wernisch
источник
4

Баш, 61 байт

factor $@|grep -vzP '( .+\b).*\n.*\1\b'&&(($1<$2&&$1+$2==$3))

Попробуйте онлайн!

Ввод в качестве аргументов командной строки, вывод в коде выхода (также производит вывод на stdout как побочный эффект, но это можно игнорировать).

Вторая часть (начиная с &&(() довольно стандартная, но интересным является простой тест:

factor $@      # produces output of the form "6: 2 3\n8: 2 2 2\n14: 2 7\n"
|grep -        # regex search on the result
v              # invert the match (return truthy for strings that don't match)
z              # zero-terminated, allowing us to match newlines
P              # perl (extended) regex
'( .+\b)'      # match one or more full factors
'.*\n.*'       # and somewhere on the next line...
'\1\b'         # find the same full factors
Дверная ручка
источник
последний &&может быть изменен &из-за старшинства
Науэль Фуйе
4

Java 10, 65 64 байта

(a,b,c)->{var r=a<b&a+b==c;for(;b>0;a=b,b=c)c=a%b;return r&a<2;}

-1 байт спасибо @Shaggy .

Попробуйте онлайн.

Объяснение:

(a,b,c)->{        // Method with three integer parameters and boolean return-type
  var r=          //  Result-boolean, starting at:
        a<b       //   Check if `a` is smaller than `b`
        &a+b==c;  //   And if `a+b` is equal to `c`
  for(;b>0        //  Then loop as long as `b` is not 0 yet
      ;           //    After every iteration:
       a=b,       //     Set `a` to the current `b`
       b=c)       //     And set `b` to the temp value `c`
    c=a%b;        //   Set the temp value `c` to `a` modulo-`b`
                  //   (we no longer need `c` at this point)
  return r        //  Return if the boolean-result is true
         &a<2;}   //  And `a` is now smaller than 2
Кевин Круйссен
источник
a==1-> a<2чтобы сохранить байт.
Лохматый
@ Shaggy Спасибо!
Кевин Круйссен
4

05AB1E , 12 11 10 байт

Сохранено 1 байт благодаря Кевину Круйссену

ÂÆ_*`\‹*¿Θ

Попробуйте онлайн! или как тестовый набор

объяснение

ÂÆ           # reduce a reversed copy of the input by subtraction
  _          # logically negate
   *         # multiply with input
    `        # push the values of the resulting list separately to stack
     \       # remove the top (last) value
      ‹      # is a < b ?
       *     # multiply by the input list
        ¿    # calculate the gcd of the result
         Θ   # is it true ?
Emigna
источник
Упс .. удалил мой комментарий ..>.> Итак, еще раз: вы можете сохранить байт, используя кратные вместо замен с продуктом: RÆ_*`\‹*¿Θ Test Suite .
Кевин Круйссен
@KevinCruijssen: Спасибо! Да, обычно, когда у вас так много свопов, вы делаете что-то не так: P
Emigna
3

Python 2 , 69 67 63 62 55 байт

lambda a,b,c:(c-b==a<b)/gcd(a,b)
from fractions import*

Попробуйте онлайн!


Python 3 , 58 51 байт

lambda a,b,c:(c-b==a<b)==gcd(a,b)
from math import*

Попробуйте онлайн!


-7 байт, спасибо H.PWiz

TFeld
источник
является gcdв gcdтрик в силе? Что делать, если aне взаимно с c?
Джо Кинг
2
@ jo-king Если p делит a и c, он должен делить ca так, чтобы b.
Дэвид
2
@JoKing: это в этом случае, но не в целом (вы можете доказать это с помощью личности Безу).
19
Вы можете сделать еще один шаг вперед и использовать gcd(a,b), так как gcd(a,b)делитa+b
H.PWiz
@ H.PWiz Спасибо :)
TFeld
3

Japt , 16 14 13 11 байт

<V¥yU «NÔr-

Попытайся

                :Implicit input of integers U=A, V=B & W=C
<V              :Is U less than V?
  ¥             :Test that for equality with
   yU           :The GCD of V & U
      «         :Logical AND with the negation of
       N        :The array of inputs
        Ô       :Reversed
         r-     :Reduced by subtraction
мохнатый
источник
Вот еще одно 11-байтовое решение, хотя при ближайшем рассмотрении оно не сильно отличается от вашего по своей реальной логике.
Камил Дракари
@KamilDrakari, тоже был вариант на одном этапе. Это может быть 10 байтов, если переменные были вставлены автоматически, когда >следует ©.
Лохматый
3

JavaScript (ES6),  54 43 42  40 байт

Спасибо @Shaggy за указание на то, что нам не нужно вычислять НОД(a,с), Сохранено 11 байт, переписав код соответствующим образом.

Вводит как 3 отдельных целых числа. ВозвращаетTрUе для ABC-тройной или любой 0 или еaLsе в противном случае.

f=(a,b,c)=>c&&a/b|a+b-c?0:b?f(b,a%b):a<2

Попробуйте онлайн!

Arnauld
источник
1
Я не думаю, что вам нужно проверять gcd(c,a).
Лохматый
@ Shaggy Спасибо! Я полностью переписал код.
Арно
3

Wolfram Language 24 30 28 26 байтов

С 2 байтами выбритой дверной ручкой. Еще 2 байта были сбиты @jaeyong

#<#2&&GCD@##==1&&#+#2==#3&
DavidC
источник
Я думаю, что вы также должны быть в состоянии использовать, CoprimeQ@##чтобы сохранить 2 байта.
Дверная ручка
@ Doorknob, если первое и второе числа взаимно просты, обязательно ли они взаимно просты с их суммой?
DavidC
Они есть , но первоначальное определение фактически утверждает, что A, B и C должны быть взаимно простыми. Большинство ответов проверяют только A и B только потому, что обычно они короче.
Ручка двери
I think GCD@##==1 would save 2 bytes
jaeyong sung
2

C # (интерактивный компилятор Visual C #) , 90 байт

n=>new int[(int)1e8].Where((_,b)=>n[0]%++b<1&n[1]%b<1).Count()<2&n[0]+n[1]==n[2]&n[0]<n[1]

Работает на номера до 1e8, занимает около 35 секунд на моей машине. Вместо того, чтобы вычислять gcd, как другие, функция просто создает огромный массив и фильтрует индексы, не являющиеся делителями a или b, и проверяет, сколько осталось элементов. Затем он проверяет, равен ли элемент один плюс элемент два элементу три. Наконец, он проверяет, меньше ли первый элемент, чем второй.

Попробуйте онлайн!

Воплощение невежества
источник
2

ECMAScript Regex, 34 байта

Ввод одинарный, в домене ^x*,x*,x*$(повторяется xс разделителями ,).

^(?!(xx+)\1*,\1+,)(x*)(,\2x+)\3\2$

Попробуйте онлайн! (.NET regex engine)
Попробуйте онлайн! (Движок регулярных выражений SpiderMonkey)

# see /codegolf/178303/find-if-a-list-is-an-abc-triple
^
(?!                # Verify that A and B are coprime. We don't need to include C in the
                   # test, because the requirement that A+B=C implies that A,B,C are
                   # mutually comprime if and only if A and B are coprime.
    (xx+)\1*,\1+,  # If this matches, A and B have a common factor \1 and aren't coprime.
)
(x*)(,\2x+)\3\2$   # Verify that A<B and A+B=C. The first comma is captured in \3 and
                   # reused to match the second comma, saving one byte.

Вопрос говорит: «Три целых числа, десятичное число написано», так что это может не соответствовать (так как оно принимает входные данные в унарном виде), но это делает такое элегантное чистое регулярное выражение, что я надеюсь, что оно, по крайней мере, будет оценено.

Тем не менее, обратите внимание, что если формулировка должна быть интерпретирована буквально, то лямбда-выражения и представления функций, которые принимают целочисленные аргументы, также должны быть дисквалифицированы, так как для строгого соблюдения спецификации вопроса они должны будут принимать входные данные в форме строки.

Deadcode
источник
1

Befunge-98 (FBBI) , 83 байта

&:&:03p&:04pw>03g04g\:v_1w03g04g+w1.@
00:    7j@.0[^j7      _^;>0.@;j7;>0.@;:%g00\p

Попробуйте онлайн!

Ввод, представляющий собой тройку целых чисел [A,B,C], подается в Befunge как целые числа, разделенные пробелом C B A.

Вислав
источник
1

Mathematica 35 байтов

CoprimeQ @@ # && #[[1]] + #[[2]] == #[[3]] & 

если порядок важен:

CoprimeQ @@ # && Sort[#]==# && #[[1]] + #[[2]] == #[[3]] & 

или...

And[CoprimeQ @@ #, Sort@# == #, #[[1]] + #[[2]] == #[[3]]] &
Дэвид Дж. Аист
источник
1

Сетчатка 0.8.2 , 42 41 байт

\d+
$*
A`^(11+)\1*,\1+,
^(1+)(,1+\1)\2\1$

Попробуйте онлайн! Ссылка включает в себя тестовые случаи. Редактировать: 1 байт сохранен благодаря @Deadcode. Объяснение:

\d+
$*

Преобразовать в одинарный.

A`^(11+)\1*,\1+,

Убедитесь, что А и В не имеют общего множителя.

^(1+)(,1+\1)\2\1$

Проверьте, что A <B и A + B = C.

Нил
источник
1
Кажется, в вашей программе есть ошибка. [121, 48234375, 48234496] возвращает false.
Deadcode
1
@Deadcode Исправлено, спасибо, что сообщили мне об этом.
Нил
Как и в моем регулярном выражении, вы можете сбросить 1 байт, изменив ^(1+),(1+\1),\1\2$на ^(1+)(,1+\1)\2\1$.
Deadcode
1
@ Dedecode Спасибо! Жаль, что мое использование Aоперации Retina на самом деле не спасает меня ни одного байта.
Нил
1
@Deadcode Я использую поведение Retina, которое превращает последнее регулярное выражение в положительное утверждение (на самом деле (стадия совпадения)), поэтому перемещение antigrep обойдется мне в 5 байт.
Нил