Si AB está en AB A más B eh?

44

Dados dos enteros, A y B, la salida A si AB (A menos B) está en AB (A a B), de lo contrario, la salida B.

"A menos B" es la resta estándar.

"A a B" es el rango de enteros que comienzan en A y terminan en B, incluidos A y B. Por ejemplo:

1 to 4: 1, 2, 3, 4
-2 to 5: -2, -1, 0, 1, 2, 3, 4, 5
3 to -1: 3, 2, 1, 0, -1
7 to 7: 7

El código más corto en bytes gana.

Casos de prueba

A B Output
1 4 4
-2 5 5
3 -1 -1
7 7 7
90 30 90
90 -30 -30
-90 30 30
-90 -30 -90
-2 -2 -2
-2 -1 -2
-2 0 -2
-2 1 1
-2 2 2
-1 -2 -2
-1 -1 -1
-1 0 -1
-1 1 1
-1 2 2
0 -2 -2
0 -1 -1
0 0 0
0 1 1
0 2 2
1 -2 -2
1 -1 -1
1 0 1
1 1 1
1 2 2
2 -2 -2
2 -1 -1
2 0 2
2 1 2
2 2 2

Chat-Mini-Challenge original

Pasatiempos de Calvin
fuente

Respuestas:

44

Python , 27 bytes

lambda a,b:[a,b][2*b*b>a*b]

Pruébalo en línea!

Una fórmula aritmética. ¿Por qué la negación de 2*b*b>a*bequivalente a la condición del problema a-b in symrange(a,b)?

Tenga en cuenta que x in symrange(a,b)es equivalente a 0 in symrange(a-x,b-x). Aplicando esto a x=a-bda 0 in symrange(b,2*b-a). El valor 0se incluye en el intervalo a menos que se extienda entre dos valores positivos o dos valores negativos. Esto se puede afirmar aritméticamente como "su producto b*(2*b-a)no es positivo".

Finalmente, toma b*(2*b-a)<=0y reescribe a 2*b*b<=a*b. Un byte es salvado por voltear <=a >y la conmutación de los casos.

xnor
fuente
10

Jalea , 5 bytes

_erị,

Pruébalo en línea!

Cómo funciona

_erị,  Main link. Arguments: a, b

_      Subtraction; Yield a-b.
  r    Range; yield [a, ..., b].
 e     Exists; yield 1 if a-b belongs to [a, ..., b], 0 if not.
    ,  Pair; yield [a, b].
   ị   At-index; yield the element of [a, b] at index 1 (a) or index 0 (b).
Dennis
fuente
8

05AB1E , 7 bytes

Código:

DŸ¹Æå_è

Utiliza la codificación CP-1252 . Pruébalo en línea!

Explicación:

D         # Duplicate the input.
 Ÿ        # Inclusive range.
  ¹Æ      # Push the input [a, b] and compute a - b.
    å     # Check if the number exists in the range.
     _    # Boolean negate
      è   # Index at the first input
Adnan
fuente
1
@Okx El CMC solicitó un booleano.
Dennis
6

PHP, 58 bytes

<?=in_array(($a=$argv[1])-$b=$argv[2],range($a,$b))?$a:$b;
Jörg Hülsermann
fuente
1
La $btarea no necesita paréntesis.
Titus
6

JavaScript (ES6), 24 bytes

a=>b=>[a,b][2*b*b>a*b|0]

Casos de prueba

let f = a=>b=>[a,b][2*b*b>a*b|0]
let tests = [[1,4,4],[-2,5,5],[3,-1,-1],[7,7,7],[90,30,90],[90,-30,-30],[-90,30,30],[-90,-30,-90],[-2,-2,-2],[-2,-1,-2],[-2,0,-2],[-2,1,1],[-2,2,2],[-1,-2,-2],[-1,-1,-1],[-1,0,-1],[-1,1,1],[-1,2,2],[0,-2,-2],[0,-1,-1],[0,0,0],[0,1,1],[0,2,2],[1,-2,-2],[1,-1,-1],[1,0,1],[1,1,1],[1,2,2],[2,-2,-2],[2,-1,-1],[2,0,2],[2,1,2],[2,2,2]]
tests.map(test => `f(${test[0]})(${test[1]}) == ${test[2]}`).forEach(test => console.log(test, eval(test)))

