Zwei Werte zusammenführen

44

Sie haben zwei Werte, von denen jeder entweder 0"unbekannt" oder einen von "unbekannt" darstellt 1,2,3. Fügen Sie sie wie folgt zu einem einzigen Wert zusammen:

  • Wenn beide Werte ungleich Null und gleich sind, geben Sie diesen Wert aus:
    (3,3) -> 3
  • Wenn beide Werte ungleich Null, aber ungleich sind, geben Sie 0 für unknown aus:
    (1,2) -> 0
  • Wenn ein Wert Null ist und der andere nicht, geben Sie den Wert ungleich Null aus:
    (2,0) -> 2, (0,1) -> 1
  • Wenn beide Werte Null sind, wird Null ausgegeben:
    (0,0) -> 0

Testfälle:

Es gibt 16 mögliche Eingangspaare.

  | 0 1 2 3
--+--------
0 | 0 1 2 3
1 | 1 1 0 0
2 | 2 0 2 0
3 | 3 0 0 3

(0, 0) -> 0
(0, 1) -> 1
(0, 2) -> 2
(0, 3) -> 3
(1, 0) -> 1
(1, 1) -> 1
(1, 2) -> 0
(1, 3) -> 0
(2, 0) -> 2
(2, 1) -> 0
(2, 2) -> 2
(2, 3) -> 0
(3, 0) -> 3
(3, 1) -> 0
(3, 2) -> 0
(3, 3) -> 3

Bestenlisten

xnor
quelle
8
Die vierte Regel passt in die erste Regel, deshalb weiß ich nicht, warum Sie sie getrennt haben.
Fatalize
1
Nitpick: Der 4. Punkt ist überflüssig, Sie können einfach "ungleich Null" vom ersten Punkt entfernen. EDIT: Wow, was für ein Ninja @Fatalize ist.
Erik der Outgolfer
Auch 3 ist hier nicht wirklich notwendig, obwohl es die Anzahl der möglichen Eingaben erhöht.
Erik der Outgolfer
2
Ich überlegte, die Regeln zu verkürzen, dachte aber, es wäre am klarsten, nur alle Fälle aufzulisten, die nicht Null sind, und die Optimierung den Golfern zu überlassen.
Xnor
2
Hierfür ist eine Rangliste erforderlich . Auf der ersten Seite werden Antworten angezeigt , die auf der zweiten Seite bereits übertroffen wurden.
Ørjan Johansen

Antworten:

22

Python 3 , 27 25 Bytes

lambda x,y:(x|y)>>(x*y&2)

Probieren Sie es online!

Dennis
quelle
5
Ich finde es gut, dass dies bei Eingaben über 3 unterbrochen wird. Wie sind Sie darauf gekommen?
Jakob
4
Grundsätzlich viel Versuch und Irrtum.
Dennis
1
Interessant. Für einen Moment überlegte ich, eine Suche durch Ausdrücke mit begrenzter Länge mit zwei Ints und einigen Operatoren zu automatisieren, aber der Speicherplatz ist viel zu groß, selbst bei etwa 20 Bytes. Ein bisschen Intelligenz ist erforderlich!
Jakob
16

Gelee , 4 Bytes

gf|S

Probieren Sie es online!

Wie es funktioniert

gf|S  Main link. Left argument: x. Right argument: y.

g     Compute a, the gcd of x and y.
  |   Compute b, the bitwise OR of x and y.
 f    Filter; yield all common elements of [a] and [b].
   S  Take the sum.
Dennis
quelle
10

APL (Dyalog) , 5 Bytes

⌈×∧=⌊

Probieren Sie es online!

Nützliche Referenz

∧=⌊: Gibt zurück, 1wenn das niedrigste gemeinsame Vielfache dem Minimum entspricht. Dies gilt nur, wenn einer der Werte Null ist oder beide gleich sind. Alternativ könnte ich haben=*⌊

⌈×: Das Maximum multipliziert mit dem obigen Wert.

H.PWiz
quelle
7

Shakespeare-Programmiersprache , 296 Bytes

Z.Ford,.Ajax,.Act I:.Scene I:.[Enter Ford and Ajax]Ajax:Listen to thy heart.Ford:Listen to thy heart.Am I as fat as you?Ajax:If so,let us Scene C.Am I as fat as zero?If so,let us Scene C.Ford:Am I as fat as zero?If not,you zero.open heart.let us Scene V.Scene C:.Ajax:open heart.Scene V:.[Exeunt]

