キャラクターをランダムに選択する、plinkoスタイル


27

選択したランダム性における選択言語がどれほど優れているかを見てみましょう。

与えられた4つの文字、ABC、およびD、または4文字の文字列ABCD を入力として、次の確率を持つ文字の出力1:

  • A 1/8(12.5%)の確率で選択される必要があります
  • B 3/8(37.5%)の確率で選択される必要があります
  • C 2/8(25%)の確率で選択される必要があります
  • D 2/8(25%)の確率で選択される必要があります

これは、次のPlinkoマシンレイアウトとインラインです。

   ^
  ^ ^
 ^ ^ ^
A B \ /
     ^
    C D

あなたの答えは、記述された確率を尊重する真の試みをしなければなりません。回答で確率がどのように計算されるのか(および、それらが仕様を尊重し、疑似乱数性と大きな数の問題を無視する理由)の適切な説明で十分です。

得点

これはので、各言語で最少のバイト勝ちます!


選択した言語の組み込みランダム関数がランダムであると想定できますか?
ミスターXcoder

理にかなった@ Mr.Xcoder
Skidsdev

したがって、明確にするために、入力は常に正確に4文字であり、提供されたPlinkoレイアウトに正確に従って、それぞれに確率を割り当てる必要がありますか?Plinkoレイアウトの生成またはシミュレーションは、ランダムソースが提供する精度内で確率が正しい限り、まったく不要です。
カミルドラカリ

1
@KamilDrakari正しい。
Skidsdev

2
非常にその長さのために便利な、私は表現がことがわかっていないceil(abs(i - 6)/ 2.0)からインデックスをマッピングされます0-7から、インデックスへの0-3適切な分布(と0 111 22 33...この挑戦のために)
ソクラテスのフェニックス

回答:


14

リーンミーンビーンマシン55 43 42バイト

Alex Vargaのおかげで-13バイト

  O
  i
  ^
 ^ ^
\ ^ ^
 i / U
 ii
 ^
i U
U

わずか2時間で自分の質問に答えてもかまわないことを願っていますが、LMBMに回答を投稿することを計画している人はいないと思います。

これは、文字通り、OPに示されているPlinkoレイアウトを反映し、水平方向に反転して不要な空白を削減します。


私はこれをテストする方法を知りませんが、これはうまくいくかもしれません:gist.github.com/anonymous/e537edc8c89a72f3631ef765b352b98d
アレックスヴァルガ

動作する@AlexVarga ooh
Skidsdev


9

ゼリー、6 バイト

Ḋṁ7;ḢX

4文字のリストを受け取り、記述された確率分布を持つ1つの文字列を返すモナドリンク。

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

どうやって?

Ḋṁ7;ḢX - Link: list of characters, s  e.g. ABCD
Ḋ      - dequeue s                         BCD
 ṁ7    - mould like 7 (implicit range)     BCDBCDB
    Ḣ  - head s                            A
   ;   - concatenate                       BCDBCDBA
     X - random choice                     Note that the above has 1*A, 3*B, 2*C, and 2*D

と巧妙なトリック
エリックアウトゴルファー

9

Cubix39 24 22 21 19バイト

.<.^iD>D|@oioi.\i;U

オンライン通訳で見る!

これは、次のキューブネットにマッピングされます。

    . <
    . ^
i D > D | @ o i
o i . \ i ; U .
    . .
    . .

ランダム分布実装の説明

Cubixは、命令ポインターがキューブの面を移動し、遭遇したコマンドを実行する言語です。ランダム性の唯一の形式はcommandでD、これはIPをランダムな方向に送信します:1/4各方向の平等なチャンス。

ただし、これを使用して、正しい重み付き確率を生成できます。2 D回使用します。最初にD1/42番目に向かっていDます。Dただし、この2つ目の矢印には2つの方向が矢印(> D <)でブロックされており、D別の方向を選択するために命令ポインターを送り返します。これは、そこから2つの方向のみが存在し、それぞれが1/8全体的に発生する可能性があることを意味します。次の図に示すように、これを使用して正しい文字を生成できます。

