他の2つの乱数とは異なる1つの数値をランダムに選択します


14

2つの乱数AとBが生成され、1、2、または3のいずれかになります。

あなたの仕事は、1、2、または3でもよい3番目の数字Cをランダムに選ぶことです。しかし、CはAまたはBに等しくすることはできません。

  • そして、はい、AはBと同じにすることができます。
  • A = Bの場合、Cには残り2つの数値しかありません。
  • AがBと等しくない場合、Cには1つの数値しかありません。
  • AとBがすでに選択されているとします

これはPythonでAとBが作成される方法です

A = random.randrange(1,4)
B = random.randrange(1,4)

これはすでにコードに含まれていると仮定します。

これは私がPythonで思いついた最短です

while True:
    C = random.randrange(1,4)
    if C != A and C != B:
        break

これは、A、B、およびCが同等にすることができるものです。

  • 1,2,3
  • 1,1,2
  • 2,3,1
  • 3,3,2

これは、A、B、Cが等しくできないものです

  • 1,2,1
  • 2,3,3
  • 1,1,1
  • 3,2,3

1
AとBが与えられた場合、それらは私のプログラム/機能に関する限り、実際にはランダムではありませんか?また、「一般的なコード」とはどういう意味ですか?自分のプロジェクトで使用できるソリューションを実際に探していますか?その場合、私は助けを求めてcode-golfに目を向けることはありません-コードは本番環境では絶対に使用できなくなります。code-golfのポイントは、言語固有の機能を悪用して、コードサイズを可能な限り小さくすることです。
マーティンエンダー14

私はこれをプロジェクトに使用しており、すでに長い回答を得ていますが、コミュニティが楽しむのは興味深い問題だと思ったため、これを求めています。また、一般的なコードを入れたのは、誰かが言語固有の機能の膨大な知識よりも論理的な思考を使用して答えを得る方が面白いと思うからですが、コードゴルフがこれらを乱用する場合、その最後の行を削除します。
タイソンスミス14

AとBが1、2、または3のいずれかに等しくなる可能性があると仮定すると、すべての可能性を予測するためにコードが正しくなります。
タイソンスミス14

1
分かりません。不足しているものや機能しているものはありC = (A!=B ? 6-A-B : (!(A-1) ? 2 : 1))ますか?また、時間のループを無駄にし、実行に無限の時間を要する可能性があるため、ソリューションは非常に非効率的です。また、import randomバイトサイズでカウント...
DankMemes

3
それでは、Monty Hallシミュレーターを作成してください。;-)
イルマリカロネン14

回答:


17

ルビー、22文字

([1,2,3]-[A,B]).sample

それでも質問を正しく理解したかどうかはわかりません...


12

C、26

a-b?6-a-b:(rand()%2+a)%3+1

質問を正しく理解した場合:

abが異なる場合、ランダムはありません。答えは、未使用の1,2,3のうちの唯一のものでなければなりません:6-a-b

IF ab同じ場合、2つの選択肢があります。

a=b=           1 2 3
            return value    
rand()%2=0     2 3 1
rand()%2=1     3 1 2

5

Befunge(156 89 85 74)

さて、これはひどいです、私は知っています。しかし、これは私にとって初めてのBefungeの試みです。そのため、それが機能することを今でもかなり嬉しく思っています。はるかに優れたソリューションがあると確信しています。

<v1p90&p80&
<<@.g70_v#-g70_v#-g70g90g80p70
  v     <      <
^1?v
^3<2
^  <

1
今、私の携帯電話で..一部の行が誤って少しシフトしたかどうかはわかりません。私は家にいるときにチェックします。
インゴバーク14

は、私にはよく見えますよ。私の99バイトの試みよりもはるかに良い。楽しんでください。
AndoDaan

ええ、モバイル版は等幅ではないようです。Befungeは非常に楽しいですが、私はまともなBefunge-98インタプリタ(私は... /編集を見つけることができませんでした:rcfungeが動作しているようです)があると思いたい
インゴ・バーク

3

GolfScript、13文字

