Ile kości można rzucić bez rzutu najbardziej prawdopodobną liczbą

26

Problem

Zaczynając od n=2kości:

  • Rzuć nkośćmi, przy czym każda liczba od 1 do 6 jest równie prawdopodobna na każdej kości.
  • Sprawdź, czy ich suma jest równa najbardziej prawdopodobnej sumie nkości 3.5*n.
    • Jeśli są równe, zakończ.
    • W przeciwnym razie wydrukuj ni powtórz od początku z n+2kostkami

Twój kod nie musi dokładnie wykonywać tej procedury, ale powinien dać losowy wynik probabilistycznie równoważny, w oparciu o naszą definicję losowości .

Twój program powinien wypisać wszystkie liczby we własnej linii; na przykład, jeśli program uzyskał do 8 kości i rzucił najbardziej prawdopodobną liczbę za pomocą 8 kości, wynik byłby następujący:

2
4
6

Przykładowy bieg

Na 2 kościach 7jest najbardziej prawdopodobna suma. Powiedzmy, że wyrzucono liczby 2i 3. Następnie wydrukowałbyś 2.

Na 4 kościach 14jest najbardziej prawdopodobna suma. Powiedzmy, że numery były walcowane 3, 4, 2, i 5. Zatem suma jest 14, więc program zakończyłby się tutaj.

Ostateczne wyjście w tym przypadku to "2".

Zasady

zoecarver
źródło
Ta odpowiedź w obecnej formie jest bardzo niejasna. Czy istnieje wejście, czy też ma ono generować wyjście z braku wejścia w postaci pętli? Czy jest jakaś przypadkowość? Nie widzę w tym żadnej przypadkowości.
HyperNeutrino,
Przy okazji, witamy w PPCG! :)
HyperNeutrino,
Dziękuję, przepraszam, jestem w tym zupełnie nowy. Co by to wyjaśniło? Nie ma wkładu, powinieneś zacząć od jednej kości i wspiąć się jak najwyżej.
zoecarver
@pudility Więc jeśli dobrze rozumiem, mam za 2, 4, 6, 8, ...każdym razem wyrzucać tyle kości, aż trafię w najbardziej prawdopodobną liczbę dla tej iteracji?
HyperNeutrino,
5
Dziękujemy za poświęcenie czasu na edycję wyzwania na podstawie naszych opinii! Dla przypomnienia, mamy miejsce, w którym możesz publikować wyzwania, aby opracować niektóre szczegóły przed opublikowaniem: piaskownica .
FryAmTheEggman

Odpowiedzi:

17

Python 2 , 70 bajtów

from random import*
n=2
while eval("+randrange(6)-2.5"*n):print n;n+=2

Wypróbuj online!

Sztuczka polega na obliczeniu sumy przez evalwprowadzenie łańcucha, który wygląda

'+randrange(6)-2.5+randrange(6)-2.5'

z nkopiami wyrażenia połączonymi. Do randrange(6)wyjścia z liczbą losową [0,1,2,3,4,5], która jest przesunięta w dół przez 2.5mieć średnią 0. Gdy suma if 0, whilewarunek kończy się niepowodzeniem i pętla kończy się.

Alternatywne użycie mapbyło 4 bajty dłuższe:

from random import*
n=2
while sum(map(randrange,[6]*n))-2.5*n:print n;n+=2

Znalazłem kilka wyrażeń o takiej samej długości dla kości przesuniętej do zera, ale nie krótszej

randrange(6)-2.5
randint(0,5)-2.5
randrange(6)*2-5
uniform(-3,3)//1
xnor
źródło
11
Podoba mi się ten! Głównie dlatego, że tylko to rozumiem.
zoecarver
7

MATL , 13 bajtów

`@E6y&Yrs@7*-

Wypróbuj online!

Wyjaśnienie

`       % Do...while top of the stack is truthy
  @E    %   Push 2*k, where k is the iteration index starting at 1
  6     %   Push 6
  y     %   Duplicate 2*k onto the top of the stack
  &Yr   %   Array of 2*k integers distributed uniformly in {1, 2, ..., 6}
  s     %   Sum
  @7*   %   Push 7*k
  -     %   Subtract
        % End (implicit). If the top of the stack is non-zero, the loop
        % proceeds with the next iteration. Else the loop is exited.
        % Display stack (implicit)
