Differenz von drei Ganzzahlen

30

Implementieren Sie eine Funktion diff, die drei Ganzzahlen x, y und z als Eingabe verwendet. Es sollte zurückgegeben werden, ob das Subtrahieren einer dieser Zahlen von einer anderen die dritte ergibt.

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

Sie müssen die Funktion nicht benennen. Möglicherweise implementieren Sie Standardeingabemethoden. Die obigen Beispiele sind keine strengen Richtlinien.

Mir
quelle
5
Dies ist eine angemessene Herausforderung, aber es besteht keine Notwendigkeit, sie auf Python oder Funktionen zu beschränken. In der Regel sind solche Beschränkungen verpönt, weil sie die Teilnahme einschränken. Außerdem sollten Sie einige Testfälle einschließen.
Xnor
Hey, ich habe es ein wenig repariert. Hoffe das reicht!
Mir
2
Sieht besser aus! Ich empfehle nach wie vor dringend, die Standardeingabemethoden , insbesondere Programme, zuzulassen , da einige Sprachen keine Funktionen haben. Und Funktionen dürfen einen anderen Namen oder keinen Namen haben.
Xnor
Der erste und der letzte Absatz widersprechen sich jetzt. Um das noch einmal zu überprüfen: Müssen wir eine Funktion schreiben oder sind vollständige Programme in Ordnung?
Sp3000
vollständige Programme sind in Ordnung, ich möchte so wenig Einschränkungen wie möglich auferlegen, außer dass die Standardeingabemethoden befolgt werden. Wenn die Python3-Beispiele ordentlich sind!
Mir

Antworten:

14

Gelee , 5 3 Bytes

Vielen Dank an @ Sp3000 für das Speichern von zwei Bytes!

Code verwendet den gleichen Algorithmus wie @ xnors großartige Antwort :

SfḤ

Erläuterung:

S     # Sum of the argument list
  Ḥ   # Double the list
 f    # Filter, remove everything that isn't equal to the sum of the list

Dies gibt []als falsch und alles andere als wahr.

Probieren Sie es online!

Adnan
quelle
51

Python 3, 21 Bytes

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

Wenn sich zwei Zahlen addieren, verdoppelt sich die Summe aller drei Zahlen gegenüber der anderen Zahl, sodass die Hälfte der Summe ein Element der Liste ist. Python 3 wird benötigt, um Unterteilungen zu vermeiden, es sei denn, die Zahlen sind wie 3.0und nicht wie angegeben 3.

xnor
quelle
7

ES6, 31 Bytes

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

Fügen Sie 5 Bytes hinzu, wenn Sie die Funktion benennen müssen diff.

Bearbeiten: 2 Bytes dank @Alex L gespeichert.

Neil
quelle
Sie können durch den Austausch von zwei Bytes speichern ||mit |(glaube ich)
HyperNeutrino
@AlexL. Ah richtig, ich hatte zu viel Lust, Booleaner zurückgeben zu müssen.
Neil
Gibt auch bei |Booleschen Werten genau dann einen Booleschen Wert zurück, wenn beide Werte Boolesche Werte sind. Also true | false == true, aber 3 | 5 == 7. Gleiches gilt &&und &. Der einzige Unterschied zwischen |und ||wenn es um Boolesche Werte geht: Nimmt |den ersten und den zweiten Wert und ermittelt das ODER dieser beiden. ||nimmt den ersten Wert an; Wenn dies der Fall ist true, geben Sie den zweiten Wert zurück.
HyperNeutrino
@AlexL. true | falsewird in JavaScript zu 1 ausgewertet (was zwar wahr, aber nicht boolesch ist).
Neil
Oh. Entschuldigung, ich benutze JS nicht wirklich. Ich benutze hauptsächlich Java, woher ich diese Informationen habe. ;)
HyperNeutrino
4

APL, 8 5 Bytes

+/∊+⍨

Dies ist ein monadischer Funktionszug, der ein Array akzeptiert und einen Booleschen Wert (0/1 in APL) zurückgibt. Es verwendet den gleichen Algorithmus wie die Python 3- Antwort von xnor .

Erläuterung:

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

Probieren Sie es online aus

3 Bytes gespart dank Dennis!

Alex A.
quelle
4

JavaScript ES6, 38 34 33 Bytes

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

Sehr einfache anonyme Funktion, die aus der Python-Antwort entlehnt ist. Übernimmt die Eingabe xals Array; zurück trueoder false. Bytes zu Molarmanful und jrich rasiert

Ein 38-Byte-Programm, bei dem jede Zahl als Argument verwendet wird:

(a,b,c)=>[a,b,c].some(t=>t==(a+b+c)/2)
Conor O'Brien
quelle
Versuchen Sie x=>x.some(a=>a==eval(x.join`+`)/2), das spart 4 Bytes.
Mama Fun Roll
@ ӍѲꝆΛҐӍΛПӍѲꝆΛҐӍΛ Danke! Guter Trick.
Conor O'Brien
x=>x.some(a=>2*a==x[0]+x[1]+x[2])scheint zu funktionieren.
Jrich
@jrich Danke! Guter Trick!
Conor O'Brien
3