alebianco
fuente
4

Python 2, 37 bytes

lambda*s:s[min(s)<=s[1]-s[0]<=max(s)]

Invocar como f(B, A).

Lynn
fuente
4

Python2, 55 52 51 bytes

lambda A,B:[B,A][A-B in range(min(A,B),max(A,B)+1)]

Pruébalo en línea!

Maneja todos los casos de prueba que OP ha mencionado (al momento de publicar esto), como sugiere el TIO.

Yytsi
fuente
4

JavaScript ES6, 40 37 bytes

a=>b=>a-b<(a<b?a:b)|a-b>(a<b?b:a)?b:a

Explicado:

a=>b=>                                   take a and b as inputs
      a-b<(a<b?a:b)                      if a-b is less than the lowest of a and b
                   |a-b>(a<b?b:a)        or a-b is greater than the largest of a and b
                                 ?b      return b
                                   :a    else return a

Guardado 3 bytes gracias a Arnauld.

f=a=>b=>a-b<(a<b?a:b)|a-b>(a<b?b:a)?b:a

function t(){
    var tests = [[1,4,4],[-2,5,5],[3,-1,-1],[7,7,7],[90,30,90],[90,-30,-30],[-90,30,30],[-90,-30,-90],[-2,-2,-2],[-2,-1,-2],[-2,0,-2],[-2,1,1],[-2,2,2],[-1,-2,-2],[-1,-1,-1],[-1,0,-1],[-1,1,1],[-1,2,2],[0,-2,-2],[0,-1,-1],[0,0,0],[0,1,1],[0,2,2],[1,-2,-2],[1,-1,-1],[1,0,1],[1,1,1],[1,2,2],[2,-2,-2],[2,-1,-1],[2,0,2],[2,1,2],[2,2,2]];
    for (var test of tests) {
        console.log(`f(${test[0]},${test[1]}) == ${test[2]}`, f(test[0])(test[1])==test[2]);
    }
}

t();

Tom
fuente
3

Mathematica, 16 bytes

