Jumlah 100 Gulungan Dua Dadu Enam Sisi


14

Misalkan Anda memiliki dua dadu enam sisi. Gulung pasangan 100 kali, hitung jumlah masing-masing pasangan. Cetak berapa kali setiap jumlah terjadi. Jika jumlah tidak pernah digulir, Anda harus menyertakan nol atau cara untuk mengidentifikasi bahwa jumlah tertentu tidak pernah digulir.

Contoh Output: [3, 3, 9, 11, 15, 15, 11, 15, 7, 8, 3]

Jumlah kali jumlah yang digulirkan diwakili dalam indeks jumlah - 2

Dalam contoh ini, jumlah dua digulirkan 3 kali ([2-2]), jumlah tiga 3 kali ([3-2]), jumlah empat 9 kali ([4-2]), dan seterusnya di. Tidak masalah gulungan dadu individu untuk mencapai jumlah (5 dan 2 akan dihitung sebagai jumlah yang sama dengan 6 dan 1)

Keluaran "Jelek" baik-baik saja (banyak nol tambahan, keluaran ekstra, cara aneh untuk merepresentasikan data, dll.) Selama Anda menjelaskan bagaimana data harus dibaca.


2
Apakah yang Anda maksudkan "cetak berapa kali setiap pasangan terjadi" atau "cetak berapa kali setiap jumlah terjadi"?
Buah Esolanging

1
Jika jumlah tertentu tidak pernah muncul, apakah perlu ada 0dalam daftar, atau dapatkah dihilangkan?
Greg Martin

1
Apakah nilai-nilai yang berbeda perlu diidentifikasi secara konsisten atau apakah penghitungan saja sudah cukup?
Jonathan Allan

1
Jika outputnya hanya berapa kali setiap kombinasi pasangan terjadi, mengapa kita perlu menjumlahkan nilai setiap gulungan? Apa yang harus kita lakukan dengan jumlah itu? Apa yang kamu maksud dengan "jelek"?
Shaggy

1
extra outputtetapi kita masih tidak dapat menampilkan daftar angka acak yang tak terbatas dan mengatakannya muncul secara acak di suatu tempat di sana, kan? Itu iirc celah standar.
Stephen

Jawaban:


5

Jelly , 13 12 byte

³Ḥ6ẋX€+2/ṢŒr

Tautan niladik. Format output adalah daftar daftar[value, count] .

(Zero rolls berarti tidak ada entri seperti itu dalam output - misalnya output [[6, 12], [7, 74], [8, 14]]akan mengidentifikasi bahwa hanya jumlah enam, tujuh dan delapan digulung.)

Cobalah online!

Bagaimana?

³Ḥ6ẋX€+2/ṢŒr - Main link: no arguments
³            - 100
 Ḥ           - double = 200
  6          - 6
   ẋ         - repeat -> [6,6,6...,6], length 200
    X€       - random integer from [1,z] for €ach (where z=6 every time)
       2/    - pairwise reduce with:
      +      -   addition (i.e. add up each two)
         Ṣ   - sort
          Œr - run-length encode (list of [value, length] for each run of equal values)

4

Python 2 , 84 77 76 byte

-7 byte terima kasih kepada @JonathanAllan
-1 byte terima kasih kepada @FelipeNardiBatista

from random import*
a=[0]*13
exec'a[%s]+=1;'%('+randint(1,6)'*2)*100
print a

Cobalah online!

Outputnya memiliki dua nol terkemuka


golf hingga 76 byte TIO
Felipe Nardi Batista

3

05AB1E , 21 19 byte

-2 byte terima kasih kepada @Emigna