各方向の確率を示す画像

(実際のコードでは、右側の矢印がミラーに置き換えられていることに注意してください|

コードの説明

        . <
        . ^
IP> i D > D | @ o i
    o i . \ i ; U .
        . .
        . .

命令ポインターは、右側の文字から始まりi、右向きです。これを実行しi、最初の文字を入力として受け取り、次にに移動してD、上記のランダムプロセスを開始します。

  • Char A: 1 D番目が東に、2番目が南に送信する場合、キャラクターAを印刷する必要があります。これは、最初からすでにスタックにありますi。以下が実行されます。

    • \ -IPを反映して、東に向かう
    • i; -入力を取得し、再度ポップします(no-op)
    • U -IPを2回左に回してUターンします
    • o -TOS、文字Aを出力します
    • @ -プログラムを終了する
  • Char B: 1番目または2番目のDヘッドが北の場合、次の入力となるキャラクターBを生成する必要があります。両方のパスで次のコマンドが実行されます。

    • ^ -北へ
    • < -西に向かい、丸く包みます...
    • i -別の入力、文字Bを取得する
    • o -TOSの出力、キャラクターB
    • ; -TOSをポップする
    • @ -プログラムを終了する
  • Char C:最初のD者が私たちを西に送った場合、以下が実行されます:

    • i -別の入力、文字Bを取得する
    • i -別の入力、文字Cを取得する
    • o -出力TOS、キャラクターC
    • @ -プログラムを終了する
  • Char D:最初のD人が私たちを南に送ると、以下が実行されます

    • i -別の入力、文字Bを取得する
    • .. -2つのノーオペレーション
    • i -別の入力、文字Cを取得する
    • | -このミラーは東西を反映していますが、IPは北に向かっているため、通過します。
    • ^ -これは文字Bのパスと結合します。ただし、すでに2つの入力を取得しているため、4番目の文字(文字D)が印刷されます。

2
これは壮観です!サイズ2キューブの適切な確率 4つのすべてのパスに適合することができたとは思えません。私はそれらを逃さないように、
Cubixの

@ETHproductionsは:)私はバイトまたは2遮断する方法があります確信しているが、私は非常に誇りに思って、この答えのもよ、ありがとう
FlipTack

8

Python、50バイト

lambda x:choice(x[:2]+x[1:]*2)
from random import*

文字列(または文字のリスト)を取得して返す名前のない関数。

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

どうやって?

random.choiceリストからランダムな要素を選択するため、関数は正しい分布、つまり"ABCD"、に"ABCD"[:2] = "AB"加えて"ABCD"[1:]*2 = "BCD"*2 = "BCDBCD"である文字列を形成します"ABBCDBCD"


私はゴルフ私の解決策への道を発見し、それがちょうど逆の順序で、あなたと同じだ実現:/
ミスターXcoder

6

R、31バイト

sample(scan(,''),1,,c(1,3,2,2))

stdinスペースで区切られた文字を読み取ります。sample最初の入力からランダムなサンプルを1、最後の引数で指定された重みで、2番目の入力(so )(オプションの置換引数)の量で描画します。

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

n何度も試してみてください!

後者のコードでは、置換をrue(デフォルトではfalse )にn設定nして時間をサンプリングし(ヘッダーにT設定)、結果を集計し、除算しnて入力の相対確率を確認します。


6

PHP、28バイト

<?=$argn[5551>>2*rand(0,7)];

でパイプとして実行し-nRます。

01112233基数4は555110進数です...


同じ長さの108の可能な値は... 7030私の個人的なお気に入りの一つです。
タイタス

5

Java 8、53 44バイト

s->s[-~Math.abs((int)(Math.random()*8)-6)/2]

これはFunction<char[], Character>です。

オンラインでお試しください!(この試験プログラムは、上記機能を1,000,000倍、出力選択の実験的確率を実行しABC、およびD)。

