Fusionner deux valeurs

44

Vous avez deux valeurs représentant chacune 0"inconnue" ou l'une des 1,2,3. Fusionnez-les en une seule valeur comme suit:

  • Si les deux valeurs sont différentes de zéro et égales, indiquez cette valeur:
    (3,3) -> 3
  • Si les deux valeurs sont non nulles mais inégales, indiquez 0 pour unknown:
    (1,2) -> 0
  • Si l'une des valeurs est zéro et l'autre non, indiquez la valeur différente de zéro:
    (2,0) -> 2, (0,1) -> 1
  • Si les deux valeurs sont zéro, la sortie zéro:
    (0,0) -> 0

Cas de test:

Il y a 16 paires d'entrées possibles.

  | 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

Classements

Xnor
la source
8
La quatrième règle correspond à la première règle, donc je ne sais pas pourquoi vous les avez séparées.
Fataliser
1
Nitpick: Le 4ème point est redondant, vous pouvez simplement supprimer "différent de zéro" du premier point. EDIT: Wow, quel ninja @ Fatalize est.
Erik the Outgolfer
De plus, 3 n'est pas vraiment nécessaire ici, bien que cela augmente le nombre d'entrées possibles.
Erik the Outgolfer
2
J'ai envisagé de condenser les règles, mais j'ai pensé qu'il serait plus clair de simplement énumérer tous les cas zéro / non nuls et de laisser l'optimisation aux golfeurs.
xnor
2
Cela nécessite un classement , la première page commence à avoir des réponses déjà battues sur la seconde.
Ørjan Johansen

Réponses:

22

Python 3 , 27 25 octets

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

Essayez-le en ligne!

Dennis
la source
5
J'aime que ça casse pour les entrées plus de 3. Comment avez-vous trouvé ça?
Jakob
4
Fondamentalement beaucoup d'essais et d'erreur.
Dennis
1
Intéressant. Pendant un moment, j'ai pensé automatiser une recherche grâce à des expressions de longueur limitée impliquant deux entiers et quelques opérateurs, mais l'espace est beaucoup trop grand, même à environ 20 octets. Une certaine intelligence est nécessaire!
Jakob
16

Gelée , 4 octets

gf|S

Essayez-le en ligne!

Comment ça marche

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
la source
10

APL (Dyalog) , 5 octets

⌈×∧=⌊

Essayez-le en ligne!

Référence utile

∧=⌊: Retourne 1si le plus petit commun multiple est égal au minimum. Cela n'est vrai que si l'une des valeurs est zéro ou si les deux sont égaux. Sinon, je pourrais avoir=*⌊

⌈×: Le maximum multiplié par ce qui précède.

H.PWiz
la source
7

Langage de programmation Shakespeare , 296 octets

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]

Essayez-le en ligne!

Première participation à un défi de code-golf, commençons avec l'une de mes langues de blague préférées!

Explication: Déclaration des deux variables Ford et Ajax (noms de variables les plus courts disponibles)

Z.Ford,.Ajax,.

Première scène: Mettez les deux valeurs dans la variable, puis testez-les pour égalité, puis testez Ajax contre 0. Si la valeur que nous devons renvoyer est stockée dans la variable Ford, passez à la scène C.

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.

Si Ford vaut 0, imprimez Ajax, sinon définissez Ajax sur 0, puis imprimez Ajax. Ensuite, allez à la fin du programme.

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

Scène C: Print Ford

Scene C:.
Ajax:open heart.

Scène V: Fin du programme.

Scene V:.
[Exeunt]
Guillaume Ruchot
la source
221 octets
Jo King
2
@JoKing ta version est indéniablement meilleure que la mienne, je pense qu'il serait préférable que tu l'affiche comme réponse car le raisonnement derrière le programme est assez différent et je ne veux pas prendre le crédit de ton travail
Guillaume Ruchot
6

Ruby , 21 octets

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

Essayez-le en ligne!

Parce que ruby

Brève explication:

  • a|b est bitwse OU, il nous donne donc le bon nombre si a == b ou l’un d’eux vaut zéro.

  • Le nombre magique 531est 2 ^ 9 + 2 ^ 4 + 2 ^ 1 + 2 ^ 0, et l'opérateur [] extrait un seul bit. Cela signifie: multipliez par 1 si a * b vaut 0, 1, 2, 4 ou 9, multipliez par 0 sinon.

  • Cela ne fonctionnera pas pour les valeurs> 3
GB
la source
5

Pyth , 8 7 octets

@{+0SQ3

Essayez-le en ligne!

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

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

Cas 1 - Les deux valeurs non nulles et égales

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

Cas 2 - Les deux valeurs non nulles et inégales

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

Cas 3 - Exactement une valeur zéro

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

Cas 4 - Les deux valeurs zéro

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

Solution alternative, également 7 octets

*eSQ}s{

Essayez-le en ligne

*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) 

