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

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.


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

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

1
@Okx El CMC solicitó un booleano.
Dennis


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


4

Python 2, 37 bytes

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

Invocar como f(B, A).


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.


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();



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.


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

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.


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.


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%



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.

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.


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.


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.


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)



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.


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.


¿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í.


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


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)


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┼┘-îε?┼¿┘

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.