Si AB est dans AB A else B eh?

44

Étant donné deux entiers, A et B, la sortie A si AB (A moins B) est dans AB (A à B), sinon la sortie B.

"A moins B" est une soustraction standard.

"A à B" est la plage d'entiers commençant par A et se terminant par B, incluant A et B. Par exemple:

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

Le code le plus court en octets gagne.

Cas de test

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

Les passe-temps de Calvin
la source

Réponses:

44

Python , 27 octets

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

Essayez-le en ligne!

Une formule arithmétique. Pourquoi la négation est-elle 2*b*b>a*béquivalente à la condition du problème a-b in symrange(a,b)?

Notez que cela x in symrange(a,b)équivaut à 0 in symrange(a-x,b-x). En appliquant cela pour x=a-bdonner 0 in symrange(b,2*b-a). La valeur 0est incluse dans l'intervalle sauf si elle s'étend entre deux valeurs positives ou deux valeurs négatives. Cela peut être expliqué de manière arithmétique: "leur produit b*(2*b-a)n'est pas positif.

Enfin, prenez b*(2*b-a)<=0et réécrivez pour 2*b*b<=a*b. Un octet est enregistré en retournant <=à >et la commutation des cas.

Xnor
la source
10

Gelée , 5 octets

_erị,

Essayez-le en ligne!

Comment ça marche

_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
la source
8

05AB1E , 7 octets

Code:

DŸ¹Æå_è

Utilise le codage CP-1252 . Essayez-le en ligne!

Explication:

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
la source
1
@Okx La CMC a demandé un booléen.
Dennis
6

PHP, 58 octets

<?=in_array(($a=$argv[1])-$b=$argv[2],range($a,$b))?$a:$b;
Jörg Hülsermann
la source
1
L' $baffectation n'a pas besoin de parenthèses.
Titus
6

JavaScript (ES6), 24 octets

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

Cas de test

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

Python 2, 37 octets

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

Invoquer comme f(B, A).

Lynn
la source
4

Python2, 55 52 51 octets

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

Essayez-le en ligne!

Gère tous les cas de test mentionnés par OP (au moment de la publication), comme le suggère le TIO.

Yytsi
la source
4

JavaScript ES6, 40 37 octets

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

A expliqué:

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

3 octets sauvés grâce à 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();

À M
la source
3

Mathematica, 16 octets

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