TÝÌтF6Lã.RO¸ì}{γ€g<

Cobalah online!

TÝÌтF6Lã.RO¸ì}{γ€g<
TÝÌ                   Range from 2 to 12
   тF                 100 times do:
     6L                 Range from 1 to 6
       ã                Cartesian product (creates all possible pairs of 1 and 6)
        .RO             Choose random pair and sum
           ¸ì           Prepend result to initial list
             }        end loop
              {γ€g<   Sort, split on consecutive elements, count and decrement

TÝÌтF6Lã.RO¸ì}{γ€g<menghemat 2 byte.
Emigna

@Emigna, jangan berharap perulangan lebih pendek, terima kasih!
kalsowerus

2

Mathematica, 50 byte

r:=RandomInteger@5
Last/@Tally@Sort@Table[r+r,100]

Implementasi langsung. Jika ada jumlah yang tidak pernah tercapai, maka 0dihilangkan dari daftar.


2

MATL , 17 byte

6H100I$Yrs!11:Q=s

Output adalah daftar 11 angka (beberapa dari mereka mungkin 0) dipisahkan oleh spasi, menunjukkan jumlah kali untuk setiap pasangan dari 2 hingga 12.

Cobalah online!

Sebagai perbandingan, jumlah rata-rata teoritis setiap kali pasangan akan muncul rata-rata dapat dihitung sebagai 6:gtY+36/100*.

Jika jumlah gulungan meningkat, nilai yang diperoleh mendekati yang teoritis. Lihat misalnya nilai yang diperoleh dan teoritis dengan 10.000 gulungan.



2

Perl 6 , 30 byte

bag [Z+] (^6).pick xx 100 xx 2

(^6).pickadalah angka acak dari nol hingga lima. xx 100membuat daftar seratus elemen angka-angka tersebut. xx 2menghasilkan dua daftar tersebut. [Z+]ritsleting kedua daftar itu dengan tambahan, menghasilkan daftar seratus elemen gulungan dua-mati. Akhirnya, bagmasukkan daftar itu ke dalam tas, yang merupakan koleksi dengan banyak. Contoh output REPL:

bag(1(4), 9(4), 0(4), 4(14), 5(18), 3(9), 10(2), 6(19), 7(13), 2(3), 8(10))

Itu berarti 1, 9, dan 0 terjadi empat kali masing-masing, empat terjadi empat belas kali, dll. Karena "dadu" dalam kode ini menghasilkan angka dari 0-5, tambahkan dua ke masing-masing angka ini untuk mendapatkan gulungan sepasang dadu standar 1-6 akan menghasilkan.


Wow. Perl 6 adalah kekuatan yang harus diperhitungkan.
Jakob

Namun, "Jika suatu jumlah tidak pernah digulirkan, Anda harus menyertakan nol atau cara untuk mengidentifikasi bahwa jumlah tertentu itu tidak pernah digulirkan." Tidak terlihat solusi tas memuaskan itu.
Jakob

Jika nomor tertentu tidak digulung, situasi itu dapat diidentifikasi dengan tidak adanya nomor dalam kantong.
Sean

2

R , 45 37 byte

-7 byte berkat Jarko Dubbledam

s=sample;table(s(6,100,T)+s(6,100,T))

Mengembalikan objek tabel elemen dan jumlah masing-masing. Tidak termasuk nilai apa pun yang tidak terjadi.

Cobalah online!

versi lama:

rle(sort(colSums(matrix(sample(6,200,T),2))))

sample(6,200,T) sampel 200 kali dari 1:6 seragam dengan penggantian, kemudian membuat matriks dengan 2 baris, menjumlahkan kolom, kemudian mengurutkannya menjadi urutan naik dan menghitung panjang berjalan. Hapus semua jumlah dadu yang tidak tercapai.

Mengembalikan rleobjek, yang dicetak secara default dalam format berikut:

Run Length Encoding
  lengths: int [1:11] 5 6 8 12 12 20 12 11 4 7 ...
  values : num [1:11] 2 3 4 5 6 7 8 9 10 11 ...

di mana lengthsjumlah dan valuesjumlah dadu.

TIO Link


1

PHP, 53 Bytes

mencetak array asosiatif. kuncinya adalah hasil dari dua dadu dan nilainya adalah hitungan dari hasil ini

for(;$i++<100;)$r[rand(1,6)+rand(1,6)]++;print_r($r);

Cobalah online!


If a sum was never rolled, you must include a zero or some way to identify that that particular sum was never rolled.
Titus

1

JavaScript (ES6), 72 byte

Melihat output "jelek" diperbolehkan, yang berikut ini akan menampilkan array yang berisi berapa kali setiap skor dari 2-12 digulirkan, dengan tambahan 89 elemen ditetapkan ke 0.

_=>(a=Array(100).fill(0)).map(_=>a[g()+g()]++,g=_=>Math.random()*6|0)&&a

f=
_=>(a=Array(100).fill(0)).map(_=>a[g()+g()]++,g=_=>Math.random()*6|0)&&a
o.innerText=f()
<pre id=o>


Apakah Anda tidak membuang byte untuk membuatnya 100 elemen, bukan 99 atau 20 atau bahkan 12?
Rohan Jhunjhunwala

@RohanJhunjhunwala, tantangan membutuhkan 100 gulungan dua dadu.
Shaggy

Oh, saya pikir baru saja menginisialisasi array elemen 100 untuk menyimpan gulungan.
Rohan Jhunjhunwala

1

SILOS , 99 byte

i=100
lbla
x=rand*6+rand*6
a=get x
a+1
set x a
i-1
if i a
lblb
c=get b
printInt c
b+1
d=11-b
if d b

Cobalah online!

Gulung dadu, dan simpan di 11 titik tumpukan pertama, lalu geser melewati tumpukan tumpukan di setiap konter. Ini adalah salah satu penggunaan kata kunci rand yang direkam pertama kali dikombinasikan dengan operator penugasan.

Perlu dicatat, bahwa beberapa modifikasi dapat dilakukan untuk menampilkan histogram gulungan. masukkan deskripsi gambar di sini

Sayangnya itu harus dijalankan dari penerjemah offline .

i=4000
lbla
x=rand*6+rand*6
a=get x
a+1
set x a
i-1
if i a
canvas 1100 1000 Output
lblb
c=get b
printInt c
d=c*1
y=1000-d
x=b*100
newObj 0 100 d
moveObj b x y
b+1
d=11-b
if d b
wait 10000

1

Elixir, 157 118 byte

l=&Enum.random(1..&1)
p=fn(o,s)->y=l.(6)+l.(6)
s=List.update_at(s,y,&(&1+1))
if Enum.sum(s)<100 do s=o.(o,s) end
s end

Mencoba sesuatu yang lebih keras dari Jelly.

Penjelasan:

  1. Tentukan fungsi yang mengembalikan angka acak antara 1 dan 6 inklusif.
  2. Tentukan fungsi secara anonim dan biarkan ymenjadi variabel dengan jumlah roll.
  3. perbarui tempat yang sesuai dalam daftar dengan menambahkan 1.
  4. jika kita 100 gulungan, berhenti. Panggil lagi diri Anda dengan mengirimkan diri Anda dan daftar yang diperbarui.
  5. kembalikan array yang diperbarui.

Harus disebut seperti p.(p,[0,0,0,0,0,0,0,0,0,0,0,0,0]). Ini akan memunculkan peringatan, tetapi akan mengembalikan array yang diinginkan dengan 13 elemen, 2 pertama harus diabaikan.


1

Java 8, 104 byte

Lambda mengembalikan int[]frekuensi. Tetapkan untuk Supplier<int[]>.

()->{int o[]=new int[11],i=0;while(i++<100)o[(int)(Math.random()*6)+(int)(Math.random()*6)]++;return o;}

Cobalah secara Online

Lambda yang tidak tersentuh

() -> {
    int
        o[] = new int[11],
        i = 0
    ;
    while (i++ < 100)
        o[(int) (Math.random() * 6) + (int) (Math.random() * 6)]++;
    return o;
}

1

q / kdb +, 31 28 25 byte

Larutan:

sum!:[11]=/:sum(2#100)?'6

Contoh:

q)sum!:[11]=/:sum(2#100)?'6
1 3 5 11 16 21 16 9 8 9 1i

Penjelasan:

Gulung dadu 100?6, gulung dadu lagi dan tambahkan vektor bersama. Lalu lihat di mana masing-masing hasil cocok dengan kisaran 0..10, lalu jumlah semua true dalam setiap daftar:

sum til[11]=/:sum(2#100)?'6 / ungolfed solution
                 (2#100)    / 2 take 100, gives list (100;100)
                        ?'6 / performs rand on each left-each right, so 100 & 6, 100 & 6
              sum           / add the lists together
    til[11]                 / the range 0..10
           =/:              / apply 'equals?' to each right on left list
sum                         / sum up the results, e.g. how many 1s, 2s, 3s.. 12s

Catatan:

'Golf' sebagian besar menukar qkata kunci untuk ksetara, yaitu eachdan til.


0

QBIC , 45 byte

[100|h=_r1,6|+_r1,6|-2┘g(h)=g(h)+1][0,z|?g(b)

Penjelasan:

[100|         FOR a = 1 to 100
h=_r1,6|       set h to a random value between 1-6
 +_r1,6|       + another rnd(1,6) (2, 3 ... 11, 12)
 -2            - 2 (index: 0 ... 10
┘             Syntactic linebreak
g(h)          When using array parenthesis on an undefined array,
              it is interpreted as an array with 10 indexes of all zeroes.           
    =         Of array g, set the value of index h (0 ... 11)
      g(h)+1  to one higher (all indices start out as 0)
              Note that we need to track 11 values. Fortunately, QBasic'set
              empty, 10-sized array has 11 indices, because of base 0 / base 1 ambiguity.
]             NEXT set of dice
[0,z|         FOR b = 0 to 10
?g(b)           PRINT the tracker array

0

APL, 14 byte

,∘≢⌸+/?100 2⍴6

Menyajikan data sebagai tabel dengan kolom kiri yang mewakili jumlah dan kanan mewakili jumlah kejadian.

Dijelaskan

        100 2⍴6  ⍝ create an 2×100 array of 6
       ?         ⍝ roll for each cell from 1 to 6
     +/          ⍝ sum every row
   ⌸            ⍝ for every unique sum
,∘≢              ⍝ get the sum and the number of indexes

Posting sebelumnya:

APL, 36 31 byte

5 byte disimpan berkat @ Adám

(11⍴⍉⌽f)[⍋11⍴⍉f←,∘≢⌸+/?100 2⍴6]

Penjelasan

f←,∘≢⌸+/?100 2⍴6
          100 2⍴6    ⍝ create an 2×100 array of 6
         ?           ⍝ roll for each cell from 1 to 6
       +/            ⍝ sum every row
     ⌸              ⍝ for every unique sum
  ,∘≢                ⍝ get the sum and the number of indexes

(11⍴⍉⌽f)[⍋11⍴⍉f]  ⍝ ⍋x returns the indexes of the sorted x in the current x  
                     ⍝ x[y] find the yth elements of x
                     ⍝ x[⍋y] reorders x the same way that would be required to sort y

            11⍴⍉f   ⍝ the column of sums - see below
 11⍴⍉⌽f            ⍝ the column of counts - see below

Bagaimana cara 11⍴⍉⌽fkerjanya?

⍝ ⌽ - Reverses the array
⍝ ⍉ - Transposes the array

  ⍝   f
 9 14   ⍝ Sum - Occurences
 4  9
 7 17
 8 18
 6 15
 5  7
10  3
11  5
 3  6
 2  2
12  4

  ⍝   ⍉f
 9 4  7  8  6 5 10 11 3 2 12  ⍝ Sum
14 9 17 18 15 7  3  5 6 2  4  ⍝ Occurences

  ⍝   ⍉⌽f
14 9 17 18 15 7  3  5 6 2  4  ⍝ Occurences
 9 4  7  8  6 5 10 11 3 2 12  ⍝ Sum

Simpan beberapa byte dengan menggabungkan pernyataan dan membuat operan diam-diam:(11⍴⍉⌽f)[⍋11⍴⍉f←,∘⍴⌸+/?100 2⍴6]
Adám

Maaf, saya mengedit saran saya saat Anda memasukkannya. Perhatikan operan diam-diam.
Adám

Namun, OP memungkinkan format output yang tidak ambigu, jadi ,∘⍴⌸+/?100 2⍴6harus cukup, karena mencantumkan jumlah yang terjadi (sehingga menunjukkan mana yang tidak ada) dan frekuensi mereka (jadi tidak diperlukan penyortiran).
Adám

0

> <> , 93 byte

00[0[v
v 1\v/4
v 2xxx5
v 3/^\6
>l2(?^+]laa*=?v0[
  /&1+&\ v1&0]<
=?/ :?!\}>:@@:@
oa&0n&}< ^+1

Cobalah online , atau tonton di taman bermain ikan !

Format output jelek adalah urutan angka yang dipisahkan oleh baris baru, di mana angka ke- n mengatakan berapa kali jumlahnya adalah n - itu jelek karena mencetak selamanya, untuk semua bilangan bulat positif n , meskipun sebagian besar baris akan menjadi 0. ( TIO link dimodifikasi untuk berhenti setelah n = 12, dengan biaya 5 byte.)

Taman bermain ikan cukup lambat - dibutuhkan sekitar tiga setengah menit untuk mencetak hingga n = 12 dengan kecepatan tinggi - jadi Anda mungkin ingin memodifikasinya untuk menggulung 10 pasang dadu alih-alih 100 dengan mengubah aa*di baris ke-5 menjadi a  ( aYaitu , diikuti oleh dua spasi).

Gulungan dadu acak dilakukan dengan bit ini:

1\v/4
2xxx5
3/^\6

Itu x s mengubah arah ikan secara acak. Dengan asumsi bahwa diimplementasikan dengan probabilitas yang sama, jelas bahwa hasil die roll adalah distribusi yang seragam oleh simetri.

Setelah ikan telah bergulir 100 pasang dadu, ia menghitung berapa kali jumlah itu n dengan bit ini (membuka bungkusan untuk kejelasan, dan mulai di kiri atas):

v       /&1+&\
>:@@:@=?/ :?!\}
^   +1oa&0n&}<

Kami menjaga n di depan tumpukan, dan menggunakan register untuk menghitung berapa kali n muncul.


0

Javascript 85 75 karakter

Terima kasih Shaggy!

a=[]
for(i=100;i--;)a[o=(f=_=>Math.random()*6|0)()+f()]=(a[o‌​]|0)+1
alert(a)

Sejarah

85

a={}
f=_=>Math.random()*6
for(i=0;i++<100;)a[o=-~f()-~f()]=(a[o]||0)+1
console.log(a)

Tetap bermakna memberi Anda sedikit penghematan untuk ini; inilah versi 75 byte sangat cepat golfed dari solusi Anda: a=[];for(i=100;i--;)a[o=(f=_=>Math.random()*6|0)()+f()]=(a[o]|0)+1;alert(a). (Catatan: dalam contoh ini, IIFE tidak menghemat maupun biaya byte tetapi ada saat-saat itu dapat menghemat satu atau 2 byte, jadi itu berguna untuk memilikinya di "tas golf" Anda.)
Shaggy

Oh, bagus, terima kasih. Trik yang bermanfaat di sana! Sangat menarik itu |0adalah solusi golf untuk "Math.floor ()" dan juga untuk "mengkonversi undefined ke 0".
Steve Bennett

0

Perl 5 , 64 byte

map$s{2+int(rand 6)+int rand 6}++,1..100;say"$_ $s{$_}"for 2..12

Cobalah online!

Format output:

<sum> <# rolls>

Untuk jumlah dengan nol gulungan, kolom gulungan kosong.


0

PHP, 65 byte

while($i++<100)${rand(1,6)+rand(1,6)}++;for(;++$k<13;)echo+$$k,_;

mencetak yang memimpin 0_dan kemudian kejadian 2 hingga 12, diikuti oleh masing-masing garis bawah.
Jalankan dengan -nratau coba online .


0

K (oK) , 24 22 byte

Larutan:

+/(!11)=/:+/(2#100)?'6

Cobalah online!

Penjelasan:

k'port' dari qsolusi saya . Evaluasi terjadi dari kanan ke kiri, maka tanda kurung di sekitar til ( !)

+/(!11)=/:+/(2#100)?'6 / the solution
            (2#100)    / the list (100;100)
                   ?'6 / take 6 from each left/each right (roll the dice twice)
           +/          / sum rolls together
  (!11)                / til, performs range of 0..n-1, thus 0..10
       =/:             / equals each right (bucket the sum of the rolls)
+/                     / sum up to get counts per result

Suntingan:

  • -2 byte berpindah setiap-kiri untuk masing-masing, dan + kiri-balik untuk masing-masing

0

Pyth, 21 byte

V100aY,O6O6)VTlfqsTNY

Keluarkan setiap langkah dalam pembuatan gulungan, lalu keluarkan frekuensi setiap penjumlahan 0 - 10 pada baris terpisah.


V100aY,O6O6)VTlfqsTNY Full program, no input, outputs to stdout
V100                  For N from 0 to 100
    a ,O6O6           Append a pair of random ints below 6
     Y                To a list Y, initialized to the empty list
           )          Then
            VT        For N from 0 to 10
              f     Y Print Y filtered to only include pairs
                q  N  For which N is equal to
                 sT   The sum of the pair

0

Java (OpenJDK 8) , 95 byte

a->{int r[]=new int[11],i=0,d=0;for(;i++<200;)r[d+=Math.random()*6]+=i%2<1?1-(d=0):0;return r;}

Cobalah online!

Penjelasan

a->{
  int r[] = new int[11],     // Rolls or result
      i   = 0,               // Iteration
      d   = 0;               // Dice accumulator
  for (;i++<200;)
    r[d+=Math.random()*6] += // Accumulate a new die and start an addition
     i % 2 < 1               // Accumulate up to two dice
       ? 1 - (d = 0)         // If we're at 2 dice, reset the accumulator and add 1
       : 0;                  // If we only have one die, add 0
  return r;
}
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.