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

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.


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

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

1
@Okx Der CMC hat nach einem Booleschen Wert gefragt.
Dennis


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


4

Python 2, 37 Bytes

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

Aufrufen als 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)]

Probieren Sie es online!

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


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


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 .


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.


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

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.


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.


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%



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.

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.


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.


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.


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)




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.


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.


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


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)


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.