Sumy 100 rzutów dwóch sześciościennych kości

14

Załóżmy, że masz dwie sześciościenne kości. Rzuć parę 100 razy, obliczając sumę każdej pary. Wydrukuj liczbę wystąpień każdej sumy. Jeśli suma nigdy nie została wyrzucona, musisz podać zero lub jakiś sposób na określenie, że ta konkretna suma nigdy nie została wyrzucona.

Przykładowe dane wyjściowe: [3, 3, 9, 11, 15, 15, 11, 15, 7, 8, 3]

Liczba rzutów sumy jest reprezentowana w indeksie sum - 2

W tym przykładzie suma dwóch została zrolowana 3 razy ([2-2]), suma trzech 3 razy ([3-2]), suma czterech 9 razy ([4-2]), i tak na. Poszczególne rzuty kostką nie mają znaczenia, aby dojść do sumy (5 i 2 będą liczone jako ta sama suma co 6 i 1)

Wyjścia „brzydkie” są w porządku (mnóstwo zer końcowych, dodatkowe dane wyjściowe, dziwne sposoby przedstawiania danych itp.), O ile wyjaśnisz, w jaki sposób dane powinny być odczytywane.

MuffinDevil
źródło
2
Czy masz na myśli „wydrukuj liczbę wystąpień każdej pary” lub „wydrukuj liczbę wystąpień każdej sumy ”?
Esolanging Fruit
1
Jeśli określona suma nigdy nie pojawia się, czy 0na liście musi znajdować się symbol, czy można go pominąć?
Greg Martin
1
Czy różne wartości muszą być konsekwentnie identyfikowalne, czy wystarczą same liczby?
Jonathan Allan
1
Jeśli wynik jest tylko liczbą przypadków, w których występuje każda kombinacja par, dlaczego musimy sumować wartość każdej rolki? Co mamy zrobić z tą sumą? Co rozumiesz przez „brzydki”?
Kudłaty
1
extra outputale nadal nie możemy wygenerować nieskończonej listy liczb losowych i powiedzieć, że losowo pojawia się gdzieś tam, prawda? To standardowa iirc luka.
Stephen

Odpowiedzi:

5

Galaretka , 13 12 bajtów

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

Łącze niladyczne. Format wyjściowy to lista list [value, count].

(Zerowe rzuty oznaczają, że taki wynik nie występuje na wyjściu - np. Wynik [[6, 12], [7, 74], [8, 14]]oznaczałby, że wyrzucono tylko sumy sześć, siedem i osiem).

Wypróbuj online!

W jaki sposób?

³Ḥ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)
Jonathan Allan
źródło
4

Python 2 , 84 77 76 bajtów

-7 bajtów dzięki @JonathanAllan
-1 bajtów dzięki @FelipeNardiBatista

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

Wypróbuj online!

Dane wyjściowe mają dwa zera wiodące

ovs
źródło
grał w golfa do 76 bajtów TIO
Felipe Nardi Batista
3

05AB1E , 21 19 bajtów

-2 bajty dzięki @Emigna

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

Wypróbuj 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
kalsowerus
źródło
TÝÌтF6Lã.RO¸ì}{γ€g<oszczędza 2 bajty.
Emigna,
@Emigna, nie spodziewałem się, że zapętlenie będzie krótsze, dzięki!
kalsowerus
2

Mathematica, 50 bajtów

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

Prosta implementacja. Jeśli jakakolwiek suma nie zostanie nigdy osiągnięta, 0zostanie pominięta na liście.

Greg Martin
źródło
2

MATL , 17 bajtów

6H100I$Yrs!11:Q=s

Dane wyjściowe to lista 11 liczb (niektóre z nich prawdopodobnie 0) oddzielonych spacjami, wskazująca liczbę razy dla każdej pary od 2 do 12.

Wypróbuj online!

Dla porównania teoretyczną średnią liczbę wyświetleń każdej pary można obliczyć jako 6:gtY+36/100*.

Jeśli liczba rolek zostanie zwiększona, uzyskane wartości zbliżą się do teoretycznych. Zobacz na przykład uzyskane i teoretyczne wartości przy 10000 rolkach.

Luis Mendo
źródło
2

CJam, 18 20 bajtów

100{;6mr6mr+))}%$e``

Wypróbuj online!

