Wenn AB in AB ist A else B eh?

44

Wenn zwei ganze Zahlen A und B gegeben sind, wird A ausgegeben, wenn AB (A minus B) in AB (A bis B) ist, andernfalls wird B ausgegeben.

"A minus B" ist Standard-Subtraktion.

"A nach B" ist der Bereich von ganzen Zahlen, die bei A beginnen und bei B enden, einschließlich A und B. Zum Beispiel:

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

Der kürzeste Code in Bytes gewinnt.

Testfälle

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

Original Chat-Mini-Challenge

Calvins Hobbys
quelle

Antworten:

44

Python , 27 Bytes

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

Probieren Sie es online!

Eine arithmetische Formel. Warum entspricht die Negation von 2*b*b>a*bder Problembedingung a-b in symrange(a,b)?

Beachten Sie, dass dies x in symrange(a,b)äquivalent zu ist 0 in symrange(a-x,b-x). Anwenden auf x=a-bgibt 0 in symrange(b,2*b-a). Der Wert 0wird in das Intervall aufgenommen, sofern er nicht zwischen zwei positiven oder zwei negativen Werten liegt. Dies kann arithmetisch ausgedrückt werden als "ihr Produkt b*(2*b-a)ist nicht positiv.

Zum Schluss nehmen b*(2*b-a)<=0und neu schreiben 2*b*b<=a*b. Ein Byte wird durch Umklappen gespeichert <=zu >und Umschalten der Fälle.

xnor
quelle
10

Gelee , 5 Bytes

_erị,

Probieren Sie es online!

Wie es funktioniert

_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
quelle
8

05AB1E , 7 Bytes

Code:

DŸ¹Æå_è

Verwendet die CP-1252- Codierung. Probieren Sie es online!

Erläuterung:

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
quelle
1
@Okx Der CMC hat nach einem Booleschen Wert gefragt.
Dennis
6

PHP, 58 Bytes

<?=in_array(($a=$argv[1])-$b=$argv[2],range($a,$b))?$a:$b;
Jörg Hülsermann
quelle
1
Die $bZuordnung benötigt keine Klammern.
Titus
6

JavaScript (ES6), 24 Byte

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

Testfälle

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

Python 2, 37 Bytes

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

Aufrufen als f(B, A).

Lynn
quelle
4

Python2, 55 52 51 Bytes

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

Probieren Sie es online!

Behandelt jeden Testfall, den OP erwähnt hat (zum Zeitpunkt der Veröffentlichung), wie es die TIO vorschlägt.

Yytsi
quelle
4

JavaScript ES6, 40 37 Bytes

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

Erklärt:

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 Bytes dank Arnauld gespart.

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
quelle
3

Mathematica, 16 Bytes

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