Probieren Sie es online!

Erste Teilnahme an einer Code-Golf-Challenge, also fangen wir mit einer meiner Lieblings-Scherzsprachen an!

Erläuterung: Deklaration der beiden Variablen Ford und Ajax (kürzeste verfügbare Variablennamen)

Z.Ford,.Ajax,.

Erste Szene: Fügen Sie die beiden Werte in die Variable ein, testen Sie sie auf Gleichheit und testen Sie Ajax gegen 0. Wenn der Wert, den wir zurückgeben müssen, in der Variablen Ford gespeichert ist, fahren Sie mit Szene C fort.

Act I:.
Scene I:.
[Enter Ford and Ajax]
Ajax:
Listen to thy heart.
Ford:Listen to thy heart.
Am I as fat as you?
Ajax:
If so,let us Scene C.
Am I as fat as zero?
If so,let us Scene C.

Wenn Ford 0 ist, geben Sie Ajax aus, andernfalls setzen Sie Ajax auf 0 und geben Sie Ajax aus. Gehen Sie dann zum Ende des Programms.

Ford:Am I as fat as zero?
If not,you zero.
open heart.
let us Scene V.

Szene C: Ford drucken

Scene C:.
Ajax:open heart.

Szene V: Programmende.

Scene V:.
[Exeunt]
Guillaume Ruchot
quelle
221 Bytes
Jo King
2
@JoKing Ihre Version ist zweifellos besser als meine, ich denke, es wäre besser, wenn Sie sie als Antwort veröffentlichen, da die Gründe für das Programm ganz anders sind und ich nicht die Ehre für Ihre Arbeit in
Anspruch
6

Ruby , 21 Bytes

->a,b{(a|b)*531[a*b]}

Probieren Sie es online!

Weil Ruby

Kurze Erklärung:

  • a|b ist bitwse OR, also gibt es uns die richtige Zahl, wenn a == b oder eine von ihnen Null ist.

  • Die magische Zahl 531ist 2 ^ 9 + 2 ^ 4 + 2 ^ 1 + 2 ^ 0, und der Operator [] extrahiert ein einzelnes Bit. Dies bedeutet: Mit 1 multiplizieren, wenn a * b 0, 1, 2, 4 oder 9 ist, andernfalls mit 0 multiplizieren.

  • Dies funktioniert bei Werten> 3 nicht
GB
quelle
5

Pyth , 8 7 Bytes