ここでの一般的な考え方は、マップするいくつかの方法を見つけることです0-7にし0-3、そのようなことは、0表示され1/8、回1出現3/8回数を、2表示された2/8回数を、と3思わ2/8回。round(abs(k - 6) / 2.0))これkは、範囲のランダムな整数です[0,8)。これにより、次のマッピングが行われます。

k -> k - 6 -> abs(k-6) -> abs(k-6)/2 -> round(abs(k-6)/2)

0 -> -6 -> 6 -> 3   -> 3
1 -> -5 -> 5 -> 2.5 -> 3
2 -> -4 -> 4 -> 2   -> 2
3 -> -3 -> 3 -> 1.5 -> 2
4 -> -2 -> 2 -> 1   -> 1
5 -> -1 -> 1 -> 0.5 -> 1
6 -> 0  -> 0 -> 0   -> 0 
7 -> 1  -> 1 -> 0.5 -> 1

これは、あなたが見ることができるように、指標の結果0 111 22 33の所望の確率を生成し、1/83/82/82/8

ちょっと待って!どのように世界で-~Math.abs(k-6)/2同じ結果を達成するのでしょうか(再び、k範囲内のランダムな整数は[0,8]どこですか)?実際には非常に単純です... (x+1)/2(整数除算)はと同じものでありround(x/2)、とx + 1同じもの-~xです。けれどもx+1-~x同じ長さで、上記の関数では、使用に優れている-~xことがあるため-~優先されますので、括弧を必要としません。


しばらく経ちましたが、整数キャストの配置を変更することで2バイトをゴルフできMath.absますs->s[-~(int)Math.abs(Math.random()*8-6)/2](パラメーターとしてdoubleも使用できるため):(42バイト)。
ケビンクルーイッセン

5

APL、14バイト

(?8)⊃1 3 2 2\⊢

文字列として入力します。

どうやって?

1 3 2 2\⊢-各文字をx回繰り返す('ABCD''ABBBCCDD'

-インデックスの要素を取得します..

(?8) -ランダム1-8


あなたは見直し気になり、私のJの答えを、それを向上させることができるなら、私に知らせますか?
ジョナ



@Urielそのようなエンコーディングはありません。完全なUTF-8にするか、すべての文字を2バイト(UTF-16)としてカウントするか、に5バイトを追加します⎕U2378
アダム

@Adámああ、なるほど。次に、Dyalogにこれらの不要なヨーロッパアクセント文字を新しいシンボルに置き換えて、バイトを節約します!;)
ウリエル

4

、11バイト

‽⟦εεζζηηηθ⟧

オンラインでお試しください!リンクは冗長バージョンのコードへのリンクですが、ほとんど必要ありません。ランダムな要素を選択⟦⟧し、リストを作成します。変数は、適切な入力文字を取得する変数です(気が向いたので逆順)。


4

Pyth8 7バイト

O+@Q1t+

Pythonの回答とまったく同じアルゴリズムを使用します。

ここで試してみてください!

Pyth10 8バイト

O+<Q2*2t

Jonathan AllanのPythonの答えとまったく同じアルゴリズムを使用します。

ここで試してみてください!


説明

  • O-(で+)を追加することにより作成された文字列のランダム要素を取ります:

    • <Q2 -文字列の最初の2文字。
    • *2t*2最初の文字(t)を除く完全な文字列()を2倍にします。

このアルゴリズムの適用ABCD

  • <Q2かかりますAB
  • *2tそれを取りBCD、2倍にしますBCDBCD
  • +2つの文字列を結合しますABBCDBCD
  • O ランダムな文字を取ります。

-2 Leaky Nunに感謝(2番目の解決策)

-1ニーモニックのおかげ(最初の解決策)


>Q1となりtQになります、t
リーキー修道女

暗黙的な入力を2回置き換え*2+使用することにより、2番目のソリューションで1バイトを保存できます。

@Mnemonicおかげで、私は私が考えるので、私はそれを使用しhave'tだと思うy...文字列の仕事をしない、代わりに
氏Xcoder


3

C#(.NET Core)76 55バイト

s=>(s+s[1]+s[1]+s[2]+s[3])[new System.Random().Next(8)]

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