Esolanging Fruit
źródło
Wyprowadza w brzydkim formacie - liczba wystąpień każdej rolki jest reprezentowana jako długość ciągłych segmentów.
Esolanging Fruit
@JathanathanAllan W porządku, więc dobrze. e` zajmuje tylko dwa bajty.
Esolanging Fruit
2

Perl 6 , 30 bajtów

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

(^6).pickjest liczbą losową od zera do pięciu. xx 100tworzy listę składającą się z 100 elementów z takich liczb. xx 2tworzy dwie takie listy. [Z+]zamyka te dwie listy z dodatkami, tworząc listę składającą się z 100 elementów z rzutami dwóch matryc. Na koniec bagumieszcza tę listę w torbie, która jest kolekcją o wielu rozmiarach. Przykładowe dane wyjściowe REPL:

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

Oznacza to, że 1, 9 i 0 wystąpiły cztery razy, cztery wystąpiły czternaście itd. Ponieważ „kostki” w tym kodzie dają liczbę od 0-5, dodaj po dwa do każdej z tych liczb, aby uzyskać rzut wyprodukowałyby standardowe kości 1-6.

Sean
źródło
Łał. Perl 6 to siła, z którą należy się liczyć.
Jakob
Jednak „Jeśli suma nigdy nie została wyrzucona, musisz podać zero lub jakiś sposób na określenie, że ta konkretna suma nigdy nie została wyrzucona”. Nie wygląda na to, że rozwiązanie torby to spełnia.
Jakob
Jeśli nie wyrzucono określonej liczby, sytuację tę można rozpoznać po nieobecności numeru w torbie.
Sean
2

R , 45 37 bajtów

-7 bajtów dzięki Jarko Dubbledam

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

Zwraca obiekt tabeli elementów i liczbę każdego. Nie obejmuje żadnych wartości, które nie wystąpiły.

Wypróbuj online!

stara wersja:

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

sample(6,200,T)próbkuje 200 razy z 1:6równomiernie z zamianą, następnie tworzy macierz z 2 rzędami, sumuje kolumny, następnie sortuje je w porządku rosnącym i oblicza długości przebiegów. Pomija wszelkie sumy kostek, które nie zostały osiągnięte.

Zwraca rleobiekt, który drukuje domyślnie w następującym formacie:

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 ...

gdzie lengthssą liczby i valuessumy kości.

Link TIO

Giuseppe
źródło
1

PHP, 53 bajtów

wypisuje tablicę asocjacyjną. klucz jest wynikiem dwóch kości, a wartość jest liczbą tych wyników

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

Wypróbuj online!

Jörg Hülsermann
źródło
If a sum was never rolled, you must include a zero or some way to identify that that particular sum was never rolled.
Tytus
1

JavaScript (ES6), 72 bajty

Patrząc na „brzydki” wynik jest dozwolony, poniższe wyświetli tablicę zawierającą liczbę rzutów każdego wyniku z 2-12, z dodatkowymi 89 elementami ustawionymi na 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>

Kudłaty
źródło
Czy nie marnujesz bajtu na 100 elementów zamiast 99 lub 20, a nawet 12?
Rohan Jhunjhunwala
@RohanJhunjhunwala, wyzwanie wymaga 100 rzutów dwóch kości.
Kudłaty
Och, myślałem, że właśnie zainicjowałem tablicę 100 elementów do przechowywania rolek.
Rohan Jhunjhunwala
1

SILOSY , 99 bajtów

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

Wypróbuj online!

Rzuca kośćmi i przechowuje je w pierwszych 11 miejscach stosu, a następnie tylko iteruje przez stos drukując każdy licznik. Jest to jedno z pierwszych zarejestrowanych zastosowań słowa kluczowego rand w połączeniu z operatorem przypisania.

Warto zauważyć, że można wprowadzić kilka modyfikacji, aby uzyskać histogram rolek. enter image description here

Niestety należy go uruchomić z interpretera 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
Rohan Jhunjhunwala
źródło
1

Eliksir, 157 118 bajtów

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

Próbowałem czegoś trudniejszego niż Jelly.

Wyjaśnienie:

  1. Zdefiniuj funkcję, która zwraca liczbę losową od 1 do 6 włącznie.
  2. Zdefiniuj anonimowo funkcję i niech ybędzie zmienną z sumą rzutów.
  3. zaktualizuj odpowiednie miejsce na liście, dodając 1.
  4. jeśli mamy 100 rzutów, wyjdź. W przeciwnym razie zadzwoń do siebie ponownie, przekazując siebie i zaktualizowaną listę.
  5. zwraca zaktualizowaną tablicę.

Należy nazwać jak p.(p,[0,0,0,0,0,0,0,0,0,0,0,0,0]). Wyświetli ostrzeżenie, ale zwróci pożądaną tablicę z 13 elementami, pierwsze 2 należy zignorować.

SalmonKiller
źródło
1

Java 8, 104 bajty

Lambda zwraca int[]częstotliwości. Przypisz do Supplier<int[]>.

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

Wypróbuj online

Niegolfowana lambda

() -> {
    int
        o[] = new int[11],
        i = 0
    ;
    while (i++ < 100)
        o[(int) (Math.random() * 6) + (int) (Math.random() * 6)]++;
    return o;
}
Jakob
źródło
1

q / kdb +, 31 28 25 bajtów

Rozwiązanie:

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

Przykład:

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

Wyjaśnienie:

Rzuć kostką 100?6, rzuć kostką ponownie i dodaj wektory razem. Następnie sprawdź, gdzie każdy wynik odpowiada zakresowi 0..10, a następnie zsumuj wszystkie wartości rzeczywiste na każdej liście:

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

Uwagi:

„Gra w golfa” polega głównie na zamianie qsłów kluczowych na kekwiwalenty, a mianowicie eachi til.

streetster
źródło
0

QBIC , 45 bajtów

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

Wyjaśnienie:

[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
Steenbergh
źródło
0

APL, 14 bajtów

,∘≢⌸+/?100 2⍴6

Prezentuje dane jako tabelę z lewą kolumną reprezentującą sumę, a prawą reprezentującą liczbę wystąpień.

Wyjaśniono

        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

Poprzedni post:

APL, 36 31 bajtów

5 bajtów zapisanych dzięki @ Adám

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

Wyjaśnienie

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

Jak 11⍴⍉⌽fdziała

⍝ ⌽ - 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
Uriel
źródło
Zaoszczędź kilka bajtów, łącząc instrukcje i czyniąc operand milczącym:(11⍴⍉⌽f)[⍋11⍴⍉f←,∘⍴⌸+/?100 2⍴6]
Adám
Przepraszam, edytowałem moją sugestię podczas jej wprowadzania. Zwróć uwagę na milczący operand.
Adám
Jednak OP pozwala na dowolny jednoznaczny format wyjściowy, więc ,∘⍴⌸+/?100 2⍴6powinno wystarczyć, ponieważ zawiera listę występujących sum (wskazując w ten sposób, których nie ma) i ich częstotliwości (więc sortowanie nie jest potrzebne).
Adám
0

> <> , 93 bajty

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

Wypróbuj online lub obejrzyj na placu zabaw dla ryb !

Brzydki format wyjściowy jest sekwencją liczb oddzielonych znakami nowej linii, gdzie n- ta liczba mówi, ile razy suma była n - jest brzydka, ponieważ drukuje wiecznie, dla wszystkich liczb całkowitych dodatnich n , chociaż większość wierszy będzie wynosić 0. ( Łącze TIO jest modyfikowane, aby zatrzymać po n = 12, kosztem 5 bajtów.)

Plac zabaw dla ryb jest dość powolny - wydrukowanie z maksymalną prędkością do około n = 12 zajmuje około trzy i pół minuty - możesz więc zmodyfikować go, aby rzucić 10 parami kości zamiast 100, zmieniając aa*w piątej linii na a  (to jest,a po których następują dwie spacje).

Losowe rzuty kostką są wykonywane przez ten bit:

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

The x s zmienić kierunek ryby losowo. Zakładając, że jest to realizowane z jednakowymi prawdopodobieństwami, jasne jest, że wynik rzutu jest równomiernym rozkładem przez symetrię.

Gdy ryba wyrzuci 100 par kostek, liczy ile razy suma była n tym bitem (rozpakowana dla jasności i zaczynająca się w lewym górnym rogu):

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

Trzymamy n na początku stosu i używamy rejestru do zliczania liczby pojawień się n .

Nie drzewo
źródło
0

JavaScript 85 75 znaków

Dzięki, Kudłaty!

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

Historia

85

a={}
f=_=>Math.random()*6
for(i=0;i++<100;)a[o=-~f()-~f()]=(a[o]||0)+1
console.log(a)
Steve Bennett
źródło
Zachowałem sens, aby dać ci na to kilka oszczędności; tutaj jest bardzo szybko golfed wersja 75 bajt rozwiązania: a=[];for(i=100;i--;)a[o=(f=_=>Math.random()*6|0)()+f()]=(a[o]|0)+1;alert(a). (Uwaga: w tym przypadku IIFE nie oszczędza ani nie kosztuje żadnych bajtów, ale są chwile, w których można zaoszczędzić bajt lub 2, więc dobrze jest mieć go w swojej torbie golfowej.)
Shaggy
Och, świetnie, dzięki. Przydatne sztuczki! Tak interesujące |0jest golfowe rozwiązanie „Math.floor ()”, a także „przekonwertować niezdefiniowane na 0”.
Steve Bennett
0

Perl 5 , 64 bajtów

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

Wypróbuj online!

Format wyjściowy:

<sum> <# rolls>

W przypadku sum z zerowymi rolkami kolumna rolek jest pusta.

Xcali
źródło
0

PHP, 65 bajtów

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

drukuje wiodące, 0_a następnie wystąpienia od 2 do 12, a następnie każdy znak podkreślenia.
Uruchom -nrlub wypróbuj online .

Tytus
źródło
0

K (oK) , 24 22 bajtów

Rozwiązanie:

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

Wypróbuj online!

Wyjaśnienie:

k„port” mojego qrozwiązania. Ocena odbywa się od prawej do lewej, stąd nawiasy wokół 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

Edycje:

  • -2 bajty przełączające każde lewe dla każdego z obu, a każde lewe + flip dla każdego z prawej
streetster
źródło
0

Pyth, 21 bajtów

V100aY,O6O6)VTlfqsTNY

Wysyła każdy krok w tworzeniu zwojów, a następnie wysyła częstotliwość każdej sumy 0–10 w osobnej linii.


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
Dave
źródło
0

Java (OpenJDK 8) , 95 bajtów

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

Wypróbuj online!

Objaśnienia

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;
}
Olivier Grégoire
źródło