ランダムダイスチップ


14

標準のサイコロ(ダイス)では、反対側の面が7になるように番号が配置されます。ランダムスローに続いて9回のランダムチップを出力する、可能な言語で最短のプログラムを記述します。チップはサイコロの4分の1回転です。たとえば、サイコロが5に面している場合、すべての可能なチップは1,3,4および6です。

望ましい出力の例:

1532131356

回答:


5

GolfScript、26文字

0{(.6,5@--\-.,rand=).}10*;

Joeyのわずかに圧縮されたバージョンで、基本的にゼロインデックスの問題を回避します。


9

ルビー、44

c=0;10.times{$><<c=([*1..6]-[c,7-c]).sample}

幸運な実験で[* 1..6]のトリックを見つけました。


1
ここでいくつかの素晴らしいトリック、素晴らしいもの。Array#sampleメソッドがないために頭に当たった。
ラースハウゼス

4

JavaScript(71文字)

あなたは交換する必要があるかもしれないprintalertあなたのJavaScript環境に応じて、または何か他のもの。

for(C=L=T=0;C++<10;print(L=T))while(!(T-L&&T+L-7))T=Math.random()*6+1|0

値が見つかったときに外側のループを条件付きでインクリメントしてループをマージします:for(b = n = 10; n; ab && a + b-7 && print(b = a、n-))a = Math.random()* 6 + 1 | 0
imma 14


3

バッシュ

#/!bin/bash
f=`expr $RANDOM % 6` 
f=`expr $f + 1`
printf "$f"
for ((i=0; i<9; i++))
do
   ((bad=7-$f))
   next=`expr $RANDOM % 6`
   next=`expr $next + 1`
   while [ $next -eq $bad ] || [ $next -eq $f ]
   do
      next=`expr $RANDOM % 6`
      next=`expr $next + 1`
   done
printf "$next"
f=$next
done

サンプルコード:http : //ideone.com/CCfro


の使用((var=expression))は非常に素晴らしいです-私は最短の方法がそうだと思ったvar=$((expression))しかし、なぜあなたは一度だけそれを使用し、バックティックのexprで大量の文字を浪費するのですか?
ピーターテイラー

私はシェルスクリプトの多くをしませんが、何らかの理由で((var = expr))いくつかの場所で失敗しました(ええ奇妙な:P)このスクリプトを始めてから、どういうわけか完了しました。:)
アマンジークバーマ


2

ループが1つだけのbash:100 99 98 96

for((i = 10、f = RANDOM%6 + 1; i-;))do
printf $ f
((n =ランダム%4 + 1、m = f <4?f:7-f、f = n <m || ++ n <7-m?n:n + 1))
やった

http://ideone.com/XrZO7

重要な考え方は、[1、x]の乱数をyと等しくないように選択するために、[1、x-1]の乱数を選択し、> = yの場合にインクリメントできるということです。この問題では、[1,6]にfまたは7-fと等しくない乱数が必要です。min(f、7-f)、max(f、7-f)の順序で2つのテストを実行する必要があります。

最初は空の環境でiを初期化せずにループ条件を変更することで2文字を節約できると仮定します i++<10


2

バッシュ:97 94 92 90 89 87

Aman ZeeK Vermaの答えから大きくゴルフをしました。

for((i = 10、f = 0; i-;))do
for((n = f; n == f || n + f == 7; f = RANDOM%6 + 1))do:
やった
printf $ f
やった

http://ideone.com/QiuTx

NBはおそらく最初の行をに変更することで5文字縮小することができますfor((;i++<10;))が、それは常に有効とは限らない仮定を作ります。それはideoneでは問題なく動作しますが、シェルから実行している誰かが持っているif、ゼロ以外のものにエクスポートすることができます。


私は内側のループのないバージョンをやりたいのですが、もっと長くなるのではないかと心配しています。
ピーターテイラー

これは非常に素晴らしいです、私は私が推測するbashにはあまりにも生です:)
Aman ZeeK Verma

@Aman、そのほとんどはbash固有ではありません。それはほんの数十の改良であり、それぞれの後にテストを行い、何かを壊したときは元に戻します。本当にbashトリックである唯一のビットは、私が調べなければならなかったnoopです。読む時間があるならman bash、それをお勧めします。私はかつてそれをカバーツーカバーで読みましたが、何が可能か調べてみる価値があるかについて漠然とした考えを持っているだけで十分に役立ちました。
ピーターテイラー