Oracle SQL 11.2, 49 Bytes

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

@Xnor-Lösung umschreiben, ein großes Lob an ihn.

Jeto
quelle
3

J, 6 Bytes

+/e.+:

Versuchen Sie es mit J.js .

Wie es funktioniert

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

DUP , 31 Zeichen / 39 Bytes

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

Try it here!

Mein erster DUP-Beitrag! Unicode ist Ihre Auster.

Es ist eine anonyme Funktion / Lambda. Verwendung:

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

Erläuterung

[                               {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}
Mama Fun Roll
quelle
Ich glaube nicht, dass eine Codierung so funktioniert ...
Conor O'Brien
øHat Codepunkt 248, ist also ein Byte, wenn es als ISO 8859-1 codiert ist.
Dennis
1
... , die in Ordnung, solange der Interpreter kann tatsächlich Arbeit mit einer ISO - 8859-1 codierten Quelldatei.
Martin Ender
@ MartinBüttner Ich glaube nicht, dass es möglich ist, das zu testen.
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;}
Marky Markov
quelle
3

Perl 6, 20 19 Bytes

Ich habe zwei Funktionen, die in der Byteanzahl gleich sind, also werde ich beide setzen. Schätzen Sie, was Sie interessiert.

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

Verwendung: Weisen Sie eine der Variablen zu, von der aus Sie sie aufrufen können.
EDIT: Danke @ b2gills für die Byte-Reduzierung

Hotkeys
quelle
{@_∋@_.sum div 2}und {@_∋+~(@_.sum/2)}sind beide kürzer
Brad Gilbert b2gills
Oh, danke, ich vergesse immer, dass du sum als dotty Methode
aufrufen
Was macht das?
User112638726
"∋" ist der Infix-Operator "enthält", der besagt, dass der linke den rechten enthält. Es ist die Schwester des "∈" -Elements op, die besagt, dass die Linke ein Element der Rechten ist. Sie sind beide Set-Ops und Perl 6 unterstützt auch viele andere! docs.perl6.org/language/…
Hotkeys
3

Java 8 (Lambda-Funktion), 29 Byte

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

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

Java-Code-Golflösungen sind normalerweise nur kurz, wenn das Programm kein voll funktionsfähiges Programm sein muss. (* Husten Husten * Klassendeklaration, Hauptmethode)

HyperNeutrino
quelle
2

Pyth, 6 Bytes

/Q/sQ2

Probieren Sie es online!

Erwartet die Eingabe als Liste von Ganzzahlen. Gibt 0 aus, wenn keine Zahl gebildet werden kann, indem die anderen beiden subtrahiert werden, und> 0, wenn mindestens eine möglich ist.

Erläuterung:

Gleicher Algorithmus wie die Antwort von @xnor

/ Q / sQ2

   sQ # Summe aller Elemente in der Liste
  / 2 # Teilen Sie die Summe durch 2
/ Q # Count Vorkommen der obigen Nummer in der Liste
Denker
quelle
2

05AB1E , nicht konkurrierend

4 Bytes , nicht konkurrierend wegen einer blöden Sache. Code:

DO;¢

Verwenden von 0 als falsch und> 0 als wahr. Verwendet CP-1252-Codierung.

Adnan
quelle
Was ist das "Dumme", was diese Konkurrenzlosigkeit ausmacht?
Kyle Kanos
@KyleKanos Ich habe bereits in Info.txt geschrieben, dass ;die Spitze des Stapels halbiert. Aber raten Sie mal, ich habe es nie implementiert -_-.
Adnan
1
Ah. Ich kann sehen, wie das geht
Kyle Kanos
2

Kona 16 Zeichen

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

Nimmt einen Vektor vom Stapel, summiert ihn, dividiert durch 2 und bestimmt, ob er sich im Vektor befindet. Gibt 1 als wahr und 0 als falsch zurück.

Angerufen über

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

jq, 17 Zeichen

(Noch eine andere Umschreiben von xnor ‚s Python 3 Antwort . Upvotes zu , dass man gehen sollte.)

contains([add/2])

Eingabe: Array mit 3 ganzen Zahlen.

Probelauf:

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

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

Online-Test:

jq, 18 Zeichen

(17 Zeichen Code + 1 Zeichen Befehlszeilenoption.)

contains([add/2])

Eingabe: Liste mit 3 ganzen Zahlen.

Probelauf:

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

bash-4.3$ jq -s 'contains([add/2])' <<< '2 3 -5'
false
Mann bei der Arbeit
quelle
2

MATL , 5 Bytes

Mit @ xnors großartigem Ansatz :

s2/Gm

Probieren Sie es online!

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

Brute-Force-Ansatz, 12 Byte :

Y@TT-1h*!s~a