携帯電話を使用してTIOに直接書かれた最初の回答。レベルアップ!

説明:元のストリングが「ABCD」の場合、関数はストリング「ABCDBBCD」を作成し、そこからランダムな要素を取得します。


プログラムは、STDINからの入力として文字を使用する必要があります
Skidsdev

それはまだ... golfedてもよいが@Mayubeは、固定
チャーリー・

3

JavaScript 35バイト

ABCD入力として文字列を受け取り、A1/8の時間、B3/8の時間、C1/4の時間、D1/4の時間を出力します。

x=>x[5551>>2*~~(Math.random()*8)&3]

説明

x=>x[                     // return character at index
    5551                  // 5551 is 0001010110101111 in binary
                          // each pair of digits is a binary number 0-3
                          // represented x times
                          // where x/8 is the probability of selecting
                          // the character at the index 
    >>                    // bitshift right by
    2 *                   // two times
    ~~(                   // double-bitwise negate (convert to int, then 
                          // bitwise negate twice to get the floor for
                          // positive numbers)
        Math.random() * 8 // select a random number from [0, 8)
    )                     // total bitshift is a multiple of 2 from [0, 14]
    &3                    // bitwise and with 3 (111 in binary)
                          // to select a number from [0, 3]
]


3

> <>25 22 19バイト

i_ixio;o
ox</;
;\$o

オンラインでお試しください!または、魚の遊び場でそれを見てください!

> <>の簡単な概要:これは、コードを泳ぎ回る命令を実行する魚を伴う2D言語です。コードの端に達すると、反対側に折り返されます。魚は左上隅から始まり、右に移動します。ランダム性は> <>で注意が必要です。唯一のランダム命令はx、魚の方向を上下左右にランダムに設定します(同じ確率で)。

プログラムの開始時に、魚は2文字の入力を読み取りますi_i(それぞれiがSTDINからスタックに文字を読み取り_、魚は現在無視している水平ミラーです)。その後、に到達しxます。

場合はx魚の右方向を送り、それはもう一つの文字(第3)を読み込み、でそれを印刷しoして停止して;。左側の方向も同様です。魚はさらに2つの文字を読み取り(4番目まで)、右に折り返し、4番目の文字を出力して停止します。魚が泳いだ場合、2番目のキャラクターをラップして印刷し、その後すぐに反映され/て停止します。下に泳ぐと、によって左に反射され、/別のに当たりxます。

今回は、2つの方向から魚を送り返しますx(右に矢印、右に<鏡、_)。したがって、魚xは、これを他の2つの方向のそれぞれでエスケープする確率が1/2になります。左方向はスタックの一番上の文字(2番目の文字)を出力しますが、下方向は最初にスタックの2つの要素をで交換します$。したがって、この方向は最初の文字を出力します。

要約すると、3番目と4番目の文字はそれぞれ1/4の確率で印刷されます。最初の文字の確率は1/2 x 1/4 = 1/8です。2番目の文字の確率は1/4 + 1/2 x 1/4 = 3/8です。


2

05AB1E、8バイト

ìD1è0ǝ.R

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

         # Implicit input                            | [A,B,C,D]
ì        # Prepend the input to itself               | [A,B,C,D,A,B,C,D]
 D1è     # Get the second character                  | [A,B,C,D,A,B,C,D], B
    0ǝ   # Replace the first character with this one | [B,B,C,D,A,B,C,D]
      .R # Pick a random character from this array   | D

2

MATL12 10バイト

l3HHvY"1Zr

オンラインでお試しください!または、1000回実行し(わずかに変更したコード)、各文字が表示される回数を確認します。

説明

l3HH   % Push 1, 3, 2, 2
v      % Concatenate all stack contents into a column vector: [1; 3; 2; 2]
Y"     % Implicit input. Run-length decode (repeat chars specified number of times)
1Zr    % Pick an entry with uniform probability. Implicit display

