Temukan jika daftar adalah ABC-triple


16

Tiga bilangan bulat positif A, B, C adalah ABC-triple jika merupakan koprime, dengan A <B dan memuaskan hubungannya: A + B = C

Contoh:

  • 1, 8, 9 adalah triple-ABC karena mereka adalah koprime, 1 <8 dan 1 + 8 = 9
  • 6, 8, 14 bukan karena mereka bukan koprime
  • 7, 5, 12 bukan karena 7> 5

Anda dapat melihat presentasi Frits Beukers 2005 ini untuk detail lebih lanjut tentang ABC-triples.

Input output

Tiga bilangan bulat, ditulis desimal. Dapat dipisahkan nilai atau daftar. Output harus berupa nilai true / falsy apakah ketiga bilangan bulat adalah ABC-triple.

Catatan: Penting untuk menghormati urutan bilangan bulat dalam daftar, misalnya: 1, 8, 9tidak dianggap sebagai daftar yang sama dengan 9, 1, 8atau kombinasi lainnya. Jadi yang pertama adalah ABC-triple dan yang kedua tidak.

Jadi A adalah elemen pertama dari daftar, B yang kedua dan C yang ketiga.

Uji kasus

Setiap daftar berikut harus menampilkan nilai yang benar

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

Setiap daftar berikut harus menampilkan nilai falsey

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

Apakah output harus hanya satu dari dua nilai, atau bisakah kita menampilkan nilai kebenaran / kepalsuan yang berbeda untuk input yang berbeda?
Luis Mendo

Saya pikir itu harus konsisten: kode Anda harus menampilkan satu jenis nilai true / falsy apa pun inputnya. Tetapi pasangan yang benar-benar palsu bisa menjadi apa yang Anda inginkan sejauh ia berhasil: daftar yang berbeda.
david

Jika kita mengambil input sebagai daftar tiga nilai, apakah input harus dalam urutan [A,B,C], atau apakah kita juga diizinkan untuk mengambil input dalam urutan [C,B,A]atau [C,A,B]?
Kevin Cruijssen

Anda harus menghormati pesanan karena A <B adalah kriteria dalam tantangan.
David

1
Saya tidak berpikir memerlukan urutan daftar tertentu kompatibel dengan memungkinkan input untuk diambil sebagai nilai yang terpisah, karena nilai yang terpisah secara inheren tidak berurutan dan dapat diambil sebagai daftar .
Dennis

Jawaban:


8

Jelly , 10 9 byte

Ṫ=S×</=g/

Cobalah online!

Bagaimana itu bekerja

Ṫ=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 byte

-10 byte karena TFeld 's gcdtrik!

Terima kasih -7 byte HPWiz untuk meningkatkan uji co-primality dan menemukan ruang yang berlebihan!

-2 byte terima kasih kepada nimi untuk menyarankan operator-infix!

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

Cobalah online!

Penjelasan

Dua kondisi pertama a < bdan a + b == ccukup jelas, yang ketiga menggunakan gcd(a,b)=gcd(a,c)=gcd(b,c) :

Menulis gcd(a,c)=Ua+Vc menggunakan identitas Bézout dan menggantikan c=a+b memberi:

USebuah+V(Sebuah+b)=(U+V)Sebuah+Vb

Karena itu gcd adalah solusi positif minimal untuk identitas yang mengikuti bahwa gcd(a,b)=gcd(a,c) . Kasus lainnya simetris.


1
Juga, saya percaya Anda hanya butuh itu gcd a b==1. Sejak gcd a bmembelah a+b=c. yaitugcd(gcd a b)c=gcd a b
H.PWiz

@ HPWiz: Ah ya, tentu saja, terima kasih! Akan diedit nanti saat tidak di ponsel ..
ბიმო

7

Perl 6 , 33 32 byte

-1 byte terima kasih kepada nwellnhof

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

Cobalah online!

Blok kode anonim yang mengambil daftar tiga angka dan mengembalikan Benar atau Salah.

Penjelasan

{                              }  # 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

bash, 61 byte

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

Cobalah online!

Input sebagai argumen baris perintah, output dalam kode keluar (juga menghasilkan output pada stdout sebagai efek samping, tetapi ini dapat diabaikan).