~0]4,^.,rand=

これは、標準入力から空白で区切られた2つの数値(それぞれ1、2、3のいずれかと想定)を読み取り、セット{1、2、3}から等しくない乱数を出力する完全なGolfScriptプログラムです。入力数の。

オンラインでお試しください。(注:リンクは以前のバージョンへのリンクです。モバイルデバイスを使用していますが、修正できません。)

プログラムのコメント付きバージョンは次のとおりです。

~         # eval the input, pushing the input numbers onto the stack
0         # push the number 0 onto the stack
]         # collect all the numbers on the stack into an array
4,        # create another array containing the numbers 0, 1, 2 and 3
^         # xor the arrays (i.e. take their symmetric set difference)
.,rand=   # choose a random element from the array

スタック上の2つの数値を引数として使用する名前付き関数が必要な場合は、さらにいくつかの文字を使用します。

{[\0]4,^.,rand=}:f;

関数の実際の本体は、スタンドアロンコードよりも1文字だけ長くなります([2つの引数のみを消費するようにする必要があるため)が、コードをブロックにラップしてシンボルに割り当てるオーバーヘッドは5より多くの文字、合計19。

または、文字通り2つの数値を変数ABに割り当て、3番目の数値をに割り当てたい場合はC、19文字で行うこともできます。

4,[0A B]^.,rand=:C;

(代わりに、スタックに3番目の数字を残すことが許容される場合:C;、最後から外しておくことができます。)

追伸 ^ハワード、使用する提案をありがとう。


代わりに\-を使用できます^
ハワード14

3

パイソン-35

C=random.sample({1,2,3}-{A,B},1)[0]

ランダムにインポートされると仮定しますが、これは質問で指定されているようです。

PYG-25

C=RSm({1,2,3}-{A,B},1)[0]

2

Python、14文字

考えられる9つのケースごとに試しましたが、うまくいくようです!

C=A^B or A^1|2

(編集):edc65が指摘したように、これはランダムではないため有効ではありません...私は質問のその部分を見逃し、私は今ばかげていると感じています。


3
すべてのランダムではない
edc65

それでも、入場料は+1
リスター氏14

2

Befunge-99バイト

&:01p&:11p-!!#v_v
   @,g2+g11g10< "
   321 vv*2g<"v ^
 2v v v 5v*2^10<"
 v?v?v?vp5     ^<
 2 3 1 2<        
 > > > >.@       

あまり印象的ではありません。


2

PowerShell、21

1..3-ne$A-ne$B|random

とても簡単です。比較演算子が配列を左オペランドとして異なる動作をするという事実を乱用しています。


比較演算子に関する素晴らしいヒント。古いスクリプトのいくつかを調べて、使用できる場所があるかどうかを確認します。特に、これはモンティホールシミュレータの一部を思い出させます。
イッツィ14

1

Mathematica、37バイト

RandomChoice@DeleteCases[{1,2,3},a|b]

基本的にRubyの回答と同じですが、Mathematicaの関数名のおかげでかなり長くなりました。大文字の名前はビルトインと衝突する可能性があるため、小文字の変数を使用しています(この場合、これらは衝突しませんが、Mathematicaでは単純に衝突しません)。


1

R、42文字

x=c(1,1,1);x[c(A,B)]=0;C=sample(1:3,1,p=x)

ベクトルxは、サンプリングされるベクトルの要素を取得するための確率重みのベクトルです。最初はそれぞれ1に設定され、AとBに対応する要素は0に設定されるため、選択される可能性はありません。



1

CJam-12

4,[AB0]-mr0=

これは、質問に従って、変数AおよびBがすでに設定されていることを前提としています。

あなたはhttp://cjam.aditsu.net/でそれを試すことができます

乱数でテストするには、次を使用します。

"A="3mr):A", B="3mr):B", C="
4,[AB0]-mr0=

特定の値でテストするには、(たとえば)を使用します:

"A="1:A", B="1:B", C="
4,[AB0]-mr0=

説明:

