З'ясуйте, чи є список потрійним 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-трійки.

Введення-виведення

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

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

Таким чином A є першим елементом списку, B другим і C третім.

Тестові справи

Кожен із наведених нижче списків повинен виводити значення "truthy"

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

Кожен із наведених нижче списків повинен виводити значення фальси

[1, 1, 2]
[1, 2, 5]
[1, 9, 8]
[4, 12872682, 12872686]
[6, 8, 14]
[7, 5, 12]

Чи повинно виходити лише одне з двох значень, або ми можемо виводити різні значення "truthy / falesy" для різних входів?
Луїс Мендо

Я думаю, що це повинно бути послідовним: ваш код повинен виводити один вид правдивих / хибних значень незалежно від введення. Але пара правдивих / фальшивих може бути тим, що ви хочете, наскільки це виконує роботу: диференціюйте списки.
Девід

Якщо ми сприймаємо вхід як список трьох значень, чи повинен вводитись порядок [A,B,C], чи ми також можемо приймати вхід у порядку [C,B,A]чи [C,A,B]?
Kevin Cruijssen

Ви повинні дотримуватися порядку, оскільки 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 байти завдяки nimi за те, що він пропонує інфікси-оператор!

(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



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

останній &&може бути змінений &з - за старшинства
Науель FOUILLEUL

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 байт завдяки Kevin Cruijssen

ÂÆ_*`\‹*¿Θ

Спробуйте в Інтернеті! або як тестовий набір

Пояснення

ÂÆ           # 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 ?

На жаль, видалили мій коментар ..>.> І знову: байт можна зберегти, використовуючи кратні замість свопів з продуктом: RÆ_*`\‹*¿Θ Test Suite .
Кевін Кройсейсен

@KevinCruijssen: Дякую! Так, зазвичай, коли у вас стільки свопів, ви робите щось не так: P
Емінья

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


є gcdв gcdтрик в силі? Що робити, якщо aце не копріме c?
Jo King

2
@ jo-king Якщо p ділить a і c, він повинен ділити ca так b.
Девід

2
@JoKing: Це в цьому випадку, але не в цілому (ви можете довести це через особу Безута).
ბიმო

Ви можете зробити його на крок далі і використовувати 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 байт

gcd(а,c) . Збережено 11 байт, відповідно переписавши код.

тrуе0 абоfалсе інакше.

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

Спробуйте в Інтернеті!


1
Я не думаю, що потрібно тестувати gcd(c,a).
Кошлатий

@Shaggy Дякую! Я повністю переписав код.
Арнольд

3

Вольфрамська мова 24 30 28 26 байт

З двома байтами, поголеними Doorknob. Ще 2 байти, поголений від @jaeyong sung

#<#2&&GCD@##==1&&#+#2==#3&

Я думаю, ви також повинні мати можливість CoprimeQ@##зберегти 2 байти.
Дверна ручка

@Doorknob, Якщо перше і друге числа є одночасними, чи обов'язково вони є одночасними зі своєю сумою?
DavidC

Вони є , але в початковому визначенні насправді йдеться про те, що A, B і C повинні бути спільними. Більшість відповідей перевіряють лише A і B лише тому, що вони зазвичай коротші.
Дверна ручка

Я думаю GCD@##==1, врятував би 2 байти
співав

2

C # (Visual C # Interactive Compiler) , 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*$(повторення xs обмежено на ,).

^(?!(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.

Питання каже: "Три цілі числа, записані у десятковій формі", тож це може не бути кваліфікованим (оскільки воно вимагає введення в одинаковому), але це створює такий елегантний чистий регулярний вираз, що, сподіваюся, це буде принаймні оцінено.

Однак зауважте, що якщо словосполучення має бути досліджене буквально, подання лямбда та функцій, які беруть цілі аргументи, також повинні бути дискваліфіковані, щоб суворо дотримуватися специфікації питання, вони повинні приймати введення у вигляді рядка.








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+,

Переконайтесь, що A і B не мають спільного фактора.

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

Перевірте, що A <B і A + B = C.


1
У вашій програмі виявляється помилка. [121, 48234375, 48234496] повертається помилково.
Deadcode

1
@Deadcode Виправлено, дякую, що повідомили мені.
Ніл

Як і в моєму регулярному вираженні, ви можете скинути 1 байт, змінивши ^(1+),(1+\1),\1\2$на ^(1+)(,1+\1)\2\1$.
Deadcode

1
@Deadcode Дякую! Прикро, що моє використання Aоперації Retina насправді не врятує мене ніяких байтів.
Ніл

1
@Deadcode Я використовую поведінку Retina, щоб перетворити останній регулярний вираз у позитивне твердження (насправді це (підрахунок) стадії збігу), тому переміщення антигреппу коштуватиме мені 5 байт.
Ніл

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.