Üç girişli tamsayıların farkı


30

Girdi olarak üç, x, y ve z tamsayılarını alan bir fonksiyon farkı uygulayın. Bu sayılardan birinin diğerinden çıkarılmasının üçüncüyü verip vermeyeceğini döndürmesi gerekir.

Test cases:
diff(5, 3, 2) yields True because 5 - 3 = 2
diff(2, 3, 5) yields True because 5 - 3 = 2
diff(2, 5, 3) yields True because 5 - 3 = 2
diff(-2, 3, 5) yields True because 3 - 5 is -2
diff(-5, -3, -2) # -5 - -2 is -3
diff(2, 3, -5) yields False
diff(10, 6, 4) yields True because 10 - 6 = 4
diff(10, 6, 3) yields False

İşleve isim vermek zorunda değilsiniz, yukarıdaki örneklerin katı bir kılavuz olmadığı varsayılan giriş yöntemlerini uygulayabilirsiniz.


5
Bu makul bir zorluktur, ancak Python veya işlevlerle sınırlandırılmasına gerek yoktur. Genel olarak, bu kısıtlamalar, katılımları sınırladıkları için kaşlarını çattı. Ayrıca, bazı test durumları eklemelisiniz.
xnor

Hey, biraz düzelttim. Umarım bu yeterlidir!
Mir

2
Daha iyi görünüyor! Bazı dillerde fonksiyon olmadığı için, özellikle programlarda varsayılan giriş yöntemlerine izin vermenizi şiddetle tavsiye ediyorum . Ve, fonksiyonların başka bir isme sahip olmalarını ya da isim vermemelerini sağlamak.
xnor

İlk ve son paragraflar şimdi birbiriyle çelişiyor, bu yüzden sadece iki kez kontrol etmek için - bir fonksiyon yazmak zorunda mıyız yoksa tam programlar tamam mı?
Sp3000

tam programlar iyi, varsayılan giriş yöntemlerine uyulması dışında mümkün olduğunca az kısıtlama getirmek istiyorum. ef python3 örnekleri temiz!
Mir

Yanıtlar:



51

Python 3, 21 bayt

lambda*l:sum(l)/2in l

İki sayı diğerine eklenirse, üçünün toplamı diğer sayının iki katı olur; bu nedenle toplamın yarısı listenin bir öğesi olur. Python 3, sayılar 3.0yerine verilmedikçe, kat bölünmesini önlemek için gereklidir 3.


7

ES6, 31 bayt

(a,b,c)=>a+b==c|b+c==a|c+a==b

Fonksiyonu adlandırmanız gerekiyorsa 5 bayt ekleyin diff.

Düzenleme: @Alex L. sayesinde 2 bayt kaydedildi


İki bayttan tasarruf ||yaparak |(Sanırım) değiştirebilirsin
HyperNeutrino

@AlexL. Ah doğru, Boolean'ları iade etmek zorunda kalmayacağım.
Neil

Booleanlarla bile, |her iki değer de boolean ise ve bir boolean döndürür. Yani true | false == true, ama 3 | 5 == 7. Aynısı geçerlidir &&ve &. Arasındaki tek fark |ve ||: o boolelerde geldiğinde |birinci değer ve ikinci değer alıp bulacaksınız VEYA bu ikisinin. ||ilk değeri alacak; true ise true, aksi takdirde ikinci değeri döndürün.
HyperNeutrino,

@AlexL. true | falseJavaScript'te 1 olarak değerlendirilir (bu çok kaba, ancak Boolean değil).
Neil

Ah. Üzgünüm, gerçekten JS kullanmıyorum. Ben çoğunlukla bu bilgiyi kullandığım Java'yı kullanırım. ;)
HyperNeutrino

4

APL, 8 5 bayt

+/∊+⍨