Luis Mendo
źródło
6

Galaretka ,  19  14 bajtów

-5 bajtów z pomocą Dziurawej Zakonnicy (przejście od zliczania do rekurencji)

‘‘6ṗX_3.L⁶S?Ṅß

Pełny program drukujący wyniki oddzielone znakami nowej linii (drukowana jest również dodatkowa spacja i znak nowej linii oraz błędy programu na końcu).

Wypróbuj online! - za każdym razem, gdy 6 kości zostanie przekroczonych, TIO zabija to z powodu zużycia pamięci, ale działa w zasadzie - zajmuje to również około 40 sekund.

Bardziej przyjazna wersja 15 bajt, który nie trwa tak długo albo wymagają tak dużo pamięci jest dostępny tutaj .

W jaki sposób?

Rekurencyjnie rzuca 2 dodatkowymi kośćmi, aż suma twarzy zmniejszonych o 3,5 wynosi zero, wypisując liczbę kostek w miarę ich przesuwania, gdy osiągnie zero, próbuje użyć znaku spacji, powodując błąd typu.

‘‘6ṗX_3.L⁶S?Ṅß - Main link: no arguments (implicit left=zero)
‘              - increment (initial zero or the previous result)
 ‘             - increment  (= # of dice to roll, n)
  6            - literal 6
   ṗ           - Cartesian power - all possible rolls of n 6-sided dice with faces 1-6
    X          - pick one of them
      3.       - literal 3.5
     _         - subtract 3.5 from each of the roll results
           ?   - if:
          S    -          sum the adjusted roll results (will be 0 for most common)
        L      - ...then: length (number of dice that were rolled)
         ⁶     - ...else: literal ' ' (causes error when incremented in next step)
            Ṅ  - print that plus a newline
             ß - call this link with the same arity (as a monad with the result)
Jonathan Allan
źródło
Wow, to bardzo mało bajtów. Dobra robota! Nie mogę tego zaakceptować, dopóki kilka osób nie odpowie.
zoecarver
Tak, normalne jest czekać dość długo, zanim się zaakceptuje, nawet jeśli kiedykolwiek to zrobi. Wiele osób daje to tydzień lub dwa.
Jonathan Allan,
Ponadto powinieneś wypisać wszystkie iteracje - nie tylko ostatnią.
zoecarver
Och, odpowiedziałem na starą edycję - która całkowicie to zmienia, nie mogę użyć tej metody na wiele sposobów.
Jonathan Allan,
Och, poczekaj tylko ns. OK, może to da się uratować. Myślałem, że masz na myśli sumy :)
Jonathan Allan,
6

TI-BASIC, 28 bajtów

