ABがAB Aである場合B else


44

2つの整数AとBが与えられ、AB(AからB)がAB(AからB)にある場合はAを出力し、そうでない場合はBを出力します。

「A-B」は標準的な減算です。

「AからB」は、Aから始まりBで終わる整数の範囲で、AとBの両方が含まれます。次に例を示します。

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

バイト単位の最短コードが優先されます。

テストケース

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

オリジナルチャットミニチャレンジ

回答:


44

Python、27バイト

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

オンラインでお試しください!

算術式。なぜ否定は2*b*b>a*b問題条件と同等a-b in symrange(a,b)ですか?

はとx in symrange(a,b)同等であることに注意してください0 in symrange(a-x,b-x)。これをに適用するとx=a-bが得られます0 in symrange(b,2*b-a)。値0は、2つの正の値または2つの負の値の間で拡大しない限り、間隔に含まれます。これは算術的に「それらの積b*(2*b-a)は正ではありません。

最後に、を取得しb*(2*b-a)<=0、に書き換え2*b*b<=a*bます。バイトをひっくり返すことにより、保存されている<=>してケースを切り替えます。


10

ゼリー、5バイト

_erị,

オンラインでお試しください!

使い方

_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バイト

コード:

DŸ¹Æå_è

CP-1252エンコードを使用します。オンラインでお試しください!

説明:

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 CMCはブール値を要求しました。
デニス


6

JavaScript(ES6)、24バイト

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

テストケース

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バイト

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

として呼び出しますf(B, A)



4

JavaScriptのES6、40の 37バイト

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

説明:

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

Arnauldのおかげで3バイト節約されました。

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



2

R、49 30 28バイト

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

@xnorのロジックを使用して、abがa:bにあるかどうかを判断します。


名前のない関数は一般的に許可されています
MickyT

pryr::f(match(a-b,a:b,b))
-mnel

@mnelは共有してくれてありがとう、以前は%in%がどのように機能したのか知りませんでした。ただし、abがa:bにある場合は常に失敗します。f(-90、-30)= 31
BLT

確かに。`pryr :: f(match(ab、a:b、0)+ b)はそれを修正します(それでもバイトを節約します。
mnel

2

Clojure、71 41バイト

-30を使用してバイト<=及びmin/ max代わりにrangeS。

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

が〜(a - b)の範囲にあるかどうかを確認し、それに応じてリターンをディスパッチします。ab

(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バイト

新しい配列分解構文を使用します:

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

で実行し-r、コマンドライン引数として数値を指定します。


2

PowerShell37 35 32バイト

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

オンラインでお試しください!

-notin演算子を使用した問題のPowerShellへのリテラル変換。複数の割り当てとカプセル化を使用して3バイトを節約しました。これ-は、演算子より優先順位高いために機能し、コード-notin( )部分が最初に実行され、配列として返され@($a,$b)ます。ただし、$a,$bではなく、出力結果のフリップ/フロップ$b,$aに使用-notinする必要があります。


1

バッチ、107バイト

@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バイト

@xnorのトリックを利用します。-v B Aスタックの事前設定に使用します。(-v A B+1バイトです)。

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

オンラインでお試しください!

説明

                        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

ルビー27 22バイト

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

オンラインでお試しください!

ここでは革新的なものはありません。その背後にある簡単な数学:

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

として書くことができます

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

つまり、A-2BがBと同じ符号を持っている場合、範囲内にいます。


1

SpecBAS-38 btes

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

IIF インラインIF-THEN-ELSEで、正しい値を出力します。



1

Haskell、58バイト

つい最近、私は再び矢印に恋をした。残念ながら、バイナリ関数ではなくタプルを使用する必要があります。そしてもちろん、Haskellには対称的なrange機能はありません。

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




1

スイフト -38 30 22バイト

@Mattのおかげで8バイト節約

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

IBM Swift Sandboxオンラインで試してみてください!


または21バイト:

@xnorの式のおかげ)、@ Mattのおかげで8バイト節約

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

Swiftはゴルフに最適な言語ではありません(非常に厳格です)。他のゴルフの機会があれば、答えを完全に編集します。


なぜprint(a ... b〜= ab?a:b)のように3進法を印刷物の中に入れないのですか
マット

ああ、はい、良いideA。ありがとう@Matt
Mr. Xcoder

1

Java 7、84 60 58バイト

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

Java 8、37バイト

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

説明:

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

テストコード: ここで試してください。


1

Ti-Basic(TI-84 Plus CE)、26 24 23バイト

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

TI-Basicはトークン化された言語です。使用されるトークンはすべて1バイトのトークンです。

Prompt 2つの数字の入力を求められます。

A-B≥A and A-B≤BABがAとBの間にあるかどうかを調べます(包括的)。これはtrueの場合は1を返し、falseの場合は0を返しますAns。これはに保存されます。

ABがAとBの間にある場合はAを返すので、AにAnsを乗算します。Aを返す場合はAになり、そうでない場合は0になります。

次に、それに追加Bnot(Ansします。Ansが1(真)の場合、not(それは0になり、合計はAになります。Ansが0(偽)の場合、not(1になり、Bを掛けて0に加算してBを取得します。

TI-Basicの最後の評価は暗黙的に返されます。

-スコットミルナーのおかげで2バイト


3行目を保存せず、4行目でY使用Ansするだけで2バイト節約できます。
スコットミルナー

1

Pyt、32バイト

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

標準入力からAとBを2つの個別の入力として取得します

説明:

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}

ここで、C = BAおよびD =C∈[A、...、B](trueの場合は1、falseの場合は0)


0

オーム、10バイト(CP437)

おそらくこれを行うにはゴルファーの方法がありますが、Rubyの厳密に型指定された性質により、これは難しくなります。

G┼┘-îε?┼¿┘

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.