Bu, bir diziyi kabul eden ve bir boole döndüren tek yönlü bir fonksiyon trenidir (APL'de 0/1). Bu XNOR Python 3 ile aynı algoritma kullanır cevap .

Açıklama:

   +⍨  ⍝ Double the input (+⍨x is the same as x+x)
  ∊    ⍝ Test the membership of
+/     ⍝ The sum of the input

Çevrimiçi deneyin

Dennis sayesinde 3 bayt kurtarıldı!


4

JavaScript ES6, 38 34 33 bayt

x=>x.some(a=>2*a==x[0]+x[1]+x[2])

Çok basit bir anonim işlev ve Python cevabından ödünç. xDizi olarak girdi alır ; dönertrueveyafalse . Bayt Molarmanful ve jrich için tıraş

Her sayıyı argüman olarak alan 38 baytlık bir program:

(a,b,c)=>[a,b,c].some(t=>t==(a+b+c)/2)

x=>x.some(a=>a==eval(x.join`+`)/2)4 bayt kaydeder deneyin .
Mama Fun Roll

@ ӍѲꝆΛҐӍΛПҒЦꝆ Teşekkürler! İyi numara.
Conor O'Brien,

x=>x.some(a=>2*a==x[0]+x[1]+x[2])iş gibi görünüyor.
Jrich

@jrich teşekkürler! İyi numara!
Conor O'Brien,

3

Oracle SQL 11.2, 49 bayt

SELECT 1 FROM DUAL WHERE(:1+:2+:3)/2IN(:1,:2,:3);

@Xnor çözümünün yeniden yazılması, ona şerefe.


3

J, 6 bayt

+/e.+:

J.Js ile deneyin .

Nasıl çalışır

+/e.+:    Monadic verb. Argument: A
    +:    Double the elements of A.
+/        Compute the sum of the elements of A.
  e.      Test for membership.

3

DUP , 31 karakter / 39 bayt

[2ø2ø2ø++2/\%3ø^=3ø2ø=3ø3ø=||.]

Try it here!

İlk DUP başvurum! Unicode senin istiridyen.

Bu isimsiz bir işlev / lambda. Kullanımı:

5 3 2[2ø2ø2ø++2/\%3ø^=3ø2ø=3ø3ø=||.]!

açıklama

[                               {start lambda}
 2ø2ø2ø                         {duplicate 3 inputnums}
       ++                       {push sum(3 popped stack items)}
         2/\%                   {push (popped stack item)/2}
             3ø^=3ø2ø=3ø3ø=     {for all 3 inputs, -1 if inputnum=sum/2; else 0}
                           ||   {check if any of the 3 resulting values are truthy}
                             .  {output top of stack (boolean value)}
                              ] {end lambda}

Kodlamanın böyle çalıştığını sanmıyorum ...
Conor O'Brien

økod noktası 248'e sahiptir, bu nedenle ISO 8859-1 olarak kodlanmışsa bir bayttır.
Dennis,

1
... tercüman aslında ISO 8859-1 kodlu kaynak dosyasıyla çalışabildiği sürece gayet iyi .
Martin Ender

@ MartinBüttner Bunu test etmenin mümkün olduğunu sanmıyorum.
Mama Fun Roll

3

Java 7, 81

boolean d(int[]a){int s=0,t=1;for(int b:a)s+=b;for(int b:a)t*=2*b-s;return t==0;}

3

Perl 6, 20 19 bayt

Bayt sayımı ile eşit iki işlevi var, bu yüzden her ikisini de koyacağım. Hangisini fantezisini gıdıkladığını takdir et.

{@_@_.sum div 2}
{@_∋+~(@_.sum/2)}

Kullanım: İkisinden birini, arayabileceğiniz bir değişkene atayın.
EDIT: Bayt azaltma için teşekkürler @ b2gills


{@_∋@_.sum div 2}ve {@_∋+~(@_.sum/2)}her ikisi de daha kısadır
Brad Gilbert 22

Oh teşekkürler, her zaman bir noktalama yöntemi olarak toplamı çağırabileceğinizi unutmuşum
Hotkeys

Ne yapar ?
Kullanıcı112638726

"∋", solun sağı içerdiğini söyleyen 'içerir' infix operatörüdür. Solun sağın bir öğesi olduğunu söyleyen "∈" "elementi" nin kardeşi. Her ikisi de set op'tur ve perl 6 aslında başkalarını da destekliyor! docs.perl6.org/language/…
Kısayol Tuşları

3

Java 8 (lambda işlevi), 29 bayt

// Lambda Signature: (int, int, int) -> boolean

(a,b,c)->a+b==c|a+c==b|b+c==a

Java kodu golf çözümleri genellikle yalnızca programın tamamen işlevsel bir program olması gerekmediğinde kısadır. (* öksürük öksürüğü * sınıf bildirimi, ana yöntem)


2

Pyth, 6 bayt

/Q/sQ2

Çevrimiçi deneyin!

Bir tam sayı listesi olarak girdi bekliyor. Diğer ikisi çıkarılarak sayı oluşturulamıyorsa 0, en az biri ise> 0 olur.

Açıklama:

@Xnor ın cevabıyla aynı algoritma

/ Q / SQ2

   sQ # Listedeki tüm elemanları topla
  / 2 # Toplamı 2'ye bölün
/ Q # Sayı Listede yukarıdaki sayının oluşumu

2

05AB1E , rakipsiz

Aptalca bir şey yüzünden rekabet etmeyen 4 bayt . Kod:

DO;¢

0'ı sahte,> 0'ı gerçeğe uygun kullanmak. CP-1252 kodlamasını kullanır.


Bunu rakipsiz yapan "aptal" şey nedir?
Kyle Kanos

@KyleKanos Zaten içinde yazdım info.txt o ;yarıları yığının üst. Ama tahmin et ne oldu, ben asla uygulamadım.
Adnan

1
Ah. Bunun nasıl yapıldığını görebiliyorum
Kyle Kanos

2

Kona 16 karakter

{((+/x)%2)_in x}

Yığından bir vektör alır, toplar, 2'ye böler ve vektörde olup olmadığını belirler. 1'i truthy, 0 ise falsey olarak döndürür.

Denilen

> {((+/x)%2)_in x} [(2;3;5)]
1
> {((+/x)%2)_in x} [(2;3;4)]
0

2

jq, 17 karakter

(Yine bir başka yeniden yazma XNOR 'ın Python 3 cevap . Upvotes o birine gitmek gerekir.)

contains([add/2])

Giriş: 3 tam sayı dizisi.

Örnek çalışma:

bash-4.3$ jq 'contains([add/2])' <<< '[5, 3, 2]'
true

bash-4.3$ jq 'contains([add/2])' <<< '[2, 3, -5]'
false

Çevrimiçi test:

jq, 18 karakter

(17 karakter kodu + 1 karakter komut satırı seçeneği.)

contains([add/2])

Giriş: 3 tamsayının listesi.

Örnek çalışma:

bash-4.3$ jq -s 'contains([add/2])' <<< '5 3 2'
true

bash-4.3$ jq -s 'contains([add/2])' <<< '2 3 -5'
false

2

MATL , 5 bayt

Kullanılması XNOR harika bir yaklaşım @ :

s2/Gm

Çevrimiçi deneyin!

s    % implicitly input array of three numbers. Compute their sum
2/   % divide by 2
G    % push input again
m    % ismember function: true if sum divided by 2 equals some element of the input

Kaba kuvvet yaklaşımı, 12 bayt :

Y@TT-1h*!s~a

Çevrimiçi deneyin!

Y@       % input array of three numbers. Matrix with all
         % permutations, each one on a different row
TT-1h    % vector [1,1,-1]
*        % multiply with broadcast
!s       % transpose, sum of each column (former row)
~a       % true if any value is 0


2

CJam, 10 12 bytes

l~:d_:+2/&

2 bytes removed thanks to @MartinBüttner.

This displays a number as truthy result, and no output as falsy result.

Try it here

l~     e# read line and evaluate. Pushes the array
:d     e# convert array to double
_      e# duplicate
:+     e# fold addition on the array. Computes sum of the array
2/     e# divide sum by 2
&      e# setwise and (intersection)

2

Seriously, 6 bytes

,;䫡u

Outputs 0 if false and a positive integer otherwise.


2

Mathematica, 20 19 bytes

MemberQ[2{##},+##]&

Works similarly to most of the other answers.


How about MemberQ[2{##},+##]&? (and you forgot your byte count)
Martin Ender

2

Haskell, 20 bytes

(\l->sum l/2`elem`l)

Using xnor's solution.


Since (/) doesn't work for integers and the challenge asks for integers, I'm not sure that this is actually a valid solution.
Zeta

I did not see that. Should the type conversion be part of the code? Like this: (\l->sum l/2`elem`l).map fromInteger and it can be used like this: ((\l->sum l/2`elem`l).map fromInteger) ([2,3,5] :: [Integer]). I guess what threw me off was xnor mentioning the use of python 3 so the input didn't have to be 3.0 instead of 3. I thought the input type wasn't specified, just the way they were written...
basile-henry

If the type is a really a problem shouldn't the fact that I'm taking a list as input be more of an issue?
basile-henry

Good point. I would ask OP about that. But given that all the other answers also use a list, I guess it's OK (also, now I get why your function didn't type check when using tuples).
Zeta

Yes if the input was a tuple instead of a list neither sum nor elem would work, I should probably have specified it was a list but since this answer is literally what xnor submitted (in Haskell) I didn't think it was necessary. :)
basile-henry

2

Perl, 24 + 4 = 28 bytes

$^+=$_/2 for@F;$_=$^~~@F

Requires -paX flags to run, prints 1 as True and nothing as False:

-X disables all warnings.

$ perl -paXe'$^+=$_/2 for@F;$_=$^~~@F' <<< '5 3 7'
$ perl -paXe'$^+=$_/2 for@F;$_=$^~~@F' <<< '5 3 8'
1

Inspiring one. Inspired this: $_=eval(y/ /+/r)/2~~@F (uses same command-line options).
manatwork

@manatwork Interesting way to use tr :)
andlrc

You could leave that -X out by specifying some Perl version [5.10 .. 5.18). (Smart match was introduced in 5.10 and experimental warnings were introduced in 5.18. Any version between those two will work fine with ~~ without -X.)
manatwork

1

Jolf, 6 bytes

Try it here!

 hx½ux
_hx    the input array
   ½ux  has half the sum of the array

This is xnor's awesome solution to the problem, but in Jolf.


1

Pylons, 8

Yet another implementation of xnor's algorithm.

i:As2A/_

How it works:

i    # Get command line input.
:A   # Initialize a constant A.
  s  # Set A to the sum of the stack.
2    # Push 2 to the stack.
A    # Push A to the stack.
/    # Divide A/2
_    # Check if the top of the stack is in the previous elements.
     # Print the stack on quit.

1

SpecBAS - 36 bytes

Uses xnors formula

1 INPUT a,b,c: ?(a+b+c)/2 IN [a,b,c]

outputs 1 if true and 0 if false


1

05AB1E, 6 5 bytes

;Oм_O

-1 byte by creating a port of @xnor's Python 3 algorithm.

Try it online or verify all test cases.

Explanation:

·        # Halve every item in the input-array
         #  i.e. [10,6,4] → [5.0,3.0,2.0]
 O       # Sum this array
         #  i.e. [5.0,3.0,2.0] → 10.0
  м_O    # Output 1 if the input-array contain this sum, 0 otherwise
         #  i.e. [10,6,4] and 10.0 → 1

I'm pretty sure м_O can be shortened, but I'm not sure which command(s) I have to use for it..


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.