Reine Funktion, die zwei Argumente in umgekehrter Reihenfolge wie das OP verwendet (z. B. If[2#^2>1##,##]&[B,A]). Eine Portierung der Python-Antwort von xnor .

Greg Martin
quelle
2

R 49 30 28 Bytes

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

Verwendet die @ xnor-Logik, um festzustellen, ob sich ab in a befindet: b.

BLT
quelle
unbenannte Funktionen sind generell erlaubt
MickyT
Sie können weitere 3 Bytes mitpryr::f(match(a-b,a:b,b))
mnel
@mnel, danke, dass du das geteilt hast. Ich wusste vorher nicht, wie% in% funktioniert. aber das scheitert, wenn ab in a ist: b. f (-90, -30) = 31
BLT
Tatsächlich. `pryr :: f (match (ab, a: b, 0) + b) behebt das (und speichert immer noch ein Byte.
mnel
2

Clojure, 71 41 Bytes

-30 Bytes mit <=und min/ maxanstelle von ranges.

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

Prüft, ob (a - b)im Bereich von abis b, und sendet eine entsprechende Rücksendung.

(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))
Karzigenat
quelle
2

PHP (7.1), 55 Bytes

verwendet die neue Array-Destrukturierungssyntax:

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

Führen Sie mit aus -r, und geben Sie Zahlen als Befehlszeilenargumente an.

Titus
quelle
2

PowerShell , 37 35 32 Bytes

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

Probieren Sie es online!

Wörtliche Übersetzung des Problems in PowerShell mithilfe des -notinOperators. Drei Bytes durch Mehrfachzuweisung und Kapselung eingespart. Dies funktioniert, weil -der Operator eine höhere Priorität als -notinhat und der ( )Teil des Codes zuerst ausgeführt und als Array zurückgegeben wird @($a,$b). Da dies jedoch nicht der $a,$bFall ist $b,$a, müssen wir -notindas Ausgabeergebnis mit Flip / Flop ändern.

AdmBorkBork
quelle
1

Batch, 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
quelle
1

Röda , 30 Bytes

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

Probieren Sie es online!

Es wird die Formel verwendet, die in der Antwort von xnor verwendet wird.

Eine andere Lösung (37 Bytes):

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

Probieren Sie es online!

fergusq
quelle
1

> <> , 21 Bytes

Benutzt @ xnors Trick . Wir verwenden -v B A, um den Stapel vorab zu füllen. ( -v A Bist +1 Byte).

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

Probieren Sie es online!

Erläuterung

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

Ruby , 27 22 Bytes

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

Probieren Sie es online!

Nichts innovatives hier. Die einfache Mathematik dahinter:

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

kann geschrieben werden als

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

das heißt: wenn A-2B das gleiche Vorzeichen wie B hat, sind wir im Bereich.

GB
quelle
1

SpecBAS - 38 Bit

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

IIF ist ein Inline-IF-THEN-ELSE, um den korrekten Wert zu drucken.

Brian
quelle
1

Haskell, 21 Bytes

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

Probieren Sie es online!

Lesbar

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

Erläuterung

Verwendet die Formel von @ xnor, um zu überprüfen, ob sich ab im Bereich befindet. Sonst nichts Besonderes.

Eisfunke
quelle
1

Haskell, 58 Bytes

Erst kürzlich habe ich mich wieder in Pfeile verliebt. Leider müssen wir statt mit Binärfunktionen mit Tupeln arbeiten. Und natürlich hat Haskell keine symmetrische rangeFunktion.

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

PHP 7 - 45 Bytes

echo(in_array($a-$b,range($a,$b))?$a:$b)==$c;
PerQsive
quelle
Willkommen auf der Seite!
DJMcMayhem
1

Oktave, 55 Bytes

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

Dies könnte wahrscheinlich weiter optimiert werden. Ich werde später eine Erklärung hinzufügen.

Tom Carpenter
quelle
Ein einfacherer Ansatz . +1 für all die "verrückten Sachen": 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

Probieren Sie es online!

Ziemlich normal, was die Antworten angeht, keine großen Tricks.

syril
quelle
1

Schnell -38 30 22 Bytes

8 Bytes dank @Matt eingespart

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

Probieren Sie es bei IBM Swift Sandbox online!


Oder 21 Bytes:

(dank @xnors Formel) und dank @Matt 8 Bytes gespart

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

Swift ist nicht die beste Sprache zum Golfen (es ist sehr starr). Wenn Sie also eine andere Möglichkeit zum Golfen sehen, werde ich die Antwort komplett überarbeiten.

Mr. Xcoder
quelle
Warum nicht den Dreiklang in den Druck einfügen wie ein Druck (a ... b ~ = ab? A: b)
Matt
Oh ja, gute Idee. Thanks @Matt
Mr. 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

Erläuterung:

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

Testcode: Probieren Sie es hier aus.

Kevin Cruijssen
quelle
1

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

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

TI-Basic ist eine Token-Sprache. Alle verwendeten Token sind Ein-Byte-Token .

Prompt fordert Sie zur Eingabe der beiden Nummern auf.

A-B≥A and A-B≤Bprüft, ob AB zwischen A und B (einschließlich) liegt; Dies gibt eine 1 wenn wahr und eine Null wenn falsch zurück, die in gespeichert wird Ans.

Da wir A zurückgeben, wenn AB zwischen A und B liegt, multiplizieren wir A mit Ans, was A ist, wenn wir A zurückgeben sollen, und andernfalls 0.

Als nächstes fügen wir Bnot(Anses hinzu. Wenn Ans 1 (wahr) war, haben wir not(es und bekommen 0, also ist unsere Summe A. Wenn Ans 0 (falsch) war, haben wir not(es, um 1 zu bekommen, die wir mit B multiplizieren und zu 0 addieren, um B zu bekommen.

Die letzte Auswertung in TI-Basic wird implizit zurückgegeben.

-2 Bytes dank Scott Milner

Pizzapants184
quelle
Sie können zwei Bytes sparen, indem Sie die dritte Zeile nicht in der vierten Zeile speichern Yund nur verwenden Ans.
Scott Milner
1

Pyt , 32 Bytes

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

Nimmt A und B von stdin als zwei separate Eingänge

Erläuterung:

AABB -> ABBA -> ABAB -> ABABB -> ABBBA -> ABBBA -> 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}

wobei: C = BA und D = C = [A, ..., B] (1 wenn wahr, 0 wenn falsch)

mudkip201
quelle
0

Ohm , 10 Byte (CP437)

Es gibt wahrscheinlich eine golferischere Möglichkeit, dies zu tun, aber die streng getippte Natur von Ruby macht dies schwierig.

G┼┘-îε?┼¿┘
Nick Clifford
quelle