If[2#^2>1##,##]&

Función pura que toma dos argumentos en el orden opuesto al OP (por ejemplo, If[2#^2>1##,##]&[B,A]). Un puerto de la respuesta de Python de xnor .

Greg Martin
fuente
2

R, 49 30 28 bytes

pryr::f("if"(2*b*b>a*b,b,a))

Utiliza la lógica de @ xnor para determinar si ab está en a: b.

BLT
fuente
funciones sin nombre generalmente están permitidas
MickyT
Puede perder otros 3 bytes usandopryr::f(match(a-b,a:b,b))
mnel
@mnel gracias por compartir eso, no sabía cómo funcionaba% en% antes; pero eso falla siempre que ab está en a: b. f (-90, -30) = 31
BLT
En efecto. `pryr :: f (match (ab, a: b, 0) + b) corrige eso (y aún guarda un byte.
mnel
2

Clojure, 71 41 bytes

-30 bytes usando <=y min/ en maxlugar de ranges.

#(if(<=(min % %2)(- % %2)(max % %2))% %2)

Comprueba si (a - b)está en el rango de aa b, enviando una devolución en consecuencia.

(defn eh [a b]
  ; <= accepts any number of argments, and ensures all fall within the range
    (if (<= (min a b) (- a b) (max a b))
      a
      b))
Carcigenicate
fuente
2

PHP (7.1), 55 bytes

utiliza la nueva sintaxis de desestructuración de matrices:

[,$a,$b]=$argv;echo in_array($a-$b,range($a,$b))?$a:$b;

Ejecutar con -r, proporcionar números como argumentos de línea de comando.

Titus
fuente
2

PowerShell , 37 35 32 bytes

($a,$b=$args)[$a-$b-notin$a..$b]

Pruébalo en línea!

Traducción literal del problema a PowerShell utilizando el -notinoperador. Guardado tres bytes mediante el uso de múltiples asignaciones y encapsulación. Esto funciona porque -tiene una precedencia de operador más alta que -notin, y la ( )parte del código se ejecuta primero y se devuelve como una matriz @($a,$b). Sin embargo, como es $a,$bmás que necesario $b,$a, debemos usar -notinpara voltear / flop el resultado de salida.

AdmBorkBork
fuente
1

Lote, 107 bytes

@set/aa=%1,r=b=%2,x=a-b
@if %a% gtr %b% set/aa=b,b=%1
@if %a% leq %x% if %x% leq %b% set/ar=%1
@echo %r%
Neil
fuente
1

> <> , 21 bytes

Hace uso del truco de @ xnor . Usamos -v B Apara prepoblar la pila. ( -v A Bes +1 byte).

:01pr:11p::2**r*)1gn;

Pruébalo en línea!

Explicación

                        Input: [B, A] on stack.
:01pr:11p::2**r*)1gn;
:                       Duplicate.           [B, A, A]
 01p                    Push A to [0,1].     [B, A]
    r                   Reverse              [A, B]
     :                  Duplicate.           [A, B, B]
      11p               Push B to [1,1].     [A, B]
         ::             Duplicate x 2.       [A, B, B, B]
           2            Push 2.              [A, B, B, B, 2]
           2**          Compute 2*B*B.       [A, B, 2*B*B]
              r         Reverse.             [2*B*B, B, A]
               *        Compute A*B.         [2*B*B, A*B]
                )       >                    [2*B*B > A*B]
                 1      Push 1.              [2*B*B > A*B, 1]
                  g     If 2*B*B > A*B
                         get B, else get A.  [2*B*B > A*B ? B : A]
                   n    Output as number.
                    ;   Terminate.
PidgeyUsedGust
fuente
1

Rubí , 27 22 bytes

->a,b{(b*a<2*b*b)?b:a}

Pruébalo en línea!

Nada innovador aquí. La matemática simple detrás de esto:

(A<=A-B<=B or B<=A-B<=A)

Se puede escribir como

(B>=0 and A>=2B) or (B<=0 and A<=2B)

es decir: si A-2B tiene el mismo signo que B, estamos en el rango.

GB
fuente
1

SpecBAS - 38 btes

1 INPUT a,b: ?IIF(a-b IN [a TO b],a,b)

IIF es un IF-THEN-ELSE en línea, para imprimir el valor correcto.

Brian
fuente
1

Haskell, 21 bytes

a!b|b*a<2*b*b=b|0<1=a

Pruébalo en línea!

Legible

func :: Int -> Int -> Int
func a b
    | b*a < 2*b*b = b
    | otherwise = a

Explicación

Utiliza la fórmula de @ xnor para verificar si ab está dentro del rango. Nada especial además de eso.

Eisfunke
fuente
1

Haskell, 58 bytes

Recientemente me enamoré de las flechas nuevamente. Lamentablemente, requieren que trabajemos con tuplas en lugar de funciones binarias. Y, por supuesto, Haskell no tiene una rangefunción simétrica .

import Control.Arrow
u=uncurry
app<<<elem.u(-)&&&(u enumFromTo<<<u min&&&u max)
Bergi
fuente
1

PHP 7 - 45 bytes

echo(in_array($a-$b,range($a,$b))?$a:$b)==$c;
PerQsive
fuente
Bienvenido al sitio!
DJMcMayhem
1

Octava, 55bytes

@(a,b)(c=b*~[find((a:1-2*(b<a):b)==(a-b)) 0](1))+(a*~c)

Esto probablemente podría optimizarse aún más. Agregaré una explicación más tarde.

Tom Carpenter
fuente
Un enfoque más simple . +1 para todas las "cosas locas" allí: P
Stewie Griffin
1

Nim, 60 bytes

proc f(a,b:int):int=
  if a-b in min(a,b)..max(a,b):a else:b

Pruébalo en línea!

Bastante estándar en lo que respecta a las respuestas, no hay grandes trucos en este caso.

sirio
fuente
1

Swift -38 30 22 bytes

Guardado 8 bytes gracias a @Matt

print(a...b~=a-b ?a:b)

¡Pruébelo en IBM Swift Sandbox en línea!


O 21 bytes:

(gracias a la fórmula de @xnor ) y ahorré 8 bytes gracias a @Matt

print(2*b*b>a*b ?a:b)

Swift no es el mejor lenguaje para el golf (es muy rígido), por lo que si ve alguna otra oportunidad de golf, editaré totalmente la respuesta.

Sr. Xcoder
fuente
¿Por qué no poner el ternario dentro de la impresión como print (a ... b ~ = ab? A: b)
Matt
Oh, sí, buena idea. Gracias @ Matt
Sr. Xcoder
1

Java 7, 84 60 58 bytes

int c(int a,int b){return(a<b?a:b)>a-b|(a<b?b:a)<a-b?b:a;}

Java 8, 37 bytes

a->b->(a<b?a:b)>a-b|(a<b?b:a)<a-b?b:a

Explicación:

int c(int a, int b){          // method with two integer parameters and integer return-type
  return (a<b ? a : b) > a-b  //  if smallest of the input is larger than a-b
       | (a<b ? b : a) < a-b  //    or if the largest of the input is smaller than a-b
    ? b                       //   return b
    :                         //  else
      a                       //   return a
}                             // end of method

Código de prueba: Pruébalo aquí.

Kevin Cruijssen
fuente
1

Ti-Basic (TI-84 Plus CE), 26 24 23 bytes

Prompt A,B
A-B≥A and A-B≤B
AAns+Bnot(Ans

TI-Basic es un lenguaje tokenizado; Todas las fichas utilizadas son fichas de un byte .

Prompt le pide los dos números.

A-B≥A and A-B≤Bcomprueba si AB está entre A y B (inclusive); esto devuelve un 1 si es verdadero y un cero si es falso, que se almacena en Ans.

Como estamos devolviendo A si AB está entre A y B, multiplicamos A por Ans, que será A si se supone que devolveremos A, y 0 en caso contrario.

A continuación, le agregamos Bnot(Ans. Si Ans fue 1 (verdad), lo usamos not(y obtenemos 0, por lo tanto, nuestra suma es A. Si Ans fue 0 (falso), lo obtenemos not(para obtener 1, que multiplicamos por B y sumamos a 0 para obtener B.

La última evaluación en TI-Basic se devuelve implícitamente.

-2 bytes gracias a Scott Milner

pizzapants184
fuente
Puede guardar dos bytes al no almacenar la tercera línea Yy simplemente usarla Ansen la cuarta línea.
Scott Milner
1

Pyt , 32 bytes

←Đ←Đ3Ș⇹Đ3ȘĐ4Ș3Ș-3Ș⇹Ř∈Đ3Ș⇹¢*3Ș⇹*+

Toma A y B de stdin como dos entradas separadas

Explicación:

AABB -> ABBA -> ABAB -> ABABB -> ABBBA -> ABBBAA -> ABAABB -> ABABBA -> ABABC -> ABCBA -> ABCAB -> ABC [A, ..., B] -> ABD -> ABDD - > ADDB -> ADBD -> AD {B * (1-D)} -> {B * (1-D)} AD -> {B * (1-D)} + {A * D}

donde: C = BA y D = C∈ [A, ..., B] (1 si es verdadero, 0 si es falso)

mudkip201
fuente
0

Ohm , 10 bytes (CP437)

Probablemente haya una forma más golfista de hacer esto, pero la naturaleza estrictamente tipada de Ruby lo hace difícil.

G┼┘-îε?┼¿┘
Nick Clifford
fuente
0

Perl 6 ,  31 29  24 bytes

{$^a-$^b==any($a...$b)??$a!!$b}

Intentalo

{$^a-$^b∈($a...$b)??$a!!$b}

Intentalo

->\a,\b{2*b*b>a*b??b!!a}
->\a,\b{2*b²>a*b??b!!a}

Intentalo

Brad Gilbert b2gills
fuente