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

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.


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

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

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;

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


4

Python 2, 37 octets

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

Invoquer comme f(B, A).


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.


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


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 .


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.


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

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.


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.


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%



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.

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.


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.


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.


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)



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.


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.


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.


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


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)


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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.