2→N
While mean(randInt(1,6,N)-3.5
Disp N
N+2→N
End

Wyjaśnienie

  • randInt(1,6,N) generuje listę N liczb losowych od 1 do 6
  • mean(randInt(1,6,N)-3.5 zostaje obniżona średnia z rzutów o 3,5
  • While trwa do momentu, aż średnie wyrażenie wyniesie zero (najbardziej prawdopodobna suma)
andrewarchi
źródło
5

R , 49 bajtów

n=2
while(sum(sample(6,n,T)-3.5)){print(n)
n=n+2}

sample(6,n,T)generuje n(pseudo) losowe próbki z zakresu 1:6z zamiennikiem. Odejmowanie 3,5 od każdego elementu daje wynik, który sumwynosi 0 (falsey) wtedy i tylko wtedy, gdy jest to najczęstsza wartość.

Wypróbuj online!

Pomija rzuty nieparzystymi kośćmi.

Giuseppe
źródło
Wydaje mi się, że daje to 80 za każdym razem, możliwy błąd?
zoecarver
@pudility możesz dodać spacje na końcu, aby spróbować ponownie; za każdym razem buforuje fragment kodu wejściowego / kodu
Giuseppe,
3
@Giuseppe Możesz wyłączyć pamięć podręczną w TIO w Ustawieniach.
xnor
po wyłączeniu pamięci podręcznej, jak powiedział @xnor, działało to bardzo dobrze. Dziękuję za odpowiedź!
zoecarver
@xnor, który wiedział! Dobrze wiedzieć w przyszłości.
Giuseppe,
4

Java 8, 123 149 113 108 bajtów

()->{for(int n=0,s=1,i;s!=n*7;){for(i=s=++n*2;i-->0;s+=Math.random()*6);if(s!=n*7)System.out.println(n*2);}}

Lub 107 bajtów , jeśli używamy jak nieużywany parametr zamiast.Object null

+26 bajtów na usunięcie błędu, poprawnie wskazane przez @Jules w komentarzach.
-41 bajtów dzięki wspaniałemu myśleniu @ OliverGrégoire !

Wyjaśnienie:

Wypróbuj tutaj.

()->{                           // Method without parameter nor return-type
  for(int n=0,                  //  Amount of dice
          s=1,                  //  Sum
          i;                    //  Index
      s!=n*7;){                 //  Loop (1) as long as the sum doesn't equal `n`*7,
                                //  because we roll the dice per two, and 3.5*2=7
    for(i=s=++n*2;              //   Reset both the index and sum to `n`*2,
                                //   so we can use random 0-5, instead of 1-6
                                //   and we won't have to use `+1` at `Math.random()*6`
        i-->0;                  //   Inner loop (2) over the amount of dice
        s+=Math.random()*6      //    And increase the sum with their random results
    );                          //   End of inner loop (2)
    if(s!=n*7)                  //   If the sum doesn't equal `n`*7
      System.out.println(n*2);  //    Print the amount of dice for this iteration 
  }                             //  End of loop (1)
}                               // End of method
Kevin Cruijssen
źródło
1
Myślę, że w funkcji jest błąd. Jeśli rjest równy, 3.5*nprogram powinien zakończyć się bezpośrednio. Ale jeśli dobrze zrozumiem funkcję, wydrukuje się nostatni raz przed zakończeniem.
raznagul
@raznagul Właściwie to nie było drukowanie dodatkowego czasu. To było jednak błędne. To, co robił wcześniej: losowy 1-12 (błąd 1: powinien być 2-12); sprawdź, czy jest to 7: jeśli tak: skończymy bez drukowania; jeśli tak nie jest: rzuć 2 kośćmi ponownie (błąd 2, powinno być 4 kości zamiast 2 ponownie); następnie wydrukuj 2 i podbij no 2. Więc zawierał dwa błędy (1-12 zamiast 2-12; i rzucanie kostkami jak 2 -> 2 -> 4 -> 6 -> ..., zamiast 2 -> 4 -> 6 -> ...). Jednak drukował poprawnie, ponieważ nie poszedłby, System.out.println(n),n+=2gdyby rbył rzeczywiście równy 3.5*n.
Kevin Cruijssen
2
„Rzuć dwiema kostkami jednocześnie, wybierając losową liczbę z przedziału 2-12” - nie jest to probabilistycznie równoważne z rzuceniem dwiema kostkami i dodaniem liczb zgodnie z wymaganiami w pytaniu, dlatego nie jest poprawnym rozwiązaniem.
Jules
1
Krótszy o kilka bajtów (113), ale prawdopodobnie nadal golfable: ()->{for(int n=2,s=0,e=7,i;s!=e;n+=2,e+=7){for(i=n,s=n;i-->0;)s+=Math.random()*6;if(s!=e)System.out.println(n);}}. Popraw także w odniesieniu do komentarza Julesa i mojego wyjaśnienia. njest kostką, sjest sumą, eoczekuje się, ijest indeksem. Wreszcie, suma zaczyna się od, naby uniknąć +1, nrazy i s!=ejest powtarzana, ponieważ po prostu nie wiem, jak uniknąć tego przypadku.
Olivier Grégoire
1
Grałem jeszcze trochę;)()->{for(int i=0,s=1,j;s!=i*7;){for(j=s=++i*2;j-->0;)s+=Math.random()*6;if(s!=i*7)System.out.println(i*2);}}
Olivier Grégoire
3

05AB1E , 22 20 bajtów

-2 bajty dzięki Emignie

[YF6L.RO}7Y*;ïQ#Y=ÌV

Wypróbuj online!

Wyjaśnienie

[YF6L.RO}7Y*;ïQ#Y=ÌV
[                    # Infinite loop start
 YF     }            # Y times... (Y defaults to 2)
   6L.R               # Push a random number between 1 and 6 (why does this have to be so looooong ._.)
       O              # Sum
         7Y*;ï       # Push 3.5 * Y as an int
              Q      # Is it equal to 3.5 * Y?
               #     # If so: Quit
                Y    # Push Y
                 =   # Print without popping
                  ÌV # Set Y to Y + 2
Datboi
źródło
1
Jeśli przesuniesz Opo .Rmożna usunąć )i s.
Emigna
3