Probieren Sie es online!

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
Luis Mendo
quelle
2

𝔼𝕊𝕄𝕚𝕟, 7 Zeichen / 9 Bytes

ï⒮≔⨭ï/2

Try it here (Firefox only).

Meh. Ich finde immer noch bessere Wege. Es ist nur @ xnors großartiger Algorithmus.

Mama Fun Roll
quelle
2

CJam, 10 12 Bytes

l~:d_:+2/&

2 Bytes entfernt dank @ MartinBüttner.

Dies zeigt eine Zahl als wahres Ergebnis und keine Ausgabe als falsches Ergebnis an.

Probieren Sie es hier aus

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)
Luis Mendo
quelle
2

Im Ernst, 6 Bytes

,;䫡u

Gibt 0 aus, wenn dies falsch ist, und eine positive Ganzzahl, wenn dies nicht der Fall ist.

Mego
quelle
2

Mathematica, 20 bis 19 Bytes

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

Funktioniert ähnlich wie die meisten anderen Antworten.

LegionMammal978
quelle
Wie wäre es MemberQ[2{##},+##]&? (und du hast deine Byteanzahl vergessen)
Martin Ender
2

Haskell, 20 Bytes

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

Verwenden von xnors Lösung.

Basilikum-Henry
quelle
Da (/)dies nicht für ganze Zahlen funktioniert und die Challenge nach ganzen Zahlen fragt, bin ich mir nicht sicher, ob dies tatsächlich eine gültige Lösung ist.
Zeta
Das habe ich nicht gesehen. Sollte die Typkonvertierung Teil des Codes sein? Wie folgt aus : (\l->sum l/2`elem`l).map fromIntegerund es kann wie folgt verwendet werden: ((\l->sum l/2`elem`l).map fromInteger) ([2,3,5] :: [Integer]). Ich denke , was warf mich weg war xnor die Verwendung von Python zu erwähnen , 3 , so dass die Eingabe nicht 3,0 statt 3 sein , hatte ich gedacht , der Eingangstyp wurde nicht angegeben, sondern nur die Art , wie sie geschrieben wurden ...
basile- Henry
Wenn der Typ wirklich ein Problem ist, sollte die Tatsache, dass ich eine Liste als Eingabe nehme, nicht eher ein Problem sein?
basile-henry
Guter Punkt. Ich würde OP danach fragen. Da aber auch alle anderen Antworten eine Liste verwenden, ist das in Ordnung (jetzt verstehe ich auch, warum Ihre Funktion bei der Verwendung von Tupeln nicht check eingegeben hat).
Zeta
Ja, wenn die Eingabe ein Tupel anstelle einer Liste wäre, die weder funktioniert sumnoch elemfunktioniert hätte, hätte ich wahrscheinlich angeben sollen, dass es sich um eine Liste handelt, aber da diese Antwort buchstäblich das ist, was xnor (in Haskell) übermittelt hat, hielt ich sie nicht für notwendig. :)
basile-henry
2

Perl, 24 + 4 = 28 Bytes

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

Erfordert -paXFlags zum Ausführen, druckt 1als True und nichts als False:

-X Deaktiviert alle Warnungen.

$ perl -paXe'$^+=$_/2 for@F;$_=$^~~@F' <<< '5 3 7'
$ perl -paXe'$^+=$_/2 for@F;$_=$^~~@F' <<< '5 3 8'
1
undlrc
quelle
Inspirierend. Inspiriert dies: $_=eval(y/ /+/r)/2~~@F(verwendet dieselben Befehlszeilenoptionen).
Manatwork
@ Manatwork Interessante Art und Weise zu verwenden tr:)
andlrc
Sie können dies weglassen, -Xindem Sie eine Perl-Version angeben [5.10 .. 5.18). (Smart Match wurde in 5.10 eingeführt und experimentelle Warnungen wurden in 5.18 eingeführt. Jede Version zwischen diesen beiden wird gut mit ~~ohne funktionieren -X.)
Manatwork
1

Jolf, 6 Bytes

Probieren Sie es hier aus!

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

Dies ist xnors großartige Lösung für das Problem, aber in Jolf.

Conor O'Brien
quelle
1

Pylone , 8

Noch eine andere Implementierung von xnors Algorithmus.

i:As2A/_

Wie es funktioniert:

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.
Morgan Thrapp
quelle
1

SpecBAS - 36 Bytes

Verwendet die Formel xnors

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

Gibt 1 aus, wenn wahr, und 0, wenn falsch

Brian
quelle
1

05AB1E , 6 5 Bytes

;Oм_O

-1 Byte durch Erstellen eines Ports von @xnors Python 3-Algorithmus .

Probieren Sie es online aus oder überprüfen Sie alle Testfälle .

Erläuterung:

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

Ich bin mir ziemlich sicher, dass м_Oman es verkürzen kann, aber ich bin mir nicht sicher, welche Befehle ich dafür verwenden muss.

Kevin Cruijssen
quelle