変更されたコードの変更: 1000:"Gl3HH4$vY"1Zr]vSY'

  • 1000:"...]1000時間を繰り返すループです。
  • G 各反復の開始時に入力がプッシュされるようにします。
  • 結果は繰り返しにわたってスタックに蓄積されます。そのvため4$v、上位の4数字のみを連結するために置き換える必要があります。
  • ループの最後で、結果をベクトルにv連結し1000S並べ替え、Y'ランレングスエンコードします。これは、4つの文字とそれらが出現した回数を示します。


@Mayube気づいてくれてありがとう!
ルイスメンドー




2

Pyth、7バイト

@z|O8 1

テストスイート

O80から7までの乱数を生成し| ... 1ます。論理値または1を適用し、0を1に変換し、他はすべて同じにします。この段階での数は、時間の1 2/8であり、時間の2、3、4、5、6、7、または8の1/8です。

@zその位置で入力文字列にインデックスを付けます。インデックス付けは文字列の長さを法として実行されるため、位置0で4つのインデックス、位置1で5つのインデックスが作成されます。

確率は次のとおりです。

  • 位置0:乱数4。時間の1/8。

  • 位置1:乱数0、1、または5。時間の3/8。

  • 位置2:乱数2または6。時間の2/8。

  • 位置3:乱数3または7。時間の2/8。


2

JavaScript、31 30バイト/ 23バイト

asgallantの以前のJavascriptの回答を見て、JSについて考えるようになりました。彼が言ったように:

ABCD入力として文字列を受け取り、A1/8の時間、B 3/8の時間、C1/4の時間、D1/4の時間を出力します。

私のは:

x=>(x+x)[Math.random()*8&7||1]

説明:

x=>(x+x)[                 // return character at index of doubled string ('ABCDABCD')
         Math.random()*8  // select a random number from [0, 8]
         &7               // bitwise-and to force to integer (0 to 7)
         ||1              // use it except if 0, then use 1 instead
        ]

Math.random()*8&7次のように分解し:

A from 4      = 12.5% (1/8)
B from 0,1,5  = 37.5% (3/8)
C from 2,6    = 25%   (1/4)
D from 3,7    = 25%   (1/4)

バージョン2、23バイト

しかし、その後、彼が言ったとき、私に投稿したアーナウルドに感謝します:

時間依存の数式が許可されている場合、次のことができます。

それが実際に許可されている場合、私を導きました:

x=>(x+x)[new Date%8||1]

new Date%8上記と同じ分類表を使用しています。

また、%8可能性があります&7。好きなものを選んでください。ありがとう、アーナウド。


2

ngn / apl、10バイト

⎕a[⌈/?2 4]

?2 4 番号のペアをランダムに選択します-最初は0 1から、2番目は0 1 2 3から

⌈/ 「最大削減」である-より大きな数を見つける

⎕a は大文字のアルファベットです

[ ] 索引付け


a∊ {0,1}およびb∊ {0,1,2,3}の場合のmax(a、b)のグラフに注意してください。

    ┏━━━┯━━━┯━━━┯━━━┓
    ┃b=0│b=1│b=2│b=3┃
┏━━━╋━━━┿━━━┿━━━┿━━━┫
┃a=0┃ 0 │ 1 │ 2 │ 3 ┃
┠───╂───┼───┼───┼───┨
┃a=1┃ 1 │ 1 │ 2 │ 3 ┃
┗━━━┻━━━┷━━━┷━━━┷━━━┛

aとbがランダムに独立して選択された場合、0123 = ABCDを代入して、目的の確率分布を取得できます。


1

Pythonの364の55 51バイト

@ovsのおかげで-9バイト

lambda s:choice((s*2)[1:]+s[1])
from random import*

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


説明

random.choice()文字列のランダムな文字を取得し、1/8 s、2/8 s、2/8 s、3 /8 sの入力を(s*2)[1:]+s[1]作成BCDABCDBします。ABCDACDB


random.choice55バイトで使用:lambda s:choice((s[0]+s[1:]*3)[:8])
ovs

@ovsより短い方法が見つかりました^。どうもありがとうchoice()
ミスターXcoder

