Fusiona dos valores

44

Tiene dos valores, cada uno de los cuales 0representa "desconocido" o uno de ellos 1,2,3. Fusionarlos en un solo valor de la siguiente manera:

  • Si ambos valores son distintos de cero e iguales, genere ese valor:
    (3,3) -> 3
  • Si ambos valores son distintos de cero pero desiguales, salida 0 para desconocido:
    (1,2) -> 0
  • Si un valor es cero y el otro no, envíe el valor distinto de cero:
    (2,0) -> 2, (0,1) -> 1
  • Si ambos valores son cero, salida cero:
    (0,0) -> 0

Casos de prueba:

Hay 16 posibles pares de entrada.

  | 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

Tablas de clasificación

xnor
fuente
8
La cuarta regla encaja en la primera regla, así que no sé por qué las separó.
Fatalize
1
Nitpick: El cuarto punto es redundante, solo puede eliminar "distinto de cero" del primer punto. EDITAR: Wow, qué ninja es @Fatalize.
Erik the Outgolfer
Además, 3 no es realmente necesario aquí, aunque aumenta el número de posibles entradas.
Erik the Outgolfer
2
Pensé en condensar las reglas, pero pensé que sería más claro enumerar todos los casos cero / distintos de cero y dejar la optimización a los golfistas.
xnor
2
Esto necesita una tabla de clasificación , la primera página está comenzando a obtener respuestas ya superadas en la segunda.
Ørjan Johansen

Respuestas:

22

Python 3 , 27 25 bytes

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

Pruébalo en línea!

Dennis
fuente
55
Me gusta que esto se rompa para entradas de más de 3. ¿Cómo se te ocurrió esto?
Jakob
44
Básicamente mucha prueba y error.
Dennis
1
Interesante. Por un momento pensé en automatizar una búsqueda a través de expresiones de longitud limitada que involucraban dos entradas y algunos operadores, pero el espacio es demasiado grande incluso en alrededor de 20 bytes. Se requiere algo de inteligencia!
Jakob
16

Jalea , 4 bytes

gf|S

Pruébalo en línea!

Cómo funciona

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
fuente
10

APL (Dyalog) , 5 bytes

⌈×∧=⌊

Pruébalo en línea!

Referencia útil

∧=⌊: Devuelve 1si el mínimo común múltiplo es igual al mínimo. Esto solo es cierto si uno de los valores es cero o ambos son iguales. Alternativamente podría tener=*⌊

⌈×: El máximo multiplicado por lo anterior.

H.PWiz
fuente
7

Lenguaje de programación Shakespeare , 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]

Pruébalo en línea!

Primera participación en un desafío de código de golf, ¡comencemos con uno de mis idiomas de broma favoritos!

Explicación: Declaración de las dos variables Ford y Ajax (nombres de variables más cortos disponibles)

Z.Ford,.Ajax,.

Primera escena: ponga los dos valores en la variable, luego pruébelos para determinar la igualdad, luego pruebe Ajax contra 0. Si el valor que tenemos que devolver está almacenado en la variable Ford, vaya a la Escena 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 es 0, imprime Ajax, de lo contrario, configura Ajax como 0 y luego imprime Ajax. Luego ve al final del programa.

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

Escena C: Imprimir Ford

Scene C:.
Ajax:open heart.

Escena V: Fin del programa.

Scene V:.
[Exeunt]
Guillaume Ruchot
fuente
221 bytes
Jo King
2
@JoKing su versión es indudablemente mejor que la mía, creo que sería mejor si la publicara como respuesta, ya que el razonamiento detrás del programa es bastante diferente y no quiero tomar el crédito por su trabajo
Guillaume Ruchot
6

Ruby , 21 bytes

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

Pruébalo en línea!

Porque Ruby

Breve explicación:

  • a|b es bitwse OR, por lo que nos da el número correcto si a == bo uno de ellos es cero.

  • El número mágico 531es 2 ^ 9 + 2 ^ 4 + 2 ^ 1 + 2 ^ 0, y el operador [] extrae un solo bit. Esto significa: multiplique por 1 si a * b es 0, 1, 2, 4 o 9, de lo contrario, multiplique por 0.

  • Esto no funcionará para valores> 3
GB
fuente
5

Pyth , 8 7 bytes