2

Windows PowerShell、45

-join(0..9|%{($d=1..6-ne(7-$d)-ne$d|random)})

実際、かなり些細なことです。可能なサイコロロールのリストを生成し、1..67から最後のロールを引いたものに等しくないもののみを選択し、最後のロールに等しくないもののみを選択します。残りのリストから、ランダムなアイテムを選択してに割り当て$dます。$d最初は0通常のダイスを振るので最初に扱われるので。

テストスクリプト:

for($i=0;$i-lt20;$i++){
    $o=@(./tipping.ps1)
    if ($i-gt0-and$o-eq$o2) { throw "Must have random output" }
    if ($o.count-ne1) { throw "Must only have one line of output" }
    if ($o[0]-match'[^1-6]'){ throw "Invalid characters" }
    if($o[0].length-ne10){ throw "Wrong length: $($o[0].length)" }
    $r=[char[]]($o[0])|%{$_-48}
    for ($x=1;$x-lt$r.count;$x++){
        if ($r[$x-1]+$r[$x]-eq7) { throw "Not a tipping: $($r[$x-1]) and $($r[$x])" }
    }
    $o2=$o
}

歴史:

  • 2011-02-18 11:57(61)最初の試行。
  • 2011-02-18 11:58(45)最初の番号を個別に生成する必要はありません。

私はThe term 'random' is not recognized as a cmdlet, function, operable program, or script file. Verify the term and try again.
ピーターテイラー

@Peter:PowerShell v2、お願いします。Get-Randomコマンドレットは、V1には存在しませんでした。
ジョーイ

2

J

これは動作するはずですが、残念ながらJのランダムジェネレーターは3回目の反復後にスタックします。