R, 48 44 42 bajtów

5-bajtowa poprawa odpowiedzi Giuseppe .

while(sum(sample(6,F<-F+2,1)-3.5))print(F)

To (ab) wykorzystuje fakt, że Fjest to zmienna domyślnie przypisana, do FALSEktórej wymusza się 0i może być następnie zwiększana, co oszczędza nam potrzeby inicjalizacji zmiennej przeciwnej.

rturnbull
źródło
1
oczywiście możesz zaoszczędzić dwa bajty dzwoniąc sample(6)zamiast, sample(1:6)ale wykreślono 44 to wciąż 44 .... codegolf.stackexchange.com/a/82343/67312
Giuseppe
@Giuseppe Oczywiście, dziękuję! Zredagowałem odpowiedź teraz.
rturnbull
2

PHP , 75 bajtów

for($d=2;(++$i*7/2-$r+=rand(1,6))||$i<$d;)$i%$d?:$d+=1+print"$d
".$r=$i="";

Wypróbuj online!

Jörg Hülsermann
źródło
1
5^2/++$i*$d+=rand()%6jest nieco krótszym warunkiem dla pętli. Wydaje mi się również, że bieżąca pętla niepoprawnie wychodzi z gry, jeśli pierwsza rzucona „kostka” ma wartość „1” (generuje 0 na początku $d).
user59178,
@ user59178 Fajny pomysł, ale może to być błąd dzielenia przez zero, więc muszę go zmodyfikować. Masz rację, moje rozwiązanie przed zatrzymaniem się w tym przypadku, co jest złe.
Jörg Hülsermann
Twoja 45-bajtowa odpowiedź jest nieprawidłowa, ponieważ wynikowy rozkład nie jest taki sam jak w pytaniu, zobacz tutaj . Myślę, że twoja 42-bajtowa odpowiedź używa niewłaściwej dystrybucji; wydaje się na przykład zakładać, że dla dwóch kości równie prawdopodobne jest, że suma ma 2 i 7.
@ Pak Tak Tak 45-bajtowa odpowiedź jest nieprawidłowa. Myślę, że twoje myślenie jest fałszywe, co dzieje się w 42-bajtowej wersji. Zobacz rozszerzoną wersję Wypróbuj online!
Jörg Hülsermann
@ JörgHülsermann Ta rozszerzona wersja potwierdza to, co mówię. W prawidłowej implementacji wartość $ r / $ i powinna być bliższa wartości 3,5 dla większych wartości $ i, ale nie widzę, aby tak się działo. Dostałem średnio 1,16 za 9984 kości, co jest statystycznie niezwykle mało prawdopodobne.
1

Mathematica, 47 bajtów

For[n=1,Tr@RandomInteger[5,2n++]!=5n,Print[2n]]

-5 bajtów z LLlAMnYP

J42161217
źródło
1

05AB1E , 17 bajtów

