Se AB estiver em AB A else B eh?

44

Dados dois números inteiros, A e B, a saída A se AB (A menos B) estiver em AB (A a B), caso contrário, a saída B.

"A menos B" é subtração padrão.

"A a B" é o intervalo de números inteiros começando em A e terminando em B, incluindo A e B. Por exemplo:

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

O código mais curto em bytes vence.

Casos de teste

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

Mini-desafio original do bate-papo

Hobbies de Calvin
fonte

Respostas:

44

Python , 27 bytes

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

Experimente online!

Uma fórmula aritmética. Por que a negação é 2*b*b>a*bequivalente à condição do problema a-b in symrange(a,b)?

Note que x in symrange(a,b)é equivalente a 0 in symrange(a-x,b-x). Aplicando isso a x=a-b0 in symrange(b,2*b-a). O valor 0é incluído no intervalo, a menos que se estenda entre dois valores positivos ou dois valores negativos. Isso pode ser afirmado aritmeticamente como "o produto deles b*(2*b-a)não é positivo.

Finalmente, pegue b*(2*b-a)<=0e reescreva para 2*b*b<=a*b. Um byte é salvo por lançando <=a >e alternar os casos.

xnor
fonte
10

Geléia , 5 bytes

_erị,

Experimente online!

Como 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
fonte
8

05AB1E , 7 bytes

Código:

DŸ¹Æå_è

Usa a codificação CP-1252 . Experimente online!

Explicação:

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
fonte
1
@Okx O CMC pediu um booleano.
Dennis
6

PHP, 58 bytes

<?=in_array(($a=$argv[1])-$b=$argv[2],range($a,$b))?$a:$b;
Jörg Hülsermann
fonte
1
A $btarefa não precisa de parênteses.
Titus
6

JavaScript (ES6), 24 bytes

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

Casos de teste

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
fonte
4

Python 2, 37 bytes

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

Invocar como f(B, A).

Lynn
fonte
4

Python2, 55 52 51 bytes

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

Experimente online!

Lida com todos os casos de teste que o OP mencionou (no momento da publicação), como sugere o TIO.

Yytsi
fonte
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

Economizou 3 bytes graças 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
fonte
3

Mathematica, 16 bytes

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

