Bir listenin ABC üçlü olup olmadığını bulma


16

Üç pozitif A, B, C tamsayısı, eğer eşleşirse ABC-üçlüdür, A <B ile ve ilişkiyi tatmin eder: A + B = C

Örnekler:

  • 1, 8, 9 eş zamanlı olduklarından ABC üçlü, 1 <8 ve 1 + 8 = 9
  • 6, 8, 14 değil çünkü onlar evlilik değiller
  • 7, 5, 12 çünkü 7> 5

Bu Frits Beukers 2005 sunumunu görebilirsinizABC-üçlü hakkında daha fazla bilgi için .

Giriş çıkış

Üç tamsayı, ondalık yazılı. Ayrılmış değerler veya liste olabilir. Üç tamsayı bir ABC-üçlü olsun çıktı, gerçek / falsili bir değer olmak zorundaydı.

Not: Listedeki tamsayıların sırasına uymak önemlidir, örneğin: veya herhangi bir kombinasyonla 1, 8, 9aynı liste olarak kabul edilmez 9, 1, 8. Birincisi ABC üçlü, ikincisi değil.

Böylece A listenin ilk elemanı, ikincisi B ve üçüncüsü C'dir.

Test senaryoları

Aşağıdaki listelerin her biri doğru bir değer vermelidir

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

Aşağıdaki listelerin her biri bir falsey değeri vermelidir

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

Çıktının iki değerden yalnızca biri olması gerekiyor mu yoksa farklı girdiler için farklı doğruluk / tahrif değerleri çıkarabilir miyiz?
Luis Mendo

Ben tutarlı olması gerektiğini düşünüyorum: kod giriş ne olursa olsun doğruluk / falsy değerleri bir tür çıktı var. Ama doğrulukçu / sahtelik çift bu işi yapmak istediğin şey olabilir: listeleri ayırt et.
david

Girdiyi üç değer listesi [A,B,C]olarak alırsak, girdinin sırayla olması gerekir mi [C,B,A]yoksa girdiyi sırayla almamıza izin verilir [C,A,B]mi?
Kevin Cruijssen

A <B mücadeledeki bir kriter olduğu için düzene saygı göstermelisiniz.
david

1
Belirli bir liste sırası gerektiren giriş ayrı değerler olarak alınmasına izin ile uyumlu olduğunu düşünmüyorum, çünkü ayrı değerler doğal olarak sırasız ve bir liste olarak alınabilir .
Dennis

Yanıtlar:


8

Jöle , 10 9 bayt

Ṫ=S×</=g/

Çevrimiçi deneyin!

Nasıl çalışır

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

Nedeniyle -10 bayt TFeld bireyin gcdhile!

Eş- öncelik testini geliştirmek ve gereksiz bir alanı tespit etmek için HPWiz sayesinde -7 bayt !

Bir infix operatörü önerdiği için nimi sayesinde -2 bayt !

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

Çevrimiçi deneyin!

açıklama

İlk iki koşul a < bve a + b == coldukça açık, üçüncüsü ise bu gcd(a,b)=gcd(a,c)=gcd(b,c) :

