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.


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!


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.


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.


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!


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)

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.


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.

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}

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;}

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


{@_∋@_.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)


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

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.


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

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

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


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)

2

Im Ernst, 6 Bytes

,;䫡u

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


2

Mathematica, 20 bis 19 Bytes

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

Funktioniert ähnlich wie die meisten anderen Antworten.


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.


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

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

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.

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


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.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.