Üç 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.