Tip dadu acak


14

Dalam dadu standar (mati) angka-angkanya diatur sehingga wajah yang berlawanan menambah tujuh. Tuliskan program sesingkat mungkin dalam bahasa pilihan Anda yang menghasilkan lemparan acak diikuti oleh 9 tip acak. Tipping adalah seperempat putaran dadu, misalnya jika dadu menghadap ke 5, semua kemungkinan tip adalah 1,3,4 dan 6.

Contoh output yang diinginkan:

1532131356

Jawaban:


5

GolfScript, 26 karakter

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

Versi Joey yang sedikit lebih terkompresi , pada dasarnya mengatasi masalah pengindeksan nol.


9

Ruby, 44

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

Saya menemukan trik [* 1..6] dengan mencoba percobaan yang beruntung.


1
Beberapa trik yang bagus di sini, hal-hal hebat. Memukul kepala sendiri karena melewatkan metode sampel # array.
Lars Haugseth

4

JavaScript (71 karakter)

Anda mungkin perlu mengganti printdengan alertatau sesuatu yang lain, tergantung pada lingkungan JavaScript Anda.

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

gabungkan loop dengan menambahkan kondisi luar secara kondisional ketika nilai ditemukan: for (b = n = 10; n; ab && a + b-7 && print (b = a, n -)) a = Math.random () * 6 + 1 | 0
imma

4

GolfScript, 28

0:|;{7,[0|7|-]-.,rand=:|}10*

3

Pesta

#/!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

kode sampel: http://ideone.com/CCfro


Penggunaannya ((var=expression))sangat bagus - saya pikir cara terpendek adalah var=$((expression))Tapi mengapa Anda menggunakannya sekali saja dan membuang banyak karakter pada expr di backticks?
Peter Taylor

Saya tidak melakukan banyak skrip shell, tetapi karena beberapa alasan ((var = expr)) di beberapa tempat gagal (ya aneh: P) Sejak saya memulai skrip ini, saya entah bagaimana menyelesaikannya. :)
Aman ZeeK Verma


2

Bash dengan hanya satu loop: 100 99 98 96

untuk ((i = 10, f = RANDOM% 6 +1; i -;)) lakukan
printf $ f
((n = ACAK% 4 + 1, m = f <4? f: 7-f, f = n <m || ++ n <7-m? n: n + 1))
selesai

http://ideone.com/XrZO7

Gagasan utamanya adalah untuk memilih angka acak dalam [1, x] yang tidak sama dengan y Anda dapat memilih angka acak di [1, x-1] dan kemudian meningkat jika itu> = y. Untuk masalah ini kami ingin angka acak dalam [1,6] yang tidak sama dengan f atau 7-f. Kita harus melakukan dua tes dalam urutan min (f, 7-f), max (f, 7-f).

Dengan asumsi lingkungan yang awalnya kosong dapat menghemat 2 karakter dengan tidak menginisialisasi i dan mengubah kondisi loop menjadi i++<10


2

Bash: 97 94 92 90 89 87

Sangat bermain golf dari jawaban Aman ZeeK Verma:

untuk ((i = 10, f = 0; i -;)) lakukan
untuk ((n = f; n == f || n + f == 7; f = ACAK% 6 + 1)) lakukan:
selesai
printf $ f
selesai

http://ideone.com/QiuTx

NB bisa dikatakan menyusut sebanyak 5 karakter dengan mengubah baris pertama menjadi for((;i++<10;))tetapi itu membuat asumsi yang tidak selalu valid. Ini akan bekerja ok di ideone tetapi seseorang yang menjalankannya dari shell bisa iatau fdiekspor ke sesuatu yang bukan nol.


Saya ingin membuat versi tanpa loop dalam, tapi saya khawatir ini akan lebih lama.
Peter Taylor

Ini sangat luar biasa, kurasa terlalu mentah untuk bash kurasa :)
Aman ZeeK Verma

@ Aman, sebagian besar tidak spesifik bash. Hanya beberapa lusin perbaikan dengan tes setelah masing-masing dan pembalikan ketika saya memecahkan sesuatu. Satu-satunya bit yang benar-benar trik bash adalah noop, yang harus saya cari. Jika Anda punya waktu untuk membaca man bash, saya merekomendasikannya. Saya pernah membacanya dari depan ke belakang, dan hanya memiliki gagasan yang samar tentang apa yang mungkin dan layak dicari telah membantu saya dengan baik.
Peter Taylor

2

Windows PowerShell, 45

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

Cukup sepele, sebenarnya. Saya membuat daftar kemungkinan gulungan dadu 1..6dan kemudian memilih hanya yang tidak sama dengan tujuh dikurangi gulungan terakhir dan kemudian hanya mereka yang tidak sama dengan gulungan terakhir. Dari daftar yang tersisa saya kemudian memilih item acak dan menugaskannya $d. Karena $dawalnya diperlakukan sebagai 0gulungan mati normal pertama kali.