Função pura, tendo dois argumentos na ordem oposta à OP (por exemplo If[2#^2>1##,##]&[B,A]). Uma porta da resposta Python do xnor .

Greg Martin
fonte
2

R, 49 30 28 bytes

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

Usa a lógica do @ xnor para determinar se ab está em a: b.

BLT
fonte
funções não identificadas são geralmente permitidas
MickyT
Você pode perder outros 3 bytes usandopryr::f(match(a-b,a:b,b))
mnel
@mnel obrigado por compartilhar isso, eu não sabia como% em% funcionava antes; mas isso falha sempre que ab está em a: b. f (-90, -30) = 31
BLT
De fato. `pryr :: f (match (ab, a: b, 0) + b) corrige isso (e ainda salva um byte.
mnel
2

Clojure, 71 41 bytes

-30 bytes usando <=e min/ em maxvez de ranges.

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

Verifica se (a - b)está no intervalo de aaté b, despachando um retorno em conformidade.

(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))
Carcinigenicado
fonte
2

PHP (7.1), 55 bytes

usa a nova sintaxe de destruição de matriz:

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

Corra com -r, forneça números como argumentos de linha de comando.

Titus
fonte
2

PowerShell , 37 35 32 bytes

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

Experimente online!

Conversão literal do problema no PowerShell usando o -notinoperador Economizou três bytes usando várias atribuições e encapsulamento. Isso funciona porque -tem uma precedência de operador mais alta que -notine a ( )parte do código é executada primeiro e retornada como uma matriz @($a,$b). No entanto, como é $a,$bmais do que $b,$aisso, precisamos usar -notinpara virar / flop o resultado da saída.

AdmBorkBork
fonte
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
fonte
1

Röda , 30 bytes

f a,b{[b]if[2*b*b>a*b]else[a]}

Experimente online!

Ele usa a fórmula usada na resposta do xnor.

Outra solução (37 bytes):

f a,b{[a]if[a-b in[seq(a,b)]]else[b]}

Experimente online!

fergusq
fonte
1

> <> , 21 bytes

Faz uso do truque de @ xnor . Usamos -v B Apara preencher previamente a pilha. ( -v A Bé +1 byte).

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

Experimente online!

Explicação

                        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
fonte
1

Ruby , 27 22 bytes

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

Experimente online!

Nada inovador aqui. A matemática simples por trás disso:

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

pode ser escrito como

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

isto é: se A-2B tem o mesmo sinal que B, estamos no intervalo.

GB
fonte
1

SpecBAS - 38 btes

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

IIF é um inline-IF-THEN-ELSE, para imprimir o valor correto.

Brian
fonte
1

Haskell, 21 bytes

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

Experimente online!

Legível

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

Explicação

Usa a fórmula do @ xnor para verificar se ab está no intervalo. Nada de especial além disso.

Eisfunke
fonte
1

Haskell, 58 bytes

Recentemente, eu me apaixonei por flechas novamente. Infelizmente, eles exigem que trabalhemos com tuplas em vez de funções binárias. E é claro que Haskell não tem uma rangefunção simétrica .

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

PHP 7 - 45 bytes

echo(in_array($a-$b,range($a,$b))?$a:$b)==$c;
PerQsive
fonte
Bem vindo ao site!
DJMcMayhem
1

Oitava, 55bytes

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

Provavelmente isso poderia ser otimizado ainda mais. Vou adicionar uma explicação mais tarde.

Tom Carpenter
fonte
Uma abordagem mais simples . +1 para todos os "loucura" em lá embora: 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

Experimente online!

Bastante padrão no que diz respeito às respostas, sem grandes truques neste.

syril
fonte
1

Swift -38. 30 22 bytes

Economizou 8 bytes graças a @Matt

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

Experimente na IBM Swift Sandbox online!


Ou 21 bytes:

(graças à fórmula de @xnor ) e salvou 8 bytes graças a @Matt

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

O Swift não é o melhor idioma para o golfe (é muito rígido), por isso, se você vir outra oportunidade de golfe, editarei totalmente a resposta.

Mr. Xcoder
fonte
Por que não colocar o ternário dentro da impressão como impressão (um ... b ~ = ab a: b?)
Matt
Oh, sim, boa ideA. Obrigado @Matt
Mr. Xcoder 9/17
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

Explicação:

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 do teste: Experimente aqui.

Kevin Cruijssen
fonte
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 é uma linguagem tokenizada; todos os tokens usados ​​são de um byte .

Prompt solicita os dois números.

A-B≥A and A-B≤Bverifica se AB está entre A e B (inclusive); isso retorna 1 se verdadeiro e zero se falso, que é armazenado em Ans.

Como retornamos A se AB estiver entre A e B, multiplicamos A por Ans, que será A se devemos retornar A e 0 caso contrário.

Em seguida, adicionamos Bnot(Ansa isso. Se Ans foi 1 (na verdade), not(obtemos 0 e obtemos 0, portanto, nossa soma é A. Se Ans foi 0 (falsy), not(obtemos 1, que multiplicamos por B e adicionamos 0 para obter B.

A última avaliação no TI-Basic é retornada implicitamente.

-2 bytes graças a Scott Milner

pizzapants184
fonte
Você pode salvar dois bytes não armazenando a terceira linha Ye apenas usando Ansa quarta linha.
22817 Scott Milner #
1

Pyt , 32 bytes

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

Toma A e B de stdin como duas entradas separadas

Explicação:

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}

onde: C = BA e D = C∈ [A, ..., B] (1 se verdadeiro, 0 se falso)

mudkip201
fonte
0

Ohm , 10 bytes (CP437)

Provavelmente existe uma maneira mais eficiente de fazer isso, mas a natureza estritamente tipificada do Ruby torna isso difícil.

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

Perl 6 ,  31 29  24 bytes

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

Tente

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

Tente

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

Tente

Brad Gilbert b2gills
fonte