分岐せずに最大3つの数字を見つける


17

今回の目標は、分岐またはループを使用せずに、最大3つの整数(2の補数の-(2 ^ 31)から2 ^ 31-1まで)を見つけることです。

あなたはしているだけで使用することを許可します

  • 不平等/平等(==>>=<<=!=)これらの数として2つのトークン。

  • 算術演算(+-*/

  • 論理演算子(!not、&&and、|| or)

  • ビット演算子(~しない、&及び、|又は、^XOR、 、、<< 算術および論理左右シフト)>>>>>

  • 定数。0トークン

  • 変数の割り当て。0トークン

入力3つの変数としてabc。最大数を出力します。

標準のアトミックコードゴルフ規則が適用されます。ご質問がある場合は、コメントに残してください。1つのトークンは、上記の特別なルールのいずれかです。


追加の関数を定義するのはどうですか?これが許可されている場合、いくつのトークンとしてカウントされますか?
激しい14年

@voidpigeon 1つの関数、つまり3つの入力と出力を受け取る関数のみを使用できます。
qwr 14年

1
一見したところ、これはこれまでにありました。と思っていましたが、2のコストがかかるコンパレータはゲームを大きく変えると思います。
プリモ14年

それは実際にいくつかの興味深い改善することができますので、私は特に3つの入力を求め@primo
QWR

2
組み込み関数を使用できますか?
登録ユーザー14年

回答:


7

Javascript 10トークン

コメントで指摘されているように、ビット操作の代わりに<と*を使用して編集 -範囲制限(30ビット以上)に近い入力に対してビット操作が失敗する場合があります

function Max(x,y,z)
{
  var d=y-x;
  x=y-d*(d<0);
  d=x-z;
  return x-d*(d<0);
}

C 8トークン

実際、言語にとらわれない、Cのような言語ならどんな言語でもかまいません。選り好みするために、標準Cでは、右シフトによって符号が拡張されない可能性があるため、移植性がありません(ただし、一般的な実装では拡張されます)。

C(およびC ++、C#、およびJava)では、より大きな一時値を使用してオーバーフロー問題を簡単に処理できます。

int Max(int x, int y, int z)
{
    long long X = x;
    long long Y = y;
    long long Z = z;
    long long D = Y-X;
    X=Y-((D>>63)&D);
    D=X-Z;
    return (int) (X-((D>>63)&D));
}

1
私はうるさいですが、C ints を使用すると、コードはx = 2147483647、y = -2、z = 0で機能しません。あなたの選択あなたはそれを変更したい場合は
QWR

10

Javascript

6トークン

function maxOf3(a, b, c) {
    (b>a) && (a=b);
    (c>a) && (a=c);
    return a;
}

6
1私は、分岐の種類としてショートカットの評価を参照してください、それはルールで禁じられていない
edc65

11
私はこれを分岐と見なします、
ハハ

2
@ edc65です。許可&&||可能性を指摘し、むしろよりも悪用されるべきで監督でした。
プリモ14年

@primoこれは興味深い問題でした。一部のCISCアーキテクチャには、条件ステートメントを含む命令があるため、それらがどのようにカウントされるかはわかりません。
qwr 14年

2
私はそれが4トークン、すなわち2 &&<およびであると思い>ます。=0として代入し、カウントとして使用されている
クライドロボ

6

C:10トークン

int max(int a, int b, int c)
{
    a += (b > a) * (b - a);
    a += (c > a) * (c - a);
    return a;
}

@openorcloseの回答に触発されましたが、Cに変換され、短絡ブール演算子ではなく乗算を使用してブランチレスになりました。


3

Javascript

14トークン

function max (a, b, c)
{
    var ab = (a >= b) * a + (a < b) * b;
    return (ab >= c) * ab + (ab < c) * c;
}

1
あなたは、新しい関数を作成するために許可されていません
QWR

:( 14トークン
ファブリシオ

2

多くの言語(Python)(10トークン)

def max3(x,y,z):
    m = x ^ ((x ^ y) & -(x < y))
    return m ^ ((m ^ z) & -(m < z))

print max3(-1,-2,-3) # -1
print max3(-1,2,10) # 10

https://graphics.stanford.edu/~seander/bithacks.html#IntegerMinOrMax

ああ、誰かがすでにそれを投稿した:)


あなたは、新しい関数を作成するために許可されていません
QWR

ああ大丈夫!コメントを読んでいませんでした:)
Mardoxx 14年

@qwrわかりません、あなたは言いました:You are only allowed to have one function, the one that takes the 3 inputs and outputs.それがまさにこの答えです。2つの印刷物は単なるテストケース
ランチャー

1
@Cruncher max2(max2(x,y),z)最初に行った回答を編集しました:)
Mardoxx 14年

@Mardoxxああ。さて+1
ランチャー14年

1

C ++ 11:15トークン

算術演算子とビット演算子のみを使用します(等式演算子とブール論理演算子は簡単すぎるため)...

#include <iostream>

auto max(int32_t a, int32_t b, int32_t c)->int32_t {
  return c - ((c - (a - ((a - b) & (a - b) >> 31))) & (c - (a - ((a - b) & (a - b) >> 31))) >> 31);
}