1

QBIC、27バイト

?_s;+;+B+B+;+C+;+D,_r1,8|,1

説明

?           PRINT
 _s         A substring of
   ;+       A plus
   ;+B+B+   3 instances of B plus
   ;+C+     2 instances of C plus
   ;+D      2 instances of D plus
   ,_r1,8|  from position x randomly chosen between 1 and 8
   ,1       running for 1 character


1

チップ、60バイト

)//Z
)/\Z
)\/^.
)\x/Z
)\\\+t
|???`~S
|z*
`{'AabBCcdDEefFGghH

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

3つは?それぞれランダムビットを生成します。最初のサイクルで、これらのビットは上記のスイッチ(/'sおよび\' s)を介して実行され、このテーブルから出力する値を決定します。

000 a
01_ b
0_1 b
10_ c
11_ d

(where _はまたはのいずれ0かです1)。次に、必要に応じて入力に沿って歩き、正しい値に達したら印刷して終了します。

最後の大きなアルファベットのblobはcatプログラムから大量にコピーされます。このソリューションは出力を抑制し、意図した効果を得るために終了します。



1

Applesoft、29 OOPS、32バイト

小さな「レトロコンピューティング」の例。私と一緒に、私はこれで真新しいです。「入力」として指定さているものは、それ自体がバイトカウントされる必要はないことを収集します。OPで述べられているように、入力は「ABCD」として与えられます。(取得する入力を指定する必要があることに最初は気づかなかったので、4バイトを追加しましたが、残りのバイトを1バイト減らしました。)

INPUTI$:X=RND(1)*4:PRINTMID$(I$,(X<.5)+X+1,1)

INPUT、RND、PRINT、およびMID $という用語は、それぞれ内部的にシングルバイトトークンとしてエンコードされます。

最初に、Xには0 <X <4の範囲のランダムな値が割り当てられます。これは、(X <.5)+ X + 1に従って、I $から文字の1つを選択するために使用されます。式の切り捨てられた評価。X <.5は、Xが.5未満の場合は1を追加し、そうでない場合は0を追加します。Xの結果は次のように分類されます。

A from .5 ≤ X < 1           = 12.5%
B from X < .5 or 1 ≤ X < 2  = 37.5%
C from 2 ≤ X < 3            = 25%
D from 3 ≤ X < 4            = 25%

プログラミングパズルとコードゴルフへようこそ!ここでの提出は、少なくとも些細なことでできる限りゴルフする必要があります。そのためには、不要な空白を削除する必要があります(この空白が必要な場合は謝罪します)。さらに、Applesoftの標準についてはわかりませんが、内部表現が1バイトでない限り、これらの演算子がシングルバイトトークンであると仮定することは許されていないと思います。また、入力が変数に格納されていると想定することはできません。むしろ、実際に入力、コマンドライン引数、または関数パラメーターとして受け取る必要があります。ありがとう!
ハイパーニュートリノ

@HyperNeutrino空白は必要ありませんが、「INPUT」と「PRINT」の後のスペースは読みやすさを改善します。このアンティークのサイバータンスペースは、私が持っていた場所に伝統的に表示されていました。私が述べたトークンについては、「内部表現は単一バイトである」というのは事実です。その間、私は自分が持っていたコードを1バイト下げてゴルフをしました。
アランラット

1

Common Lisp、198バイト

(setf *random-state*(make-random-state t))(defun f(L)(setf n(random 8))(cond((< n 1)(char L 0))((and(>= n 1)(< n 4))(char L 1))((and(>= n 4)(< n 6))(char L 2))((>= n 6)(char L 3))))(princ(f "ABCD"))

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

読みやすい:

(setf *random-state* (make-random-state t))
(defun f(L)
    (setf n (random 8))
    (cond 
            ((< n 1) 
                (char L 0))
            ((and (>= n 1)(< n 4))
                (char L 1))
            ((and (>= n 4)(< n 6))
                (char L 2))
            ((>= n 6)
                (char L 3))
    )
)
(princ (f "abcd"))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.