Skrip uji:

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
}

Sejarah:

  • 2011-02-18 11:57 (61) Upaya pertama.
  • 2011-02-18 11:58 (45) Saya tidak perlu membuat angka pertama secara terpisah.

Saya dapatThe term 'random' is not recognized as a cmdlet, function, operable program, or script file. Verify the term and try again.
Peter Taylor

@ Peter: Tolong, PowerShell v2. The Get-Randomcmdlet tidak ada di v1.
Joey

2

J

Ini seharusnya bekerja tetapi sayangnya generator acak J macet setelah iterasi ke-3:

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

6 4 5 4 5 4 5 4 5 4


Saya tidak mengukur seorang pakar J, tetapi bagi saya nampak dari apa yang saya derita ketika menyusun jawaban J saya untuk utas ini yang (?4)cenderung digulung sekali dan diperlakukan sebagai konstanta untuk iterasi selanjutnya jika Anda tidak berhati-hati mengatasinya. Saya mengatasinya menggunakan (?@4:)konstruksi seperti.
JB

2

Rubi

66 karakter

(0..9).reduce([]){|m|m<<((1..6).to_a-[d=m[-1]||0,7-d]).shuffle[0]}

2

J, 30 karakter

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

6 2 3 5 4 2 4 1 3 6

Penjelasan (baca dari kanan ke kiri):

  • ?6 mengembalikan angka acak antara 0 dan 5
  • ^:(<10)menerapkan fungsi 9 kali, mengumpulkan hasil sepanjang jalan. Fungsinya adalah:
  • ?@4:{(i.6)-.],5&-
    • ] , 5&- mengembalikan array nomor input dan komplemennya ke 5 (saat ini kami menangani angka 0, sehingga jumlah wajah yang berlawanan adalah 5)
    • (i. 6) -. menghapusnya dari set penuh bilangan bulat 0 hingga 5. Kami dibiarkan dengan semua posisi yang valid setelah satu operasi tip dari posisi input.
    • ?@4: { mengambil salah satu dari mereka secara acak.
  • >: menambah seluruh urutan untuk mengembalikan angka ke interval 1 hingga 6.

Pemikiran yang bagus untuk ">:" pada akhirnya.
Eelvex

1
@Eelvex Saya tidak tahu mengapa dadu dunia nyata adalah 1 hingga 6 ketika semua alasan yang masuk akal tentang mereka menggunakan 0 hingga 5.: D
JB

2

GS2, 16 byte

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

Begini cara kerjanya

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

Saya pikir gs2 lebih baru dari tantangan ini.
lirtosiast

1

QBasic (71 karakter)

Dua baris baru diperlukan dan dimasukkan dalam jumlah karakter masing-masing sebagai satu karakter.

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

Solusi membosankan, tetapi lebih pendek dari revisi sebelumnya. Saya mengambil keuntungan dari kenyataan bahwa pada kalkulator baru, Ansdiinisialisasi ke nol.


Saya tidak tahu apakah itu mungkin, tetapi saya akan memberikan 50 perwakilan kepada siapa saja yang dapat menemukan solusi yang lebih pendek.
lirtosiast

Bagaimana Anda menghitung 34?
rekursif

Setiap token di sini adalah satu byte dalam memori ; itu standar untuk TI-BASIC untuk dinilai dengan cara ini. Jika Anda memiliki kalkulator, ketikkan program, lihat layar manajemen memori, kemudian kurangi 9 dan kurangi panjang nama program untuk mendapatkan ukuran kode.
lirtosiast

1

Java 8, 130 byte

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;}

Coba di sini.

Sebagai program lengkap dengan metode utama verbose, ini akan menjadi 178 byte :

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

Coba di sini.

Semi-port dari jawaban Bash @AmanZeeKVerma .

Penjelasan:

 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 byte

Saya senang saya bisa menampilkan xpengacakan kode-penunjuk >> karena saya tidak ingat melihatnya di sini.

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

Anda dapat mencobanya pada juru bahasa online ini (tempel kode, kirim, mulai).


Anda akan mendapatkan upvote saya setelah Anda memperbaiki solusinya.
lirtosiast

@ThomasKwa Selesai, saya mungkin bisa bermain golf sedikit tapi setidaknya sekarang berfungsi.
Aaron

0

R , 67 byte

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

Cobalah online!

Ada jawaban golf R tetapi ini saya pikir pendekatan yang berbeda dari jawaban yang diajukan sejauh ini.

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 byte

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

Pasti bisa bermain golf, tapi saat ini saya tidak melihatnya ..

Cobalah online.

Penjelasan:

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.