@{+0SQ3

Pruébalo en línea!

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

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

Caso 1 - Ambos valores distintos de cero e iguales

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

Caso 2 - Ambos valores distintos de cero y desiguales

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

Caso 3 - Exactamente un valor cero

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

Caso 4 - Ambos valores cero

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

Solución alternativa, también 7 bytes.

*eSQ}s{

Pruébalo en línea

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

Versión anterior, 8 bytes

@+0{-QZ3
Sok
fuente
@xnor Gracias por ver eso, debería arreglarse ahora
Sok
@{+0Q3Funciona para 6 bytes.
Sr. Xcoder
4

Stax , 8 bytes

Ç∞∟∙◄╥*♣

Ejecutar y depurarlo

Desempaquetado, sin golf y comentado, se ve así.

    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

Ejecute este

recursivo
fuente
4

(primer envío, así que no patees demasiado fuerte)

Python 2 , 57 44 43 bytes

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

Pruébalo en línea!

(comprimido un poco después de mirar la primera respuesta de Python )

Oct18 es día de silencio en SE
fuente
33 bytes
Jo King
Tachado 44 sigue siendo 44; (
Jo King,
@JoKing ¿eh wut? Su solución es excelente, intenté hacerlo con aritmética, pero fallé y volví a si / si no
18 de octubre es un día de silencio el
4

C (gcc), 25 bytes

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

pseudocódigo:

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

C (gcc), 26 bytes

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

Pruébalo en línea!

Expansión / Sin golf:

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
fuente
3

MATL , 9 bytes

dGp*~GX>*

Pruébalo en línea!

Explicación:

           % 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
fuente
Outgolf fallido:t?td~*]X>
sundar - Restablece a Monica el
3

GNU sed, 23 bytes

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

(debe ejecutarse con -rbandera)

Pruébalo en línea!

Panico kernel
fuente
1
Bienvenido a PPCG :) El consenso actual es que las banderas no se cuentan (estoy en mi teléfono, así que no puedo vincular el Meta relevante).
Shaggy
1
Oh guay! Lo editaré más tarde ya que también estoy en mi teléfono; un -3 bytes gratis es una gran bienvenida a PPCG :)
KernelPanic
3

QBasic, 34 bytes

¡Enfoque diferente!

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

Observe que los valores distintos de cero en la cuadrícula de salida son todos los bits ORde los dos números de entrada. Esto es solo a OR ben QBasic. Queremos generar este valor cuando a*b=0 OR a=b, y de lo 0contrario, lo que podemos hacer al multiplicar por el negativo del condicional antes mencionado (negativo, ya que la verdad está -1en QBasic).

DLosc
fuente
2

brainfuck, 25 bytes

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

La entrada son valores de dos bytes (no ascii)

KSab
fuente
2

Rápido , 118 bytes

func c(n1:Int,n2:Int){n1==n2 ? print("\(n1)") : (n1*n2 != 0 ? print("0") : (n1==0 ? print("\(n2)") : print("\(n1)")))}
onnoweb
fuente
44
Bienvenido a PPCG! No conozco Swift, pero probablemente pueda ahorrar muchos bytes haciendo que los nombres de las variables sean de 1 carácter cada uno, y eliminando espacios en blanco alrededor de operadores como !=y el ternario.
Ο
1
Hola, bienvenido a PPCG! Según lo mencionado por @ Οurous, puede cambiar n1y cambiar n2caracteres individuales para acortarlos; eliminar algunos espacios en blanco y paréntesis, y eliminar algunos espacios. Además, ==0puede ser <1y !=0puede ser >0, ya que sabemos que solo las entradas 0,1,2,3son posibles. Nunca lo programé en Swift antes, pero lo reduje a 91 bytes de esta manera: func c(a:Int,b:Int){a==b ?print("\(a)"):a*b>0 ?print("0"):a<1 ?print("\(b)"):print("\(a)")} Pruébelo en línea.
Kevin Cruijssen
Además, parece que puede acortarlo a 51 bytes de esta manera: func c(a:Int,b:Int){print(a==b||a*b<1 ?max(a,b):0)} Pruébelo en línea. Nuevamente bienvenido a PPCG, y disfrute su estadía.
Kevin Cruijssen
1
Además de los campos de golf de @ KevinCruijssen, puede convertir su envío en un cierre anónimo para ahorrar 87 bytes: ¡ {$0==$1||1>$0*$1 ?max($0,$1):0} Pruébelo en línea!
Sr. Xcoder
2

Lote, 38 36 35 30 bytes

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

Puerto de la respuesta Python de @ Dennis, ya que los condicionales son demasiado caros en Batch.

Neil
fuente
2

J , 8 7 bytes

1 byte guardado por H.PWiz.

>.*=^<.

Pruébalo en línea!

Puerto AJ de la solución APL de H.PWiz

=son iguales los numeros? (resultados en 1 o 0)

^ al poder de

<. el número más pequeño

* multiplicado por

>. el mayor número

Galen Ivanov
fuente
1
>.*=^<.para 7 bytes
H.PWiz
@ H.PWiz ¡Gracias! Uso inteligente de =y ^!
Galen Ivanov
2

05AB1E , 9 8 bytes

àIËIP_+*

-1 byte gracias a @MagicOctopusUrn .

Pruébelo en línea o verifique todos los casos de prueba .

Explicación:

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

Explicación generalizada:

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
fuente
Ës0å~iZë0era mía; Buena esa. En realidad, no estoy seguro de que puedas superar los 9 bytes por mucho.
Urna de pulpo mágico
1
Retiro eso à®Ë®P_+*donde _es lógicamente equivalente a
Magic Octopus Urn
_convierte 0 en 1, todos los demás valores en 0.
Magic Octopus Urn
@MagicOctopusUrn ¡Gracias! Cuando respondí esta pregunta, estaba mirando los documentos para ver si había un == 0comando, no sabía _exactamente eso. También debería ser útil para otros desafíos en el futuro. TIL :)
Kevin Cruijssen
2