4,配列[0 1 2 3]を作成し、配列
[AB0]-から数字A、B、および0を削除し
mr、残りの配列
0=が最初の要素を取るようにシャッフルします

将来のCJamバージョンでは、このプログラムは2バイト短くなります。



1

JS、35

ブランドン・アンザルディの答えに触発された

A=1; // init
B=3; // init
do{C=1+new Date%3}while(C==A||C==B) // 35b

0

ジュリア、ルールに応じて32または56

julia> r()=rand(1:3);f(x...)=(i=r();i in x?f(x...):i)
julia> f(r(),r())

32 aとbを生成する必要がない場合。


質問は、「AとBがすでに選択されていると仮定します」と言います。
nyuszika7h

0

JS、43

for(C=0;~[0,A,B].indexOf(C);)C=1+new Date%3

実行されません。あなたは定義することもできますAし、B最初。
Spedwards

さて、質問は次のとおりです。「AとBがすでに選択されていると仮定します」。したがって、最初に「A = 1 + new Date%3; B = 1 + new Date%3」を実行する必要があります。
xem 14


0

Java- 126 123 83 85(巧妙な使用c=6-a-b

int c;if(a==b){int r=(int)(Math.random()*2);c=a==1?r+2:a==2?2*r+1:r+1;}else{c=6-a-b;}

完全版:

public void test(int a, int b) {
    int c;
    if (a == b) {
        // Random 0 or 1.
        int r = (int)Math.random()*2;
        c = // 1 -> 2 or 3
                a == 1 ? r + 2
                // 2 -> 1 or 3
                : a == 2 ? 2 * r + 1
                // 3 -> 1 or 2
                : r + 1;
    } else {
        // Whichever is not taken.
        //int[][] r = {{0, 3, 2}, {3, 0, 1}, {2, 1, 0}};
        //c = r[a - 1][b - 1];
        // Using @steveverrill's clever
        c = 6 - a - b;
    }
    System.out.println("a=" + a + " b=" + b + " c=" + c);
}

しかし、6-abはランダムではありませんか?:)
xem 14

1
@xem-いいえ-ただし6-a-b、他に選択肢がない場合にのみ使用され、他の2つが使用されます。これは、1、2、3から選択されていない番号を選ぶの巧妙な方法である6-1-2 = 36-1-3=26-2-3=1従って各非等しいAについて、bは6-a-b第三のいずれかを選択します。賢い?ランダムを使用できるのは、のときだけa==bです。
OldCurmudgeon

それはいい。いい仕事だ。
xem 14

0

R、24文字

で初期化

a = sample(1:3,1)
b = sample(1:3,1)

それから

n=1:3;n[!n%in%c(a,b)][1]

または、ただ両方の数値n=1:3;n[!n%in%c(a,b)]を返します。


0

R、31文字

sample(rep((1:3)[-c(A,B)],2),1)

sample(x)Rで行う場合、はからのランダムサンプルとして解釈され1:xます。ベクトルを(1:3)[-c(A,B)]2回繰り返すことは、これを防ぐ1つの方法です。


0

Javascript-76

r=(y,z)=>Math.floor(Math.random()*(z-y+1)+y);a=b=r(1,3);while(c==a)c=r(1,3);

1
Math.floorは~~で置き換えることができます。r =(y、z)=> y + New Date(zy)と言うこともできます。また、AとBは等しいことを意味するものではなく、スコアで初期化をカウントする必要はありません。
xem 14

@xem AとBはランダムであることが意図されています。ルールは、それらが等しくなることができると言います。また、ES6についてy+New Date(z-y)
わかり

y+new Date(z-y)一方、@ xem new Date()y追加された文字列を報告します。
Spedwards

タイプミスで申し訳ありませんが、パラメータに応じてy + new Date%(zy)...または(z-y + 1)を意味しました。
xem 14

そして、AとBが等しいという私の発言は、「a = b = r(1,3);」に関するものでした。これを行うと、aは常にbと等しくなりますが、それはルールが求めるものではありません。AとBをランダムに要求します。彼らは、同じことが、必ずしもすることはできません
XEM