Fonction pure prenant deux arguments dans l'ordre inverse de l'OP (par exemple, If[2#^2>1##,##]&[B,A]). Un portage de la réponse Python de xnor .

Greg Martin
la source
2

R, 49 30 28 octets

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

Utilise la logique de @ xnor pour déterminer si ab est dans a: b.

BLT
la source
les fonctions sans nom sont généralement autorisées
MickyT
Vous pouvez perdre encore 3 octets avecpryr::f(match(a-b,a:b,b))
mnel
@mnel merci d'avoir partagé cela, je ne savais pas comment% in% travaillait auparavant; mais cela échoue chaque fois que ab est dans a: b. f (-90, -30) = 31
BLT
Effectivement. `pryr :: f (match (ab, a: b, 0) + b) corrige cela (et enregistre toujours un octet.
mnel
2

Clojure, 71 41 octets

-30 octets en utilisant <=et min/ maxau lieu de ranges.

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

Vérifie si se (a - b)situe dans la plage de aà b, envoie un retour en conséquence.

(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
la source
2

PHP (7.1), 55 octets

utilise la nouvelle syntaxe de déstructuration du tableau:

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

Exécuter avec -r, fournir des nombres comme arguments de ligne de commande.

Titus
la source
2

PowerShell , 37 35 32 octets

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

Essayez-le en ligne!

Traduction littérale du problème dans PowerShell à l'aide de l' -notinopérateur. Trois octets enregistrés en utilisant plusieurs affectations et encapsulations. Cela fonctionne parce que la priorité des opérateurs- est supérieure à celle de l'opérateur-notin et que la ( )partie du code est d'abord exécutée et renvoyée sous forme de tableau @($a,$b). Cependant, puisque c'est $a,$bplutôt que $b,$a, nous devons utiliser -notinpour retourner / afficher le résultat en sortie.

AdmBorkBork
la source
1

Lot, 107 octets

@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
la source
1

Röda , 30 octets

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

Essayez-le en ligne!

Il utilise la formule utilisée dans la réponse de xnor.

Une autre solution (37 octets):

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

Essayez-le en ligne!

Fergusq
la source
1

> <> , 21 octets

Utilise le truc de @ xnor . Nous utilisons -v B Apour pré-remplir la pile. ( -v A Best +1 octet).

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

Essayez-le en ligne!

Explication

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

Ruby , 27 22 octets

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

Essayez-le en ligne!

Rien d'innovant ici. Le calcul simple derrière cela:

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

peut être écrit comme

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

c'est-à-dire que si A-2B a le même signe que B, nous sommes dans la plage.

GB
la source
1

SpecBAS - 38 bits

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

IIF est un inline-IF-THEN-ELSE, pour imprimer la valeur correcte.

Brian
la source
1

Haskell, 21 octets

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

Essayez-le en ligne!

Lisible

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

Explication

Utilise la formule de @ xnor pour vérifier si ab est dans la plage. Rien de spécial à part ça.

Eisfunke
la source
1

Haskell, 58 octets

Tout récemment, je suis tombé à nouveau amoureux des flèches. Malheureusement, ils exigent que nous utilisions des n-uplets au lieu de fonctions binaires. Et bien sûr, Haskell n'a pas de rangefonction symétrique .

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

PHP 7 - 45 octets

echo(in_array($a-$b,range($a,$b))?$a:$b)==$c;
PerQsive
la source
Bienvenue sur le site!
DJMcMayhem
1

Octave, 55bytes

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

Cela pourrait probablement être optimisé davantage. Je vais ajouter une explication plus tard.

Tom Carpenter
la source
Une approche plus simple . +1 pour tous les "trucs de fous": P
Stewie Griffin
1

Nim, 60 octets

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

Essayez-le en ligne!

Assez standard dans la mesure où les réponses vont, pas de gros trucs dans celui-ci.

seringue
la source
1

Swift -38 30 22 octets

Sauvegardé 8 octets grâce à @Matt

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

Essayez-le chez IBM Swift Sandbox en ligne!


Ou 21 octets:

(grâce à la formule de @xnor ) et enregistré 8 octets grâce à @Matt

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

Swift n'est pas la meilleure langue pour le golf (c'est très rigide), donc si vous voyez une autre opportunité de golf, je modifierai totalement la réponse.

M. Xcoder
la source
Pourquoi ne pas mettre le ternaire à l'intérieur de l'empreinte comme une empreinte (a ... b ~ = ab? A: b)
Matt
Oh, oui, bonne idée. Merci @Matt
M. Xcoder
1

Java 7, 84 60 58 octets

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

Java 8, 37 octets

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

Explication:

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

Code de test: essayez-le ici.

Kevin Cruijssen
la source
1

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

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

TI-Basic est un langage à jeton. tous les jetons utilisés sont des jetons d'un octet .

Prompt vous invite à entrer les deux chiffres.

A-B≥A and A-B≤Bvérifie si AB est compris entre A et B (inclus); cela retourne un 1 si vrai et un zéro si faux, qui est stocké à Ans.

Puisque nous retournons A si AB est compris entre A et B, nous multiplions A par Ans, qui sera A si nous sommes supposés renvoyer A et 0 sinon.

Ensuite, nous ajoutons Bnot(Ansà cela. Si Ans était égal à 1 (vérité), nous l’ not(obtenons à 0, notre somme est donc A. Si Ans à 0 (falsie), nous l’ not(obtenons pour obtenir 1, que nous multiplions par B et que nous ajoutons à 0 pour obtenir B.

La dernière évaluation dans TI-Basic est implicitement renvoyée.

-2 octets grâce à Scott Milner

pizzapants184
la source
Vous pouvez enregistrer deux octets en ne stockant pas la troisième ligne Yet en utilisant uniquement Ansdans la quatrième ligne.
Scott Milner
1

Pyt , 32 octets

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

Prend A et B de stdin comme deux entrées séparées

Explication:

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

où: C = BA et D = C∈ [A, ..., B] (1 si vrai, 0 si faux)

mudkip201
la source
0

Ohm , 10 octets (CP437)

Il y a probablement une manière plus golfeuse de faire cela, mais la nature strictement typée de Ruby rend cela difficile.

G┼┘-îε?┼¿┘
Nick Clifford
la source