Javascript, 35 bytes

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

Javascript ES6, 25 22 21 20 bytes

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

14 13 bytes , si los argumentos se proporcionan en orden ordenado

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

QBasic, 38 36 35 bytes

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

En parte inspirado por la IF ... THEN ... ELSErespuesta de Erik , aquí hay una solución matemática.

Como llegué aquí

Nota importante para comprender las matemáticas con condicionales: en QBasic, los resultados de los operadores de comparación son 0y -1, no 0y 1.

Comenzamos con el código de Erik:

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

En otras palabras, si ay bson ambos distintos de cero, imprima a*-(a=b)( asi a=b, de lo contrario 0); de lo contrario (al menos uno de ay bes cero), salida a+b(el número distinto de cero, o 0si ambos son cero).

Ya hay algunas matemáticas con condicionales pasando aquí. Avancemos un paso más y veamos si podemos eliminar la IFdeclaración por completo. Tendremos que usar a*b>0para la condición externa: a*bpuede tener múltiples valores de verdad diferentes, lo cual está bien IFpero causa problemas para las matemáticas.

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

Este es el truco estándar de la IFeliminación. Cuando ces verdad, c*a*(a=b)es -a*(a=b)y (c+1)*(a+b)es 0; cuando ces falso, c*a*(a=b)es 0y (c+1)*(a+b)es a+b. Entonces esta expresión da los mismos resultados que la IF ... THEN ... ELSE. El único problema es que hace que nuestro programa sea de 40 bytes en lugar de 38. Tal vez podamos acortarlo reorganizando las matemáticas.

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

Todavía 40 bytes ...

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

Ahora nuestro programa ha vuelto a 38 bytes. Pero como solo lo estamos usando cuna vez, ya no tenemos que asignarlo a una variable:

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

Ahora tenemos 36 bytes.

Pero espera, hay más ... Esa a+b+a*(a=b)expresión parece un poco redundante. a*(a=b)es -asi a=by de lo 0contrario. Cuando lo agregamos a, obtenemos 0si a=by de lo acontrario. Quizás podamos lograr lo mismo en menos bytes invirtiendo la condición.

b+a*-(a<>b)

Al principio, esto no parece más corto. Pero podemos guardar un byte restando en lugar de agregar un negativo:

b-a*(a<>b)

Y ahí tenemos nuestra solución de 35 bytes.

DLosc
fuente
Buen truco allí ...
Erik the Outgolfer
1

Limpio , 46 43 42 bytes

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

?o sort

Pruébalo en línea!

Composición anónima :: [Int] -> Int, ordena el par y luego empareja al primer miembro.

Hacerlo como una lambda compuesta tiene la misma longitud:

import StdEnv

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

Gelatina , 7 6 bytes

׬o=a»

Pruébalo en línea! o Prueba todas las combinaciones!

¿Cómo?

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

Usando el método en la respuesta APL , obtenemos el mismo conteo de bytes. Un byte más largo que esa respuesta porque el mínimo común múltiplo es de dos bytes.

6 bytes

«=æl×»

Pruébalo en línea!

dylnan
fuente
También noto un método alternativo a continuación
H.PWiz
@ H.PWiz Oh, pensé que estabas usando el mismo método que el del enlace
dylnan
Doy dos métodos ∧=⌊y =*⌊. El segundo de los cuales es preferido por Jelly
H.PWiz
@ H.PWiz No hablo APL, solo estaba usando el método que describiste. ¿Qué =*⌊hacer?
dylnan
Es casi lo mismo que Jelly, excepto que es mínimo. O uno podría usar ×en ambos idiomas
H.PWiz