Version précédente, 8 octets

@+0{-QZ3
Sok
la source
@xnor Merci de l'avoir remarqué, il devrait être corrigé maintenant
Sok
@{+0Q3fonctionne pour 6 octets.
M. Xcoder
4

Stax , 8 octets

Ç∞∟∙◄╥*♣

Exécuter et déboguer

Déballé, non golfé et commenté, cela ressemble à ceci.

    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

Exécuter celui-ci

récursif
la source
4

(première soumission alors s'il vous plaît ne donnez pas un coup de pied trop fort)

Python 2 , 57 44 43 octets

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

Essayez-le en ligne!

(compressé un peu après avoir regardé la première réponse python )

aaaaa dit de rétablir Monica
la source
33 octets
Jo King
44 sont toujours sur 44; (
Jo King
@JoKing hein wut? Votre solution est excellente. J'ai essayé de le faire avec des calculs arithmétiques, mais j'ai échoué et je suis revenu à si / sinon
aaaaa dit de rétablir Monica
4

C (gcc), 25 octets

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

pseudo-code:

foo(A,B)
    if A XOR B and A*B are > 0
        return 0
    else 
        return A OR B`
Géo
la source
3

C (gcc), 26 octets

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

Essayez-le en ligne!

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
la source
3

MATL , 9 octets

dGp*~GX>*

Essayez-le en ligne!

Explication:

           % 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
la source
Outgolf raté:t?td~*]X>
dimanche
3

GNU sed, 23 bytes

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

(doit être couru avec -rflag)

Essayez-le en ligne!

KernelPanic
la source
1
Bienvenue à PPCG :) Le consensus actuel est que les drapeaux ne sont pas comptés (je suis sur mon téléphone, donc je ne peux pas lier les méta pertinents).
Shaggy
1
Oh cool! J'éditerai plus tard puisque je suis aussi sur mon téléphone; 3 octets gratuits sont les bienvenus chez PPCG :)
KernelPanic
3

QBasic, 34 octets

Une approche différente!

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

Observez que les valeurs non nulles dans la grille de sortie correspondent au bit à bit ORdes deux nombres entrés. Ceci est juste a OR bdans QBasic. Nous voulons sortir cette valeur quand a*b=0 OR a=bet 0autrement, ce que nous pouvons faire en multipliant par le négatif du conditionnel susmentionné (négatif, puisque la vérité est -1en QBasic).

DLosc
la source
2

brainfuck, 25 octets

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

L'entrée est constituée de deux octets (pas de valeur ascii)

KSab
la source
2

Rapide , 118 octets

func c(n1:Int,n2:Int){n1==n2 ? print("\(n1)") : (n1*n2 != 0 ? print("0") : (n1==0 ? print("\(n2)") : print("\(n1)")))}
onnoweb
la source
4
Bienvenue chez PPCG! Je ne connais pas Swift, mais vous pouvez probablement économiser beaucoup d'octets en attribuant un nom à chaque variable et en supprimant les espaces autour d'opérateurs tels que !=et le ternaire.
urous
1
Bonjour, bienvenue sur PPCG! Comme mentionné par @ Οurous, vous pouvez modifier n1et n2raccourcir les caractères; supprimer des espaces et des parenthèses, et supprimer des espaces. De plus, ==0peut être <1et !=0peut être >0, puisque nous savons que seules les entrées 0,1,2,3sont possibles. Jamais programmé auparavant dans Swift non plus, mais je l’ai eu à 91 octets comme ceci: func c(a:Int,b:Int){a==b ?print("\(a)"):a*b>0 ?print("0"):a<1 ?print("\(b)"):print("\(a)")} Essayez-le en ligne.
Kevin Cruijssen
En outre, il semble que vous puissiez le réduire à 51 octets, comme ceci: func c(a:Int,b:Int){print(a==b||a*b<1 ?max(a,b):0)} Essayez-le en ligne. Encore une fois, bienvenue à PPCG et profitez de votre séjour!
Kevin Cruijssen
1
En plus des parcours de @ KevinCruijssen, vous pouvez transformer votre soumission en fermeture anonyme pour économiser 87 octets: {$0==$1||1>$0*$1 ?max($0,$1):0} essayez-le en ligne!
M. Xcoder
2

Lot, 38 36 35 30 octets

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

Réponse de Port of @ Dennis's Python, car les conditionnelles sont trop chères dans Batch.

Neil
la source
2

J , 8 7 octets

1 octet enregistré par H.PWiz.

>.*=^<.

Essayez-le en ligne!

Port AJ de la solution APL de H.PWiz

=les chiffres sont-ils égaux? (résultats en 1 ou 0)

^ au pouvoir de

<. le plus petit nombre

* multiplié par

>. le plus grand nombre

Galen Ivanov
la source
1
>.*=^<.pour 7 octets
H.PWiz
@ H.PWiz Merci! Utilisation intelligente de =et ^!
Galen Ivanov
2

05AB1E , 9 à 8 octets

àIËIP_+*

-1 octet grâce à @MagicOctopusUrn .

Essayez-le en ligne ou vérifiez tous les cas de test .

Explication:

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

Explication généralisée:

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
la source
Ës0å~iZë0était à moi; joli. Pas vraiment sûr que vous pouvez battre 9 octets de beaucoup.
Urne Magic Octopus
1
Je retiens que à®Ë®P_+*ou _est logiquement équivalent à
Urne Magique Octopus
_transforme 0 en 1, toutes les autres valeurs en 0.
Urne Magic Octopus
@MagicOctopusUrn Merci! Lorsque j’ai répondu à cette question, j’étais en train de regarder la documentation pour voir s’il y avait une == 0commande, je _ne savais pas que c'était exactement ce que je faisais . Devrait également être utile pour d’autres défis à venir. TIL. :)
Kevin Cruijssen
2

Javascript, 35 octets

f=(m,n)=>(m||n)&&(m!=n)?(m>n?m:n):0
david
la source
2

Javascript ES6, 25 22 21 20 octets

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

14 13 octets , si les arguments sont fournis dans l'ordre de tri

a=>b=>a%b?0:b
MattH
la source
2

QBasic, 38 36 35 octets

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

Inspiré en partie par la IF ... THEN ... ELSEréponse d' Erik , voici une solution réservée aux mathématiques.

Comment je suis arrivé ici

Remarque importante pour comprendre les mathématiques avec conditions: dans QBasic, les résultats des opérateurs de comparaison sont 0et -1, pas 0et 1.

Nous commençons avec le code d'Erik:

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

En d'autres termes, si aet bsont tous deux non nuls, alors print a*-(a=b)( aif a=b, sinon 0); else (au moins un de aet best zéro), sortie a+b(le nombre différent de zéro, ou 0s’ils sont tous deux nuls).

Il y a déjà un peu de math avec des conditions conditionnelles ici. Allons un peu plus loin et voyons si nous pouvons éliminer IFcomplètement la déclaration. Nous devrons utiliser a*b>0pour la condition externe: a*bpeut avoir plusieurs valeurs de vérité différentes, ce qui est bien pour IFmais cause des problèmes pour les mathématiques.

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

C'est le truc standard de l' IFélimination. Quand cest vrai, c*a*(a=b)est -a*(a=b)et (c+1)*(a+b)est 0; quand cest faux, c*a*(a=b)est 0et (c+1)*(a+b)est a+b. Donc, cette expression donne les mêmes résultats que le IF ... THEN ... ELSE. Le seul problème, c’est que notre programme a 40 octets au lieu de 38. Nous pourrions peut-être le raccourcir en réorganisant les calculs.

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

Encore 40 octets ...

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

Notre programme est maintenant de retour à 38 octets. Mais comme nous n’utilisons qu’une cfois, nous n’avons plus à l’affecter à une variable:

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

Il ne reste plus que 36 octets.

Mais attendez il y a plus ... Cette a+b+a*(a=b)expression semble un peu redondante. a*(a=b)est -asi a=bet 0autrement. Lorsque nous ajoutons à a, nous obtenons 0si a=bet asinon. Peut-être pouvons-nous obtenir la même chose en moins d'octets en inversant la condition.

b+a*-(a<>b)

Au début, cela ne semble pas plus court. Mais nous pouvons économiser un octet en soustrayant au lieu d’ajouter un négatif:

b-a*(a<>b)

Et nous avons là notre solution à 35 octets.

DLosc
la source
Joli coup là-bas ...
Erik the Outgolfer
1

Propre , 46 43 42 octets

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

?o sort

Essayez-le en ligne!

Composition anonyme :: [Int] -> Int, trie la paire puis associe le premier membre.

Le faire comme un lambda composé a la même longueur:

import StdEnv

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

Gelée , 7 à 6 octets

׬o=a»

Essayez-le en ligne! ou essayez toutes les combinaisons!

Comment?

׬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.

En utilisant la méthode de la réponse APL , nous obtenons le même nombre d'octets. Un octet plus long que cette réponse, car le plus petit commun est deux octets.

6 octets

«=æl×»

Essayez-le en ligne!

Dylnan
la source
Je note également une autre méthode ci
H.PWiz
@ H.PWiz Oh, je pensais que vous utilisiez la même méthode que celle du lien
Dylnan,
Je donne deux méthodes ∧=⌊et =*⌊. La seconde est préférée par Jelly
H.PWiz
@ H.PWiz Je ne parle pas APL, je n'utilisais que la méthode que vous avez décrite. Que fait =*⌊-il?
Dylnan
C'est à peu près la même chose que Jelly, sauf que c'est minimum. Ou on pourrait utiliser ×dans les deux langues
H.PWiz