[N·ÌD6Lã.R7;-O_#,

Wypróbuj online!

Wyjaśnienie

[                   # loop over N in 0...
 N·Ì                # push N*2+2
    D               # duplicate
     6L             # push range [1 ... 6]
       ã            # cartesian product (combinations of N*2+2 elements in range)
        .R          # pick one at random
          7;-       # subtract 3.5 from each dice roll
             O_#    # if sum == 0 exit loop
                ,   # otherwise print the copy of N*2+2
Emigna
źródło
1

Partia, 109 bajtów

@set/an=%1+2,s=n*5/2
@for /l %%i in (1,1,%n%)do @call set/as-=%%random%%%%%%6
@if %s% neq 0 echo %n%&%0 %n%

Raczej denerwująco randomjest magiczną zmienną środowiskową, więc zastępuje ją ona losową wartością podczas ekspansji środowiska, co zwykle dzieje się przed uruchomieniem pętli for. callsprawia, że ​​dzieje się to za każdym razem przez pętlę, ale następnie należy podwoić %znaki, aby zapobiec rozszerzeniu przed pętlą. Zabawa zaczyna się, ponieważ chcemy modulować wynik o 6, co wymaga prawdziwego %znaku, który teraz należy podwoić dwukrotnie. Wynik to sześć kolejnych %sekund.

Neil
źródło
1

JavaScript (ES2015), 75 78 bajtów

f=(n=2)=>[...Array(n)].reduce(a=>a+Math.random()*6|0,n)==3.5*n?'':n+`
`+f(n+2)

Wysyła ciąg wyników oddzielonych znakami nowej linii

Edycja: zapisano bajt dzięki Shaggy, dodano 4 bajty, aby uruchomić funkcję o 2

Wyjaśnienie

f=n=>
  [...Array(n)]                // Array of size n
    .reduce(                   // Combine each item
      a=>a+Math.random()*6|0,  // Add a random roll between 0 and 5 for each item
    n)                         // Start at n to correct rolls to between 1 and 6
    ==3.5*n                    // Compare total to most probable roll total
  ? ''                         // If true, end
  : n+'\n'+f(n+2)              // Otherwise, output n and continue

f=(n=2)=>[...Array(n)].reduce(a=>a+Math.random()*6|0,n)==3.5*n?'':n+`
`+f(n+2)

let roll = _ => document.getElementById('rolls').innerHTML = f();
document.getElementById('roll-button').onclick = roll;
roll();
<button id="roll-button">Roll</button>
<pre id="rolls"></pre>

andrewarchi
źródło
2
Zaoszczędź bajty, używając dosłownie nowej linii zamkniętej w backticks zamiast '\n'.
Shaggy
Nie zaczyna się od n=2, zamiast tego musisz podać początkową liczbę kości, gdy funkcja jest wywoływana.
MT0,
1

php - 89 znaków

$r=0;$n=2;while($r!=$n*3.5){$r=$i=0;while($i<$n){$r+=rand(1,6);$i++;}print $n."
";$n+=2;}
azyl
źródło
nie trzeba pierwszego $r=0;użycia echozamiast print $n."pisać jako "$ni dla pętli zamiast, podczas gdy pozwala zrobić coś w pętli po lub wcześniej, aby zaoszczędzić trochę bajtów
Jörg Hülsermann
1

C (gcc) , 84 80 79 77 75 80 78 76 bajtów

i;f(s,j){for(;s;s?printf("%d\n",i):0)for(j=i+=2,s=i*7/2;j--;)s-=1+rand()%6;}

Wypróbuj online!

cleblanc
źródło
1

Haskell 133 132 bajty

import System.Random;import Control.Monad
s k=do n<-replicateM k$randomRIO(1,6);if sum n==7*div k 2 then pure()else do print k;s(k+2)

Podziękowania dla @Laikoni za sugestie w komentarzach poniżej.

Davide Spataro
źródło
1.) Import powinien być liczony w liczbie bajtów. 2.) return()mogą być skracane pure()i putStrLn$showmogą być skracane print.
Laikoni
Naprawię to od razu. Dzięki
Davide Spataro,
Kilka innych drobiazgów: div k 2 thenmoże być div k 2theni do print k;s(k+2)jest print k>>s(k+2).
Laikoni
1

Oktawa 55 bajtów

n=2;
while mean(randi(6,n,1))-3.5!=0
n
n=n+2;
end

Zainspirowany odpowiedzią Andrewarchiego. Jeśli ktoś ma jakieś wskazówki, aby go nawet skrócić, są mile widziane.

Michthan
źródło
Wow, TI-BASIC i Octave mają zaskakująco podobne składnie
andrewarchi
@andrewarchi Octave (używam wersji online) to tylko podstawy podstaw programowania.
Michthan
1

Pyth , 20 bajtów

K2WnsmhO6K*K3.5K=+K2

Wypróbuj online!

qwertz
źródło
Witamy w PPCG!
Martin Ender
Dzięki! Właśnie skończyłem samouczek Pyth i pomyślałem, że mogę spróbować, chociaż prawdopodobnie nadal można go poprawić. Wszelkie sugestie są mile widziane.
qwertz
0

QBIC , 40 bajtów

{[1,r|g=g+_r1,6|]~g=r*3.5|_X\g=0?r┘r=r+2

Ta postawa dosłownie robi to, o co prosi wyzwanie; wydaje się najkrótszą drogą do prawidłowej dystrybucji.

Wyjaśnienie

{          DO infinitely
[1,r|      FOR a=1, a<=r (at start, r == 2), a++
g=g+       Add to g (0 at start)
  _r1,6|   a random number between 1 and 6 incl.
]          NEXT
~g=r*3.5   IF the result of all dice rolls equals the expected value
|_X        THEN quit
\g=0       ELSE, reset the dice total
?r┘        PRINT the number of dice used
r=r+2      and add 2 dice.
           END IF and LOOP are courtiously provided by QBIC at EOF.
Steenbergh
źródło
0

JavaScript (ES6) - 69 znaków

r=n=>n?r(n-1)+(Math.random()*6|0)-2.5:0;f=(n=2)=>r(n)?n+`
`+f(n+2):""

console.log(f())

Objaśnienie :

r=n=>                                     # Roll n dice
     n?                                   # If there is a dice left to roll
       r(n-1)                             #   Roll n-1 dice
             +(Math.random()*6|0)         #   Add a random number from 0 .. 5
                                 -2.5     #   Subtract 2.5 so sum of average is 0
                                     :0   # Else total is 0

i:

f=(n=2)=>                                 # Start with n = 2
         r(n)                             # Roll n dice
             ?n+"\n"+f(n+2)               # If non-zero then concatenate n, newline and
                                          #    result for n+2 dice
                           :""            # If zero (average) terminate.
MT0
źródło
0

Oblicz2 0,7, 119 118 111 bajtów

using"runtime";for(n=2,d=0;d!=3.5*n;Console.WriteLine(n),n+=2)for(i=d=0;i++<n;)d+=Math.Int(Random().Next(1,7));

bez golfa:

using "runtime";
var d = 0;
var r = Random();
for(var n = 2; d != 3.5 * n; Console.WriteLine(n), n += 2)
{
    d = 0;
    for(var i = 0; i < n; i++)
        d += Math.Int(r.Next(1,7));
}

Mógłbym obejść się bez Math.Int (), ale niestety w 0.7 funkcje Random (). Next () mają błąd, w którym wszystkie zwracają podwójne zamiast ints. Zostało to naprawione, ale dopiero po opublikowaniu tego pytania. Nic nie wygram, ale hej, niezły dowód koncepcji.

Edytować:

  • usunięto niepotrzebne miejsce między używaniem a „środowiskiem wykonawczym” (-1 bajt)

Edycja2:

  • usunięto var r i utwórz nowy Losowo tam, gdzie jest potrzebny (-4 bajty)

  • zmieniono i = 0, d = 0 na i = d = 0 (-2 bajty)

  • inkrementowane i po sprawdzeniu (-1 bajt)

hstde
źródło
0

Ruby , 52 bajty

s=x=2;(s=0;p x.times{s+=rand(6)-2.5};x+=2)while s!=0

Wyjaśnienie

s=x=2;                                                # sum=2, x=2
      (                                  )while s!=0  # while sum != 0:
       s=0;                                           #  reset the sum
           p                                          #  print
             x.times{              };                 #  repeat x times:
                     s+=                              #   Add to sum:
                        rand(6)                       #    random int in 0..5
                               -2.5                   #    subtract average
                                                      #  (implicitly return x for printing)
                                     x+=2             #  Increment x by 2

Wypróbuj online!

Wartość tuszu
źródło
@ Pakak zwróć uwagę s=0na przód pętli i użycie x.times. Oznacza to, że suma jest resetowana za każdym razem, a następnie xrzucane są kości, co powinno mieć prawidłowy rozkład. Napiszę wyjaśnienie mojego kodu.
Wartość tuszu
Masz rację, moje wnioski były zbyt szybkie.
0

JavaScript, 87 znaków

for(n=2;eval('+'.repeat(n).replace(/./g,x=>x+(Math.random()*6|0)))!=2.5*n;n+=2)alert(n)

Test ze console.logzamiast alert:

for(n=2;eval('+'.repeat(n).replace(/./g,x=>x+(Math.random()*6|0)))!=2.5*n;n+=2)console.log(n)
console.log('Done')

Qwertiy
źródło
0

lua, 102 bajty

function r(n,t) for d=1,n do t=t+math.random(1,6)end return t==n*3.5 or print(n)or r(n+2,0)end r(2,0)

Lub bardziej czytelna wersja

function r(n,t) --recursive function does its magic, t is given to safe usage bytes(no local)
    for d=1,n do --roll n dice and count them up to the total (t)
         t =t+math.random(1,6)
    end 
    return t==n*3.5 or --check if t==n*3.5. If it is then it ends
           print(n) or --t != n*3.5 thus print n. print returns nil
           r(n+2,0) --both the check and the return value from print are false thus r gets executed.
end 
r(2,0) --start the process

Bardziej cheatyczna wersja na 96 bajtów

function r(n,t,m)t=t+m(1,6)+m(1,6)return t==n*3.5 or print(n)or r(n+2,t,m)end r(2,0,math.random)

To działa prawie tak samo jak pierwsze, ale ponownie wykorzystuje rzutki z wcześniejszych połączeń. Z tego powodu mogę usunąć pętlę for. Oba są testowane w lua 5.2

soczewki
źródło
0

Perl 6 , 48 bajtów

.say for 2,*+2...^{3.5*$_==sum (1..6).pick xx$_}
Sean
źródło
-1

PHP, 51 bajtów

$r=2;$n=2;while(rand(0,6)-2.5*$r){print $n;$n=$n+2;}
Shiva
źródło
Jeśli twój wynik to zawsze 2, to nie jest poprawna odpowiedź ...
Jeśli wydrukujemy $ n wewnątrz podczas pętli, to wypisze następujące: 2,4,6,8,10 .....
Shiva
2
Nadal nie rozumiem, w jaki sposób spełnia to wymagania zawarte w pytaniu. Używasz dwóch zmiennych: „$ n” i „n”. „n” jest niezdefiniowane, więc będzie ustawione na zero. Tak skutecznie robisz, drukując liczbę parzystą, i masz szansę na wydruk 5/6 następnego numeru parzystego. To matematycznie nie jest równoważne rozkładowi w pytaniu.
Literówka, że ​​n powinno zawsze wynosić 2, zaktualizowało kod.
Shiva
Nadal nie to, o co pyta ... Teraz rzucasz kością, sprawdź, czy jest ona pięć (= 2 * 2,5); jeśli kostka ma pięć, zatrzymujesz się, a jeśli nie jest to pięć, zapisujesz następną liczbę parzystą i kontynuujesz. Matematycznie efektywnie to samo, co w poprzedniej wersji kodu.