0

Java、264バイト

Random r = new Random();ArrayList<Integer> s = new ArrayList<>();ArrayList<Integer> q = new ArrayList<>();for(int i=0; i<n; i++) s.add(r.nextInt(k));q.add(s.get(r.nextInt(n)));q.add(s.get(r.nextInt(n)));int x;do{x = s.get(r.nextInt()); }while(!q.contains(x));

このコードはn、0〜のさまざまな乱数を生成しkます。


0

J(21 19:私の好みには長すぎます)

({~?@#)(>:i.3)-.A,B

その変数の割り当てを削除するのに役立つJウィザードはありますか?短いのは2文字だけです...

または、ランダムである必要がない場合は、これを行うことができます:

{:(i.4)-.A,B

12文字。



0

JavaScript- 41(最大46)37 35 34 30

更新しました:

Cのstevevarrillの答えに触発されて、それを修正することで30文字に減らすことができました。

C=A-B?6-A-B:1+(A+new Date%2)%3


nyuszika7h、私を34に引き下げてくれてありがとう〜:

C=A;while(C==A|C==B)C=1+new Date%3

少なくとも彼と並ぶxemの答えから借りる:

C=A;while(C==A||C==B)C=1+new Date%3

思い出させてくれてありがとう1+new Date%3 === (new Date%3)+1

以前のソリューション:

C=A;while(C==A||C==B)C=(new Date%3)+1

の条件while()が満たされていることを確認し、満たされないまでループします。


その他の解決策:

C=A!=B?6-A-B:A%2!=0?4-B:new Date%2!=1?3:1;

これは、Cすでに宣言されていること、またはJavaScriptインタープリターが未宣言の変数を処理できることを前提としています。

ただし、JSインタープリターがセミコロンなしでEOLを処理できる場合、41にバンプダウンされる可能性があります。

C=A!=B?6-A-B:A%2!=0?4-B:new Date%2!=1?3:1

場合は、C宣言されていない、と46個の文字に集計が表示されますそれにはエラー訂正がありません。

var C=A!=B?6-A-B:A%2!=0?4-B:new Date%2!=1?3:1;

テストプログラム:

var iterations = 100;

for(var i = 0;i<iterations;i++) {
    var A = Math.floor(Math.random() * 3) + 1;
    var B = Math.floor(Math.random() * 3) + 1;
    C=A!=B?6-A-B:A%2!=0?4-B:new Date%2!=1?3:1
    if (C === A || C === B || C > 3 || C < 1) {
        console.log('FAILURE!');
        console.log(A + ',' + B + ',' + C)
        return;
    }
    console.log(A+','+B+','+C);
}

すごい!これに基づいて35bの回答をしましたが、do-whileループを使用しました;)
xem 14

|代わりに使用できるはずです||
nyuszika7h 14

:forループで保存1バイトfor(C=A;C==A|C==B;)C=1+new Date%3
openorclose

皆に助けてくれたことに感謝したいです:)
ブランドンアンサルディ14

0

Befunge-98(57バイト)

このコードは、数値が標準入力に入力されることを前提としています。最初の数字が両方とも同じである場合、異なるまで乱数を選択し、そうでない場合は、最後に使用可能な数字を選択します。

6&::11p&:12pw>   ?1  >#<:11g-!_.@
     @.-g21-<>3;#[2#;^

-3

Python、54 41文字

Pythonではかなり長い答えですが、リストの理解が好きなので、ここに投稿することにしました

// [0]は、それが最初の要素であることを意味します

C=[i for i in[1,2,3]if not(i in(A,B))][0]

これはどうですか?
user80551

それは...申し訳ありませんが、ではありません
Caridorc

@ user80551は必要ですか?
ジョン・ドヴォルザーク

1
はい@JanDvorak:「あなたの仕事はしている、ランダムに(多くは間違ってそれを得ているように私は、これが問題のいくつかのより多くの重点を必要だと思います)... 3番目の数字を選ぶ」
daniero
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.