Bagian kedua (mulai dari &&(() cukup standar, tetapi yang menarik adalah tes coprime:

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

terakhir &&dapat diubah menjadi &karena diutamakan
Nahuel Fouilleul

4

Java 10, 65 64 byte

(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 byte terima kasih kepada @Shaggy .

Cobalah online.

Penjelasan:

(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<2untuk menyimpan byte.
Shaggy

@Shaggy Terima kasih!
Kevin Cruijssen

4

05AB1E , 12 11 10 byte

Disimpan 1 byte berkat Kevin Cruijssen

ÂÆ_*`\‹*¿Θ

Cobalah online! atau sebagai Test Suite

Penjelasan

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

Ups .. menghapus komentar saya ..>.> Jadi sekali lagi: Anda dapat menyimpan byte dengan menggunakan kelipatan alih-alih bertukar dengan produk: RÆ_*`\‹*¿Θ Test Suite .
Kevin Cruijssen

@KevinCruijssen: Terima kasih! Ya, biasanya ketika Anda memiliki banyak swap, Anda melakukan sesuatu yang salah: P
Emigna

3

Python 2 , 69 67 63 62 55 byte

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

Cobalah online!


Python 3 , 58 51 byte

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

Cobalah online!


-7 byte, terima kasih kepada H.PWiz


apakah trik gcddalam ini gcdvalid? Bagaimana jika atidak dimarahi c?
Jo King

2
@ jo-king Jika p membagi a dan c, itu harus membagi ca jadi b.
david

2
@ JoKing: Dalam kasus ini, tetapi tidak secara umum (Anda dapat membuktikannya melalui identitas Bezout).
ბიმო

Anda dapat mengambil satu langkah lebih jauh dan menggunakan gcd(a,b), karena gcd(a,b)membagia+b
H.PWiz

@ H.PWiz Terima kasih :)
TFeld

3

Japt , 16 14 13 11 byte

<V¥yU «NÔr-

Cobalah

                :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

Berikut ini adalah solusi 11 byte lain, meskipun pada pemeriksaan lebih dekat itu tidak jauh berbeda dengan Anda dalam logika sebenarnya
Kamil Drakari

@KamilDrakari, memiliki variasi pada satu tahap juga. Itu bisa 10 byte jika variabel dimasukkan secara otomatis ketika >mengikuti ©.
Shaggy

3

JavaScript (ES6),  54 43 42  40 byte

Terima kasih kepada @Shaggy untuk menunjukkan bahwa kita tidak perlu menghitung gcd(Sebuah,c). Disimpan 11 byte dengan menulis ulang kode yang sesuai.

Mengambil input sebagai 3 bilangan bulat terpisah. Kembalitrkamue untuk ABC-triple, atau salah satunya 0 atau fSebuahlse jika tidak.

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

Cobalah online!


1
Saya tidak berpikir Anda perlu menguji gcd(c,a).
Shaggy

@Shaggy Terima kasih! Saya telah menulis ulang kode sepenuhnya.
Arnauld

3

Bahasa Wolfram 24 30 28 26 byte

Dengan 2 byte yang dicukur oleh Doorknob. 2 byte selanjutnya dicukur oleh @jaeyong dinyanyikan

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

Saya pikir Anda juga harus dapat menggunakan CoprimeQ@##untuk menghemat 2 byte.
Gagang pintu

@ Doorknob, Jika angka pertama dan kedua adalah koprime, apakah mereka harus coprime dengan jumlah mereka?
DavidC

Ya , tetapi definisi aslinya sebenarnya menyatakan bahwa A, B, dan C harus menjadi koprime. Sebagian besar jawaban hanya memeriksa A dan B hanya karena biasanya lebih pendek.
Gagang Pintu

Saya pikir GCD@##==1akan menghemat 2 byte
Jaeyong dinyanyikan

2

C # (Visual C # Interactive Compiler) , 90 byte

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]

Berjalan untuk angka hingga 1e8, membutuhkan sekitar 35 detik di mesin saya. Alih-alih menghitung gcd seperti yang lain, fungsi hanya instantiate array besar dan memfilter indeks yang bukan pembagi a atau b, dan memeriksa berapa banyak elemen yang tersisa. Selanjutnya periksa apakah elemen satu ditambah elemen dua sama dengan elemen tiga. Terakhir, ia memeriksa apakah elemen pertama kurang dari yang kedua.

Cobalah online!



2

ECMAScript Regex, 34 byte

Input dalam bentuk unary, dalam domain ^x*,x*,x*$(berulang-ulang xdibatasi oleh ,).

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

Cobalah online! (.NET regex engine)
Cobalah secara online! (Mesin regex 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.

Pertanyaannya memang mengatakan "Tiga bilangan bulat, ditulis desimal ", jadi ini mungkin tidak memenuhi syarat (karena dibutuhkan input di unary), tetapi itu membuat regex murni yang elegan sehingga saya berharap setidaknya akan dihargai.

Namun, perhatikan bahwa jika frasa tersebut harus diartikan secara harfiah, pengajuan lambda dan fungsi yang menggunakan argumen bilangan bulat harus didiskualifikasi juga, karena untuk secara ketat mematuhi spesifikasi pertanyaan mereka perlu mengambil input dalam bentuk string.







1

Befunge-98 (FBBI) , 83 byte

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

Cobalah online!

Input yang merupakan triple integer [A,B,C]dimasukkan ke Befunge sebagai integer yang dipisahkan oleh ruang C B A.


1

Mathematica 35 byte

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

jika pesanan penting:

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

atau...

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

1

Retina 0.8.2 , 42 41 byte

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

Cobalah online! Tautan termasuk kasus uji. Sunting: Disimpan 1 byte berkat @Deadcode. Penjelasan:

\d+
$*

Konversikan ke unary.

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

Pastikan A dan B tidak memiliki faktor umum.

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

Periksa bahwa A <B dan A + B = C.


1
Tampaknya ada bug di program Anda. [121, 48234375, 48234496] kembali dengan salah.
Deadcode

1
@Deadcode Tetap, terima kasih telah memberi tahu saya.
Neil

Seperti halnya regex saya, Anda dapat menjatuhkan 1 byte dengan mengubah ^(1+),(1+\1),\1\2$ke ^(1+)(,1+\1)\2\1$.
Deadcode

1
@Deadcode Terima kasih! Sayang sekali bahwa saya menggunakan Aoperasi Retina sebenarnya tidak menyelamatkan saya byte.
Neil

1
@Deadcode Saya menggunakan perilaku Retina untuk mengubah regex terakhir menjadi pernyataan positif (sebenarnya tahap pertandingan (sebenarnya)) sehingga memindahkan antigrep akan menghabiskan biaya 5 byte.
Neil

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.