Gcd yazma ( a , cgcd(a,c)=Ua+Vc kullanılarakBezout kimliğinive ikamec=a+b verir:

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

yana gcd gcd bu kimlik az pozitif bir çözüm bu, aşağıdaki gcd(a,b)=gcd(a,c) . Diğer durum simetriktir.


1
Ayrıca, sadece buna ihtiyacınız olduğuna inanıyorum gcd a b==1. gcd a bBölündüğünden beri a+b=c. yanigcd(gcd a b)c=gcd a b
H.PWiz

@HPWiz: Ah evet, elbette, teşekkürler! Cep telefonunda değilken daha sonra düzenleyecek ..
ბიმო

7

Perl 6 , 33 32 bayt

Nwellnhof sayesinde -1 bayt

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

Çevrimiçi deneyin!

Üç sayının listesini alan ve True veya False döndüren anonim kod bloğu.

açıklama

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

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

Çevrimiçi deneyin!

Komut satırı bağımsız değişkenleri olarak giriş yapın, çıkış kodunda çıkış yapın (stdout'ta çıktıyı bir yan etki olarak da üretir, ancak bu yok sayılabilir).

İkinci bölüm (başlangıçtan itibaren &&(() oldukça standarttır, ancak ilginç olan şey, coprime testidir:

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

Geçen &&değiştirilebilir &nedeniyle öncelik
Nahuel FOUILLEUL

4

Java 10, 65 64 bayt

(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 bayt @Shaggy'e teşekkürler .

Çevrimiçi deneyin.

Açıklama:

(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<2bir bayt kaydetmek için.
Shaggy

@Shaggy Teşekkürler!
Kevin Cruijssen

4

05AB1E , 12 11 10 bayt

Kevin Cruijssen sayesinde 1 bayt kurtarıldı

ÂÆ_*`\‹*¿Θ

Çevrimiçi deneyin! veya Test Paketi olarak

açıklama

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

Hata! Yorumumu sildi ..>.> Yine: ürünle takas yerine katları kullanarak bir bayt kaydedebilirsiniz: RÆ_*`\‹*¿Θ Test Suite .
Kevin Cruijssen

@KevinCruijssen: Teşekkürler! Evet, genellikle çok fazla
takasınız

3

Python 2 , 69 67 63 62 55 bayt

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

Çevrimiçi deneyin!


Python 3 , 58 51 bayt

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

Çevrimiçi deneyin!


-7 bayt, H.PWiz sayesinde


olduğu gcdiçinde gcdhile geçerli? Peki ya abirlikte değilse c?
Jo King

2
@ jo-king p a ve c'yi bölerse, ca'yı b'ye böler.
david

2
@JoKing: Bu durumda, ancak genel olarak değil (Bezout'un kimliği ile kanıtlayabilirsiniz).
ბიმო

Bir adım daha ileri gidebilir ve kullanabilirsiniz gcd(a,b), çünkü gcd(a,b)bölünmelera+b
H.PWiz

@ H.PWiz Teşekkürler :)
TFeld

3

Japt , 16 14 13 11 bayt

<V¥yU «NÔr-

Dene

                :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

İşte başka bir 11 bayt çözüm, ancak daha yakından incelendiğinde gerçek mantığında sizinkinden çok farklı değil.
Kamil Drakari

@ KamilDrakari, bu aşamada da bir varyasyona sahipti. Bu olabilir 10 bayt zaman değişkenleri otomatik olarak yerleştirilmesi halinde >, aşağıdaki ©.
Shaggy

3

JavaScript (ES6),  54 43 42  40 bayt

gcd(a,c) . Kodu uygun şekilde yeniden yazarak 11 bayt kaydedildi.

Girdiyi 3 ayrı tamsayı olarak alır. döndürürtrue0false , aksi.

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

Çevrimiçi deneyin!


1
Test etmeniz gerektiğini düşünmüyorum gcd(c,a).
Shaggy

@Shaggy Teşekkürler! Kodu tamamen yeniden yazdım.
Arnauld

3

Wolfram Dili 24 30 28 26 bayt

Doorknob tarafından traş edilmiş 2 bayt. @Jaeyong sung tarafından 2 baytlık tıraş

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

Bence CoprimeQ@##2 bayt tasarruf etmek için de kullanabilmelisin .
Kapı tokmağı

@Doorknob, Eğer birinci ve ikinci sayılar eş zamanlı ise, zorunlu olarak toplamlarıyla eşleşiyorlar mı?
DavidC

Bunlar , ancak orijinal tanım aslında A, B ve C'nin eş zamanlı olması gerektiğini belirtir. Çoğu cevap sadece A ve B'yi kontrol eder, çünkü genellikle daha kısadır.
Kapı tokmağı

Bence GCD@##==12 bayt kurtardı
jaeyong

2

C # (Visual C # Etkileşimli Derleyici) , 90 bayt

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'e kadar olan sayılar için çalışır, makinemde yaklaşık 35 saniye sürer. Gcd'yi diğerleri gibi hesaplamak yerine, işlev büyük bir dizi başlatır ve a veya b'nin bölücüleri olmayan dizinleri filtreler ve kaç öğenin kaldığını kontrol eder. Daha sonra, bir eleman ile iki elemanın üçüncü elemanla aynı olup olmadığını kontrol eder. Son olarak, ilk elemanın ikinciden az olup olmadığını kontrol eder.

Çevrimiçi deneyin!



2

ECMAScript Regex, 34 bayt

Girdi, etki alanında tekli ^x*,x*,x*$(yinelenen xs ile ayrılmış ,).

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

Çevrimiçi deneyin! (.NET regex motoru)
Çevrimiçi deneyin! (SpiderMonkey normal ifade motoru)

# 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.

Soru "Üç tamsayı, ondalık yazılı" diyor, bu yüzden bu (sıradan girdi alır gibi) hak kazanmayabilir, ancak en azından takdir edileceğini umarım böyle zarif bir saf regex yapar.

Bununla birlikte, kelime öbeği kelimenin tam anlamıyla yorumlanacaksa, tamsayı bağımsız değişkenleri alan lambda ve işlev gönderimlerinin de sorunun özelliklerine sıkı sıkıya bağlı kalmaları için diskalifiye edilmesi gerektiğini unutmayın.








1

Mathematica 35 bayt

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

sipariş önemli ise:

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

veya...

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

1

Retina 0.8.2 , 42 41 bayt

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

Çevrimiçi deneyin! Bağlantı, test senaryolarını içerir. Düzenleme: @ Kod kodu sayesinde 1 bayt kaydedildi. Açıklama:

\d+
$*

Tekli'ye dönüştür.

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

A ve B'nin ortak bir faktörü olmadığından emin olun.

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

A <B ve A + B = C olup olmadığını kontrol edin.


1
Programınızda bir hata var gibi görünüyor. [121, 48234375, 48234496] yanlış döndürüyor.
Deadcode

1
@ Kod Kodu Sabit, bana bildirdiğiniz için teşekkürler.
Neil

Normal ifademde olduğu gibi, 1 bayt ^(1+),(1+\1),\1\2$değerini olarak değiştirebilirsiniz ^(1+)(,1+\1)\2\1$.
kod

1
@ Kod Kodu Teşekkürler! Retina Aoperasyonunu kullanmamın bana hiç bayt kazandırmaması utanç verici .
Neil

1
@Deadcode Retina'nın son regex'i pozitif bir iddiaya (aslında bir (sayım) maç aşamasına) dönüştürme davranışını kullanıyorum, böylece antigrep'i hareket ettirmek bana 5 bayta mal olacak.
Neil

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.