@{+0SQ3

Probieren Sie es online!

@{+0SQ3   Implicit: Q=input()

    SQ    Sort input
  +0      Prepend 0
 {        Deduplicate
@     3    Get 4th element (index 3), modular indexing

Fall 1 - Beide Werte ungleich Null und gleich

Sorted Input   [3,3]
Prepend 0      [0,3,3]
Deduplicate    [0,3] - index 3 yields 3

Fall 2 - Beide Werte ungleich Null und ungleich

Sorted Input   [1,2]
Prepend 0      [0,1,2]
Deduplicate    [0,1,2] - index 3 yields 0

Fall 3 - Genau ein Wert Null

Sorted Input   [0,1]
Prepend 0      [0,0,1]
Deduplicate    [0,1] - index 3 yields 1

Fall 4 - Beide Werte sind Null

Sorted Input   [0,0]
Prepend 0      [0,0,0]
Deduplicate    [0] - index 3 yields 0

Alternative Lösung, auch 7 Bytes

*eSQ}s{

Probieren Sie es online aus

*eSQ}s{QQ   Trailing Q's inferred

      {Q    Deduplicate input
     s      Take the sum
    }   Q   Is this in the input? True treated as 1, false as 0
*           Multiplied by
 eSQ        Max from input (end of sorted input) 

Vorherige Version, 8 Bytes

@+0{-QZ3
Sok
quelle
@xnor Danke, dass du das entdeckt hast, es sollte jetzt behoben sein
Sok
@{+0Q3arbeitet für 6 Bytes.
Mr. Xcoder
4

Stax , 8 Bytes

Ç∞∟∙◄╥*♣

Führen Sie es aus und debuggen Sie es

Ausgepackt, ungolfed und kommentiert sieht es so aus.

    e.g.        [2, 0]
c:s [2, 0] 2    calculate the "span" of the input array (max(a) - min(a))
+   [2, 0, 2]   append the span to the input array
o   [0, 2, 2]   sort the 3-element array
E   0 2 2       explode the 3 elements into 3 separate stack entries
a   2 2 0       rotate the third stack element to the top of stack
!   2 2 1       logical not, produces 1 iff the top value was 0
*   2 2         multiply
                implicitly print top of stack

Führen Sie dieses aus

rekursiv
quelle
4

(erste Einreichung, also bitte nicht zu fest treten)

Python 2 , 57 44 43 Bytes

lambda a,b:(0 if a*b else a+b)if a-b else a

Probieren Sie es online!

(komprimiert ein bisschen nach dem ersten Blick auf Python- Antwort)

Der 18. Oktober ist der Tag der Stille auf SE
quelle
33 Bytes
Jo King
Durchgestrichen 44 ist noch 44; (
Jo King
@JoKing huh wut? Ihre Lösung ist groß, ich versuchte es mit arithmetics zu tun, scheiterte aber und fiel zurück auf if / else
Oct18 Tag der Stille auf SE ist
4

C (gcc), 25 Bytes

f(a,b){a=a^b&&a*b?0:a|b;}

Pseudocode:

foo(A,B)
    if A XOR B and A*B are > 0
        return 0
    else 
        return A OR B`
Geo
quelle
3

C (gcc), 26 Bytes

f(a,b){a=a*b?a-b?0:a:a+b;}

Probieren Sie es online!

Expanation / Ungolfed:

int f(int a, int b) { // implicit-int (C89)
    // return replaced with assignment: link
    return a*b ? // if a and b are both not zero, then
        a-b ? // if a != b
        0 : // a != b, so return 0
        a // a == b, so return a
    : a+b // one of a,b is zero, so return whichever is nonzero 
    ;
}
Pizzapants184
quelle
3

MATL , 9 Bytes

dGp*~GX>*

Probieren Sie es online!

Erläuterung:

           % Implicit input as a vector with two elements implicitly. Stack: [0,2]
d          % The difference between the two elements. Stack: [2]
 G         % Push input again. Stack: [2], [0,2]
  p        % The product of the last element (the input). Stack: [2], [0]
   *       % Multiply the two elements on the stack. Stack: [0]
    ~      % Negate. Stack: [1]
     G     % Push input again. Stack: [1], [0,2]
      X>   % Maximum value. Stack: [1], [2]
        *  % Multiply the two elements on the stack. Stack: [2]
           % Implicit output
Stewie Griffin
quelle
Fehlgeschlagen outgolf:t?td~*]X>
sundar
3

GNU sed, 23 Bytes

s/^0?(.)\1?0?$/\1/
t
c0

(muss mit -rflag ausgeführt werden)

Probieren Sie es online!

KernelPanic
quelle
1
Willkommen bei PPCG :) Der aktuelle Konsens ist, dass Flaggen nicht gezählt werden (ich bin auf meinem Handy und kann daher die relevanten Metas nicht verknüpfen).
Shaggy
1
Oh cool! Ich bearbeite später, da ich auch am Telefon bin. Ein freies -3 Bytes ist ein großes Willkommen in PPCG :)
KernelPanic
3

QBasic, 34 Bytes

Anderer Ansatz!

INPUT a,b
?(a OR b)*-(a*b=0OR a=b)

Beachten Sie, dass die Nicht-Null-Werte im Ausgaberaster alle bitweise ORvon den beiden Eingabezahlen sind. Dies ist nur a OR bin QBasic. Wir wollen diesen Wert ausgeben, wenn a*b=0 OR a=bund 0ansonsten, was wir tun können, indem wir mit dem Negativen der oben genannten Bedingung multiplizieren (negativ, da die Wahrheit -1in QBasic ist).

DLosc
quelle
2

Brainfuck, 25 Bytes

,>,[>]<<[[->->+<<]>[>]]>.

Eingabe ist zwei Byte-Werte (nicht ASCII)

KSab
quelle
2

Schnell , 118 Bytes

func c(n1:Int,n2:Int){n1==n2 ? print("\(n1)") : (n1*n2 != 0 ? print("0") : (n1==0 ? print("\(n2)") : print("\(n1)")))}
onnoweb
quelle
4
Willkommen bei PPCG! Ich kenne Swift nicht, aber Sie können wahrscheinlich eine Menge Bytes sparen, indem Sie die Variablennamen mit jeweils einem Zeichen versehen und Leerzeichen um Operatoren wie !=und das Ternäre entfernen .
Freitag,
1
Hallo, willkommen bei PPCG! Wie von @ Οurous erwähnt, können Sie einzelne Zeichen ändern n1und n2verkürzen. Entfernen Sie einige Leerzeichen und Klammern, und entfernen Sie einige Leerzeichen. Darüber hinaus ==0kann <1und !=0kann es sein >0, da wir wissen, dass nur die Eingaben 0,1,2,3möglich sind. Noch nie zuvor in Swift programmiert, aber ich habe es auf 91 Bytes reduziert: func c(a:Int,b:Int){a==b ?print("\(a)"):a*b>0 ?print("0"):a<1 ?print("\(b)"):print("\(a)")} Probieren Sie es online aus.
Kevin Cruijssen
Außerdem können Sie es anscheinend auf 51 Bytes verkürzen: func c(a:Int,b:Int){print(a==b||a*b<1 ?max(a,b):0)} Probieren Sie es online aus. Nochmals herzlich willkommen bei PPCG, und genießen Sie Ihren Aufenthalt!
Kevin Cruijssen
1
Zusätzlich zu den Golfspielen von @ KevinCruijssen können Sie Ihre Einsendung in einen anonymen Abschluss umwandeln, um 87 Bytes zu sparen: {$0==$1||1>$0*$1 ?max($0,$1):0} Probieren Sie es online aus!
Mr. Xcoder
2

Batch, 38 36 35 30 Bytes

@cmd/cset/a"(%1|%2)>>(%1*%2&2)

Port von @ Dennis's Python antworte, da Konditionen in Batch zu teuer sind.

Neil
quelle
2

J , 8 7 Bytes

1 Byte von H.PWiz gespeichert.

>.*=^<.

Probieren Sie es online!

AJ Port der APL-Lösung von H.PWiz

=sind die zahlen gleich (ergibt 1 oder 0)

^ hoch

<. die kleinere Anzahl

* multipliziert mit

>. die größere Anzahl

Galen Ivanov
quelle
1
>.*=^<.für 7 Bytes
H.PWiz
@ H.PWiz Danke! Clevere Verwendung von =und ^!
Galen Ivanov
2

05AB1E , 9 8 Bytes

àIËIP_+*

-1 Byte dank @MagicOctopusUrn .

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

Erläuterung:

à         # Take the maximum of the input-list
          #  [0,2] → 2
IË        # Are all elements in the input-list equal?
          #  [0,2] → 0
  IP_     # Take the product of the input-list, and verify if it equals 0
          # (`_` transforms 0 into 1; everything else into 0)
          #  [0,2] → 0 (product) → 1 (==0)
     +    # Add them together (since only 1 is truthy in 05AB1E, this is basically an OR)
          #  0+1 → 1
*         # Multiply both values on the stack
          #  2*1 → 2

Verallgemeinerte Erklärung:

IËIP_+    # If both values are equal, or one of them is a zero:
 à        #  Output the maximum of the two values
          # Else:
          #  Output 0
Kevin Cruijssen
quelle
Ës0å~iZë0war meins; Schön. Ich bin mir nicht sicher, ob du 9 Bytes weit übertreffen kannst.
Magic Octopus Urn
1
Ich nehme das zurück, à®Ë®P_+*wo _es logischerweise äquivalent ist zu
Magic Octopus Urn
_verwandelt 0 in 1, alle anderen Werte in 0.
Magic Octopus Urn
@MagicOctopusUrn Danke! Als ich diese Antwort machte, schaute ich in den Dokumenten nach, ob es einen == 0Befehl gab, wusste aber _nicht genau, was das bedeutet. Sollte auch in Zukunft für andere Herausforderungen nützlich sein. Bis. :)
Kevin Cruijssen
2

Javascript, 35 Bytes

f=(m,n)=>(m||n)&&(m!=n)?(m>n?m:n):0
David
quelle
2

Javascript ES6, 25 22 21 20 Bytes

a=>b=>a?b-a?!b*a:a:b

14 13 Byte , Wenn die Argumente in sortierter Reihenfolge angegeben werden

a=>b=>a%b?0:b
MattH
quelle
2

QBasic, 38 36 35 Bytes

INPUT a,b
?(a*b>0)*(b-a*(a<>b))+a+b

Teilweise inspiriert von Eriks IF ... THEN ... ELSEAntwort , hier ist eine rein mathematische Lösung.

Wie bin ich hierher gekommen?

Wichtiger Hinweis zum Verständnis von Mathematik mit Bedingungen: In QBasic sind die Ergebnisse von Vergleichsoperatoren 0und -1, nicht 0und 1.

Wir beginnen mit Eriks Code:

IF a*b THEN?a*-(a=b)ELSE?a+b

Mit anderen Worten, wenn aund bbeide ungleich Null sind, dann drucke a*-(a=b)( awenn a=b, sonst 0); sonst (mindestens eines von aund bist Null), Ausgabe a+b(die Zahl ungleich Null oder 0wenn beide Null sind).

Hier ist schon ein bisschen Mathe mit Bedingungen im Gange. Lassen Sie uns einen Schritt weiter gehen und sehen, ob wir die IFAussage vollständig beseitigen können . Wir müssen a*b>0für die äußere Bedingung verwenden: a*bKann mehrere verschiedene Wahrheitswerte haben, was in Ordnung ist, IFaber Probleme für die Mathematik verursacht.

c=a*b>0
?c*a*(a=b)+(c+1)*(a+b)

Dies ist der Standard - Trick von IF-Eliminierung. Wann cist wahr, c*a*(a=b)ist -a*(a=b)und (c+1)*(a+b)ist 0; Wann cist falsch, c*a*(a=b)ist 0und (c+1)*(a+b)ist a+b. Dieser Ausdruck liefert also die gleichen Ergebnisse wie der IF ... THEN ... ELSE. Das einzige Problem ist, dass unser Programm 40 Bytes anstatt 38 Bytes hat. Vielleicht können wir es verkürzen, indem wir die Mathematik neu ordnen.

c=a*b>0
?c*a*(a=b)+c*(a+b)+a+b

Noch 40 Bytes ...

c=a*b>0
?c*(a+b+a*(a=b))+a+b

Jetzt ist unser Programm wieder auf 38 Bytes. Da wir es jedoch nur ceinmal verwenden, müssen wir es keiner Variablen mehr zuweisen:

?(a*b>0)*(a+b+a*(a=b))+a+b

Jetzt haben wir nur noch 36 Bytes.

Aber warte, es gibt noch mehr ... Dieser a+b+a*(a=b)Ausdruck sieht ein bisschen überflüssig aus. a*(a=b)ist -aob a=bund 0sonst. Wenn wir es hinzufügen a, erhalten wir 0ob a=bund aanders. Vielleicht können wir dasselbe in weniger Bytes erreichen, indem wir die Bedingung umkehren.

b+a*-(a<>b)

Das sieht auf den ersten Blick nicht kürzer aus. Aber wir können ein Byte sparen, indem wir subtrahieren, anstatt ein Negativ hinzuzufügen:

b-a*(a<>b)

Und da haben wir unsere 35-Byte-Lösung.

DLosc
quelle
Schöner Trick da drüben ...
Erik the Outgolfer
1

Sauber , 46 43 42 Bytes

import StdEnv
?[a,b]|a<1||a==b=b=0

?o sort

Probieren Sie es online!

Anonyme Komposition :: [Int] -> Int, sortiert das Paar und vergleicht dann das erste Mitglied.

Es als komponiertes Lambda zu machen, hat die gleiche Länge:

import StdEnv

(\[a,b]|a<1||a==b=b=0)o sort
Οurous
quelle
1

Gelee , 7 6 Bytes

׬o=a»

Probieren Sie es online! oder Probieren Sie alle Kombinationen aus!

Wie?

׬o=a»   Dyadic link
×        Multiply the two arguments.
 ¬       Logical not. Gives 1 if one argument is 0, 1 otherwise.
   =     Are the two arguments equal?
  o      Logical or the result of = and ¬. 
     »   Greater of the two arguments.
    a    Logical and. Gives the greater of the two arguments if they are equal
         or if one of them is zero and gives 0 otherwise.

Bei Verwendung der Methode in der APL-Antwort erhalten wir die gleiche Byteanzahl. Ein Byte länger als diese Antwort, da das niedrigste gemeinsame Vielfache zwei Bytes beträgt.

6 Bytes

«=æl×»

Probieren Sie es online!

dylnan
quelle
Ich
stelle
@ H.PWiz Oh, ich dachte, du wendest die gleiche Methode an wie im Link
dylnan
Ich gebe zwei Methoden ∧=⌊und =*⌊. Die zweite davon wird von Jelly
H.PWiz
@ H.PWiz Ich spreche kein APL, ich habe nur die von Ihnen beschriebene Methode verwendet. Was macht =*⌊das?
Dylnan
Es ist so ziemlich dasselbe wie bei Jelly, nur dass es sich um ein Minimum handelt. Oder man könnte ×in beiden Sprachen verwenden
H.PWiz