a=:>:i.6
f=:a#~1-(+&(a=])7&-)
((,(?4)&{@f@(_1&{))^:9)>:?6

6 4 5 4 5 4 5 4 5 4


私はJの専門家ではありませんが、このスレッドに対するJの回答を作成するのに苦労したことから、(?4)一度は転がされ、それを気にしないと後続の反復の定数として扱われるように思えます。(?@4:)-likeコンストラクトを使用して回避しました。
JB


2

J、30文字

>:(?@4:{(i.6)-.],5&-)^:(<10)?6

6 2 3 5 4 2 4 1 3 6

説明(右から左に読む):

  • ?6 0〜5の乱数を返します
  • ^:(<10)関数を9回適用し、途中で結果を蓄積します。機能は次のとおりです。
  • ?@4:{(i.6)-.],5&-
    • ] , 5&- 入力数と5の補数の配列を返します(現在0から始まる数を処理しているため、反対面の合計は5です)
    • (i. 6) -. 0から5までの整数の完全なセットからそれらを削除します。入力位置からの1回のティッピング操作の後、すべての有効な位置が残ります。
    • ?@4: { そのうちの1つをランダムに選択します。
  • >: シーケンス全体をインクリメントして、数字を1〜6の間隔に戻します。

最後に「>:」をよく考えてください。
エルベックス

1
@Eelvex現実世界のサイコロがすべて理にかなった推論で0から5を使用しているのに、なぜ1から6であるのか分かりません。:D
JB

2

GS2、16バイト

16 2f 25 08 41 20 17 30 16 2f 31 31 25 09 19 32

仕組み

16 2f 25     # make range from 1 to 6 and push random element
08           # start block
    41       # duplicate top of stack twice
    20 17 30 # negate top of stack and add 7
    16 2f    # push range from 1 to 6
    31 31    # do set-wise difference with each of the two previous numbers
    25       # push a random element from the list
09           # end block
19 32        # repeat block 9 times

gs2はこの課題よりも新しいと思います。
リルトシアスト

1

QBasic(71文字)

2つの改行が必要であり、それぞれ1文字として文字カウントに含まれます。

RANDOMIZE:FOR I=0TO 9
1N=INT(RND*6)+1:IF L=N OR L+N=7THEN 1
?N:L=N:NEXT

1

TI-BASIC、38 34

For(I,1,9
Ans→X
Repeat Ans≠X and Ans≠7-X
randInt(1,6
End
Disp Ans
End

退屈なソリューションですが、以前のリビジョンよりも短いです。私は、新しい計算機でAnsはゼロに初期化されるという事実を利用しています。


それが可能かどうかはわかりませんが、より短い解決策を見つけることができる人には50名の担当者を差し上げます。
リルトシアスト

34の計算方法は?
再帰的

ここの各トークンはメモリ内の1バイトです。TI-BASICがこのように採点されるのは標準です。計算機がある場合は、プログラムを入力し、メモリ管理画面を見て、9を減算し、プログラムの名前の長さを差し引いてコードサイズを取得します。
リルトシアスト

1

Java 8、130バイト

v->{int d=(int)(Math.random()*6+1),i=10,p;String r=""+d;for(;i-->0;r+=d)for(p=d;p==d|p+d==7;d=(int)(Math.random()*6+1));return r;}

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

詳細なメインメソッドを使用した完全なプログラムとして、これは代わりに178バイトになります

interface M{static void main(String[]a){int d=(int)(Math.random()*6+1),i=10,p;String r=""+d;for(;i-->0;r+=d)for(p=d;p==d|p+d==7;d=(int)(Math.random()*6+1));System.out.print(r);}}

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

半ポート@AmanZeeKVermaのバッシュの答え

説明:

 v->{              // Method with empty unused parameter and String return-type
   int d=(int)(Math.random()*6+1),
                   //  Random dice-roll 1-6
       i=10,       //  Counter-integer, starting at 10
       p;          //  Temp integer to store new side
   String r=""+d;  //  Result-String, starting at the first dice-roll
   for(;i-->0;     //  Loop (1) 10 times:
       r+=d)       //    After every iteration, append the result with a random side
     for(p=d;      //   Set the new side to the current side
         p==d      //   Loop (2) as long as the new side and current side are the same
         |p+d==7;  //   or as long as both combined are exactly 7:
       d=(int)(Math.random()*6+1)
                   //    Set the new side to a random side 1-6
     );            //   End of loop (2)
                   //  End of loop (1) (implicit / single-line body)
  return r;        //  Return the result-String
}                  // End of method


0

> <>、71バイト

xここで見たことを思い出せないので、> <>のコードポインターランダム化を紹介できてうれしいです。

a&0 v
 /2v
1x3v 
>x< <<
6x4v
 \5v ~
:{:/ ^?=}
:{:/ ^?=7+}
:~$<^&;!?:-1&n

このオンラインインタープリターで試すことができます(コードの貼り付け、送信、開始)。


ソリューションを修正すると、私の賛成票がもらえます。
リスト管理者

@ThomasKwaできました。もう少しゴルフができるかもしれませんが、少なくとも今は機能しています。
アーロン

0

R、67バイト

c(3,5,1,4,2,6)[(sample(1:6,1)+cumsum(sample((-2:2)[-3],9,T)))%%6+1]

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

ゴルファーのRの回答がありますがこれはこれまでに提出された回答とは異なるアプローチだと思います。

c(3,5,1,4,2,6)                                                     #A dice and its facets
               (sample(1:6,1)                                      #Initial dice roll
                             +cumsum(sample((-2:2)[-3],9,T)))      #9 tippings in c(-2,-1,1,2)
                                                             %%6+1 #converts to values in [0,6]
              [                                                   ]#

0

05AB1E、23 バイト

6LΩUTFX?6LʒDXÊsX+7Ê*}ΩU

間違いなくゴルフはできますが、現在は見ていません。

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

説明:

6LΩ              # Pick a random value from the range [1,6]
                 #  i.e. [1,2,3,4,5,6] → 3
   U             # Save this random value in variable `X`
TF               # Loop 10 times:
  X?             #  Print `X` without newline to STDOUT
  6Lʒ     }      #  Create a range [1,6] again, and filter it by:
     DXÊ         #   Check if the current value is not equal to `X`
                 #    i.e. 1 and 3 → 1 (truthy)
                 #    i.e. 3 and 3 → 0 (falsey)
     sX+         #   Sum the current value with `X`
                 #    i.e. 1 and 3 → 4
                 #    i.e. 3 and 3 → 6
        7Ê       #   And check if it's not equal to 7
                 #    i.e. 4 and 7 → 1 (truthy)
                 #    i.e. 6 and 7 → 1 (truthy)
     *           #   If both checks are truthy, keep it in the filtered list
                 #    i.e. 1 and 1 → 1 (truthy)
                 #    i.e. 0 and 1 → 0 (falsey)
           Ω     #  Pick a random value from the filtered list
                 #   i.e. [1,2,5,6] → 1
            U    #  And save it in variable `X` for the next iteration of the loop
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.