auto main()->int {
  // test harness
  std::cout << max(9, 38, 7) << std::endl;
  return EXIT_SUCCESS;
}

大きな数値(> 2 ^ 30)で失敗、コメントcodegolf.stackexchange.com/questions/32476/#comment68870_32477
edc65

私には問題ありません:ideone.com/pEsvG3
Riot

コメントを実際に読みましたか?私は2billionsが0よりも大きいと思います[ ideone.com/vlcnq9 ]
edc65

ああ、分かった; はい、0が含まれる場合、他のコメントのそれらの番号に問題があります。しかし、あなたが言ったように2 ^ 30ではありません。 ideone.com/LicmXa
暴動

関係する0ではありません。問題は大きな数とオーバーフローです。max(2000000000、-200000000、1111111111)を試してください。
edc65 14年

0

J(競合しない)

私は、Jのソリューションがどのように見えるかと思っていました。これはa ,とaを使用する#ため、競合することはありません。

((a<b),(b<c),(c<a))#b,c,a

これは競合しますが、9トークンで長すぎます:

(b*a<:b)+(c*b<c)+(a*c<a)

0

次の前提があります。

  • max(a; b)=(a + b + | ab |)/ 2

  • max(a; b; c)= max(max(a; b); c)

  • abs(a)=(a +(a >> 31))^(a >> 31)

擬似コードを使用できます。

関数max(a、b、c)

{

out1 =((a + b)+(((ab)+((ab)>> 31))^((ab)>> 31)))div 2

out2 =((out1 + c)+(((out1-c)+((out1-c)>> 31))^((out1-c)>> 31)))div 2

戻る2

}


実際のコードを記述し、回答にトークンの数を入力してください。
ProgramFOX 14年

0

C#(2回目の試行)

わかりました...統合された機能はありません...

しかし、他の統合されたデータ型または単純なintを使用することは許可されていますか?許可された場合、私は提案します:

int foo2(int a, int b, int c)
{
   var x = new SortedList<int,int>();

   x[a] = 1;
   x[b] = 1;
   x[c] = 1;

   return x.Keys[2];
}

0

JavaScript 8トークン

@openorcloseの答えに似ていますが、実際には割り当て自体に論理演算子を使用しています。

function max( a, b, c ) {
    x=( a > b && a) || b;
    return ( x > c && x ) || c;
}

フィドル


0

R(10トークン)

function max(a, b, c) {
  max <- a
  max <- max + (b - max) * (b > max)
  max <- max + (c - max) * (c > max)
  return(max)
}

0

Brainfuck(競合していません)

>,[-<+>>>+<<]>,[-<+>>>+<<]>[>[-<->>]<<]<[-]>[-]>[-]<<<[->>>>+<<<<]>>>>[-<+>>>+<<]>,[-<+>>>+<<]>[>[-<->>]<<]<<

0

TIS-100、8つの操作

MOV ACC UP #A
SUB UP     #B
SUB 999
ADD 999
ADD UP     #B
SUB UP     #C
SUB 999
ADD 999
ADD UP     #C
MOV ACC DOWN

プロバイダー(UP)はMOVのみを実行するため、コードに表示されません999エッジに近すぎると動作しない可能性があります


-1

VBA(6トークン)

 Function max3(a As Integer, b As Integer, c As Integer)
 i = IIf(a >= b And a >= c, a, IIf(b >= c, b, c))
 max3 = i
 End Function  

これが分岐していないかどうかわかりません。


分岐のみで、インラインのみです。具体的には、ユビキタス三項演算子(これは本質的に)は許可された操作の1つではありません。
tomsmeding

@tomsmedingに感謝します。ユビキタス三項演算子とは何ですか(私のコードではIIF()ですか?)
アレックス

申し訳ありませんが、ユビキタスでは、ほとんどすべての言語に存在することを意味し、三項演算子はあなたのIIf、Inline-Ifです。ほとんどの言語では、たとえば、a>=b ? a : bです。それは確かに分岐しています。
14年

-1

JavaScript:4トークン(**「割り当て」の広範な解釈に基づいて!)

明らかに、私のスコア4は非常に寛大/寛大です!

そのスコアに到達するために、「割り当て」(問題の0トークン)には、加算的割り当て、減算的割り当て、乗算的割り当て、XOR-ing(^=)割り当てなどが含まれると想定しました

function f(a, b, c) {
  d = a;
  d -= b;
  d = d >= 0;

  a *= d;  //a = a if (a>=b), else 0
  d ^= true; //invert d
  b *= d;  //b = b if (b<a), else 0

  a += b;  //a is now max(a,b)

  d = a;
  d -= c;
  d = d >= 0;

  a *= d;  //a = a if (a>=c), else 0
  d ^= true; //invert d
  c *= d;  //c = c if (c<a), else 0
  a += c;  //a is now max(max(a,b),c)

  return a;
}

これらの割り当てが実際にスコアを数える場合、スコアは14です:)


のでd -= b、実際と同じでd = d - b、私はあなたが算術演算を使用して、トークンとしてこれをカウントしなければならないことだと思います。
ProgramFOX

はい、私はそれを理解しています-私は「冗談で」「割り当て」の意味を利用しようとしていました。私はそれをかなり明白にしたと思います!
jcdude 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.