Bạn có thể lăn bao nhiêu con xúc xắc mà không cần lăn số có thể xảy ra nhất


26

Vấn đề

Bắt đầu từ n=2súc sắc:

  • Lăn nxúc xắc, với mỗi số 1 đến 6 có khả năng như nhau trên mỗi lần chết.
  • Kiểm tra xem tổng của chúng có bằng tổng có thể xảy ra nhất đối với nsúc sắc không, nghĩa là 3.5*n.
    • Nếu chúng bằng nhau, chấm dứt.
    • Mặt khác, in nvà lặp lại từ đầu với n+2xúc xắc

Mã của bạn không phải thực hiện thủ tục này một cách chính xác, nhưng sẽ cho đầu ra ngẫu nhiên có xác suất tương đương với nó, dựa trên định nghĩa về tính ngẫu nhiên của chúng tôi .

Chương trình của bạn sẽ xuất tất cả các số trên dòng riêng của chúng; ví dụ: nếu chương trình có tới 8 con xúc xắc và tung ra con số có thể xảy ra nhất với 8 con xúc xắc, đầu ra sẽ là:

2
4
6

Chạy ví dụ

Trên 2 con xúc xắc, 7là tổng có thể xảy ra nhất. Hãy nói rằng các con số đã được 23. Sau đó, bạn sẽ in 2.

Trên 4 con xúc xắc, 14là tổng có thể xảy ra nhất. Hãy nói rằng những con số cán là 3, 4, 2, và 5. Sau đó, tổng là 14, vì vậy chương trình sẽ chấm dứt ở đây.

Đầu ra cuối cùng trong trường hợp này là "2".

Quy tắc


Câu trả lời này, vì nó đứng, rất không rõ ràng. Có đầu vào, hoặc nó có nghĩa là để tạo đầu ra từ không có đầu vào như một vòng lặp? Có sự ngẫu nhiên nào không? Tôi dường như không thấy bất kỳ sự ngẫu nhiên liên quan.
HyperNeutrino

Nhân tiện, chào mừng bạn đến với PPCG! :)
HyperNeutrino

Cảm ơn bạn, xin lỗi tôi rất mới với điều này. Điều gì sẽ làm cho nó rõ ràng hơn? Không có đầu vào, bạn phải bắt đầu với một lần chết và làm việc theo cách của bạn lên cao nhất có thể.
zoecarver

@pudility Vì vậy, nếu tôi hiểu chính xác, tôi có nên tiếp tục xuất ra 2, 4, 6, 8, ...một cuộn nhiều xúc xắc mỗi lần cho đến khi tôi đạt được con số có thể xảy ra nhất cho lần lặp đó không?
HyperNeutrino

5
Cảm ơn bạn đã dành thời gian để chỉnh sửa thử thách của bạn dựa trên phản hồi của chúng tôi! Đối với hồ sơ, chúng tôi có một nơi mà bạn có thể đăng các thử thách để tìm ra một số chi tiết trước khi đăng: hộp cát .
FryAmTheEggman

Câu trả lời:


17

Python 2 , 70 byte

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

Hãy thử trực tuyến!

Mẹo nhỏ là tính tổng bằng cách nhập evalmột chuỗi trông giống như

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

với các nbản sao của biểu thức được nối. Các randrange(6)đầu ra một số ngẫu nhiên từ [0,1,2,3,4,5], được chuyển xuống 2.5để có trung bình 0. Khi tổng nếu 0, whileđiều kiện không thành công và vòng lặp chấm dứt.

Một thay thế sử dụng mapdài hơn 4 byte:

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

Tôi đã tìm thấy một loạt các biểu thức có độ dài bằng nhau cho một con súc sắc chuyển sang có nghĩa là không, nhưng không có biểu thức nào ngắn hơn

randrange(6)-2.5
randint(0,5)-2.5
randrange(6)*2-5
uniform(-3,3)//1

11
Tôi thích cái này! Chủ yếu là vì đó là người duy nhất tôi hiểu.
zoecarver

7

MATL , 13 byte

`@E6y&Yrs@7*-

Hãy thử trực tuyến!

Giải trình

`       % 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)

6

Thạch ,  19  14 byte

-5 byte với sự trợ giúp từ Leaky Nun (chuyển từ đếm lên sang đệ quy)

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

Một chương trình đầy đủ in các kết quả được phân tách bằng các dòng mới (một không gian thêm và dòng mới cũng được in và các lỗi chương trình ở cuối).

Hãy thử trực tuyến! - bất cứ khi nào 6 con xúc xắc bị vượt qua TIO sẽ giết chết điều này do sử dụng bộ nhớ, nhưng nó hoạt động trên nguyên tắc - cũng mất ~ 40 giây để làm như vậy.

Một phiên bản 15 byte thân thiện hơn, không mất nhiều thời gian hoặc đòi hỏi nhiều bộ nhớ có sẵn ở đây .

Làm sao?

Đệ quy cuộn thêm 2 viên xúc xắc cho đến khi tổng số các mặt được giảm 3,5 bằng 0, in số xúc xắc khi nó đi, khi đạt đến số 0, nó cố gắng sử dụng ký tự khoảng trắng gây ra lỗi loại.

‘‘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)

Wow, đó là rất ít byte. Làm tốt! Tôi không thể chấp nhận nó cho đến khi có thêm vài người trả lời.
zoecarver

Vâng, bình thường phải đợi khá lâu trước khi chấp nhận, ngay cả khi đã từng làm như vậy. Nhiều người cho nó một hoặc hai tuần.
Jonathan Allan

Ngoài ra, bạn phải xuất ra tất cả các lần lặp - không chỉ lần lặp cuối cùng.
zoecarver

Ồ, tôi đã trả lời một chỉnh sửa cũ - điều đó hoàn toàn thay đổi nó, tôi không thể sử dụng phương pháp này theo nhiều cách.
Jonathan Allan

Oh chờ chỉ ns, OK có thể nó có thể cứu được. Tôi nghĩ bạn có nghĩa là các khoản tiền :)
Jonathan Allan

6

TI-BASIC, 28 byte

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

Giải trình

  • randInt(1,6,N) tạo danh sách N số ngẫu nhiên từ 1 đến 6
  • mean(randInt(1,6,N)-3.5 lấy trung bình của các cuộn giảm xuống 3,5
  • While tiếp tục cho đến khi biểu thức trung bình bằng 0 (tổng có thể xảy ra nhất)

5

R , 49 byte

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

sample(6,n,T)tạo ncác mẫu ngẫu nhiên (giả) từ phạm vi 1:6có thay thế. Trừ 3,5 từ mỗi phần tử mang lại kết quả có sum0 (falsey) khi và chỉ khi đó là giá trị phổ biến nhất.

Hãy thử trực tuyến!

Bỏ qua các cuộn xúc xắc lẻ.


Điều này dường như đầu ra 80 mỗi lần cho tôi, lỗi có thể?
zoecarver

@pudility bạn có thể thêm khoảng trắng ở cuối để thử lại; nó lưu bộ đệm đầu vào / đoạn mã mỗi lần
Giuseppe

3
@Giuseppe Bạn có thể tắt bộ đệm trong TIO trong Cài đặt.
xnor

Sau khi tôi tắt bộ đệm như @xnor nói, Nó hoạt động rất tốt. Cảm ơn câu trả lời!
zoecarver

@xnor ai biết! Tốt để biết trong tương lai.
Giuseppe

4

Java 8, 123 149 113 108 byte

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

Hoặc 107 byte nếu chúng ta sử dụng một Object nulltham số không sử dụng thay thế.

+26 byte cho một sửa lỗi, được chỉ ra chính xác bởi @Jules trong các bình luận.
-41 byte nhờ vào suy nghĩ tuyệt vời của @ OliverGrégoire !

Giải trình:

Hãy thử nó ở đây.

()->{                           // 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

1
Tôi nghĩ rằng có một lỗi trong chức năng. Nếu rbằng 3.5*nchương trình nên chấm dứt trực tiếp. Nhưng, nếu tôi hiểu đúng chức năng, nó sẽ in nlần cuối trước khi kết thúc.
raznagul

@raznagul Thật ra, nó không in thêm thời gian. Tuy nhiên, nó đã bị lỗi. Những gì nó đã làm trước đây: ngẫu nhiên 1-12 (lỗi 1: nên là 2-12); kiểm tra xem điều này có bằng 7 không: nếu đúng: chúng tôi đã hoàn thành mà không in; nếu không: cuộn 2 con xúc xắc một lần nữa (lỗi 2, đáng lẽ phải là 4 con xúc xắc thay vì 2 lần nữa); sau đó in 2 và tăng lên n2. Vì vậy, nó có chứa hai lỗi (1-12 thay vì 2-12; và gieo xúc xắc như 2 -> 2 -> 4 -> 6 -> ..., thay vì 2 -> 4 -> 6 -> ...). Tuy nhiên, nó đã được in một cách chính xác, bởi vì nó sẽ không thực sự System.out.println(n),n+=2nếu rnó thực sự bằng 3.5*n.
Kevin Cruijssen

2
"Lăn hai con xúc xắc cùng một lúc, bằng cách chọn một số ngẫu nhiên từ 2-12" - điều này không tương đương với việc gieo hai con xúc xắc và thêm các số theo yêu cầu trong câu hỏi, do đó không phải là một giải pháp chính xác.
Jules

1
Ngắn hơn một vài byte (113), nhưng có lẽ vẫn có thể chơi được : ()->{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);}}. Ngoài ra, chính xác liên quan đến nhận xét của Jules và lời giải thích của tôi. nlà súc sắc, slà tổng, eđược dự kiến, ilà chỉ số. Cuối cùng, tổng bắt đầu bằng ncách tránh a +1, nlần và s!=eđược lặp lại vì tôi không biết cách tránh trường hợp đó.
Olivier Grégoire

1
Tôi đã đánh gôn một lần nữa;)()->{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 byte

-2 byte nhờ Emigna

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

Hãy thử trực tuyến!

Giải trình

[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

1
Nếu bạn di chuyển Osau khi .Rbạn có thể loại bỏ )s.
Emigna

3

R, 48 44 42 byte

Một cải tiến 5 byte cho câu trả lời của Giuseppe .

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

(Ab) này sử dụng thực tế Flà một biến theo mặc định được gán cho FALSEép buộc 0và sau đó có thể được tăng lên, tiết kiệm cho chúng tôi nhu cầu khởi tạo biến đếm.


1
tất nhiên, bạn có thể lưu hai byte bằng cách gọi sample(6)thay vì sample(1:6)bỏ qua 44 vẫn là 44 .... codegolf.stackexchange.com/a/82343/67312
Giuseppe

@Giuseppe Tất nhiên, cảm ơn! Tôi đã chỉnh sửa câu trả lời ngay bây giờ.
rturnbull

2

PHP , 75 byte

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

Hãy thử trực tuyến!


1
5^2/++$i*$d+=rand()%6là một điều kiện ngắn hơn một chút cho vòng lặp. Ngoài ra, tôi nghĩ rằng vòng lặp hiện tại thoát không chính xác nếu "con xúc xắc" đầu tiên được cuộn là "1" (nó tạo ra 0 cho lần đầu tiên $d).
dùng59178

@ user59178 Ý tưởng hay nhưng nó có thể bị chia cho lỗi không nên tôi phải sửa đổi nó. Bạn đúng giải pháp của tôi trước khi dừng lại trong trường hợp này là sai.
Jorg Hülsermann

Câu trả lời 45 byte của bạn không hợp lệ vì phân phối kết quả không giống như trong câu hỏi, xem tại đây . Câu trả lời 42 byte của bạn, tôi nghĩ, cũng sử dụng phân phối sai; có vẻ như giả sử rằng đối với hai con xúc xắc, có khả năng có 2 và 7 là tổng bằng nhau.

@Pakk Có câu trả lời 45 Byte không hợp lệ. Tôi nghĩ rằng suy nghĩ của bạn là sai những gì xảy ra ở Phiên bản 42 Byte. Nhìn vào phiên bản mở rộng Hãy thử trực tuyến!
Jörg Hülsermann

@ JörgHülsermann Phiên bản mở rộng đó xác nhận những gì tôi nói. Trong một triển khai đúng đắn, giá trị của $ r / $ i sẽ trở nên gần hơn với 3,5 đối với các giá trị lớn hơn của $ i, nhưng tôi không thấy điều đó xảy ra. Tôi nhận được trung bình 1,16 cho xúc xắc 9984, đó là con số thống kê cực kỳ khó xảy ra.


1

Toán học, 47 byte

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

-5 byte từ LLlAMnYP


1

05AB1E , 17 byte

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

Hãy thử trực tuyến!

Giải trình

[                   # 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

1

Mẻ, 109 byte

@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%

Khá khó chịu, randomlà một biến môi trường ma thuật, vì vậy nó chỉ được thay thế bằng một giá trị ngẫu nhiên trong quá trình mở rộng môi trường, điều này thường xảy ra trước khi vòng lặp for bắt đầu. calllàm cho nó xảy ra mỗi lần qua vòng lặp, nhưng sau đó bạn cần tăng gấp đôi các %dấu hiệu để ngăn chặn sự mở rộng xảy ra trước vòng lặp. Cuộc vui bắt đầu bởi vì chúng tôi muốn điều chỉnh kết quả bằng 6, yêu cầu một %dấu hiệu thực , giờ đây phải được nhân đôi hai lần. Kết quả là sáu %s liên tiếp .


1

JavaScript (ES2015), 75 78 byte

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

Xuất ra một chuỗi kết quả được phân tách bằng dòng mới

Chỉnh sửa: đã lưu một byte nhờ Shaggy, thêm 4 byte để bắt đầu chức năng ở 2

Giải trình

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>


2
Lưu một byte bằng cách sử dụng một dòng mới theo nghĩa đen được bao trong backticks, thay vì '\n'.
Xù xì

Điều này không bắt đầu bằng n=2, thay vào đó bạn phải chỉ định số xúc xắc bắt đầu khi hàm được gọi.
MT0

1

php - 89 ký tự

$r=0;$n=2;while($r!=$n*3.5){$r=$i=0;while($i<$n){$r+=rand(1,6);$i++;}print $n."
";$n+=2;}

bạn không cần phải $r=0;sử dụng lần đầu echothay vì print $n."có thể viết "$nvà thay vì vòng lặp thay vì cho phép thực hiện điều gì đó trong vòng lặp sau hoặc trước để lưu một số byte
Jörg Hülsermann


1

Haskell 133 132 byte

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)

Tín dụng cho @Laikoni cho các đề xuất trong các ý kiến ​​dưới đây.


1.) Nhập khẩu nên được tính trong số byte. 2.) return()có thể rút ngắn pure()putStrLn$showcó thể rút ngắn thành print.
Laikoni

Tôi sẽ sửa nó ngay. Cảm ơn
Davide Spataro

Một số điều nhỏ hơn nữa: div k 2 thencó thể div k 2thendo print k;s(k+2)print k>>s(k+2).
Laikoni

1

Octave 55 byte

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

Lấy cảm hứng từ câu trả lời của Andrewarchi. Nếu ai đó có bất kỳ con trỏ nào để rút ngắn nó, họ đều được chào đón.


Wow, TI-BASIC và Octave có cú pháp tương tự đáng ngạc nhiên
andrewarchi

@andrewarchi Octave (phiên bản trực tuyến là những gì tôi sử dụng) chỉ là những điều cơ bản của những điều cơ bản khi nói đến lập trình.
Michthan


0

QBIC , 40 byte

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

Điều này thực sự rất nhiều những gì thách thức yêu cầu; dường như cách ngắn nhất để có được sự phân phối đúng

Giải trình

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


0

JavaScript (ES6) - 69 ký tự

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())

Giải thích :

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

và:

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.

0

Calc2 0,7, 119 118 111 byte

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

vô dụng:

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

Tôi có thể làm mà không cần Math.Int () nhưng thật không may trong 0,7 các hàm Random (). Next () có một lỗi trong đó tất cả chúng đều trả về gấp đôi thay vì ints. Nó đã được sửa nhưng chỉ sau khi câu hỏi này được đăng. Tôi sẽ không giành được bất cứ điều gì, nhưng hey, bằng chứng tốt đẹp của khái niệm.

Chỉnh sửa:

  • đã loại bỏ không gian không cần thiết giữa việc sử dụng và "thời gian chạy" (-1 byte)

Chỉnh sửa2:

  • đã xóa var r và tạo một Random mới khi cần (-4 byte)

  • đã thay đổi i = 0, d = 0 thành i = d = 0 (-2 byte)

  • tăng i sau khi kiểm tra (-1 byte)


0

Ruby , 52 byte

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

Giải trình

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

Hãy thử trực tuyến!


@Pakk lưu ý s=0ở phía trước của vòng lặp và việc sử dụng x.times. Điều này có nghĩa là tổng được đặt lại mỗi lần và sau đó xxúc xắc được tung ra, đây phải là phân phối chính xác. Tôi sẽ viết lên một lời giải thích về mã của tôi.
Mực giá trị

Bạn đã đúng, tôi đã quá nhanh với kết luận của mình.

0

Javascript, 87 ký tự

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

Kiểm tra với console.logthay vì 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')


0

lua, 102 byte

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)

Hoặc phiên bản dễ đọc hơn

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

Một phiên bản gian lận hơn cho 96 byte

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)

Điều này khá nhiều hoạt động tương tự như lần đầu tiên nhưng sử dụng lại các cuộn từ các cuộc gọi trước đó. Vì điều này tôi có thể loại bỏ vòng lặp for. Cả hai đều được thử nghiệm trong lua 5.2



-1

PHP, 51 byte

$r=2;$n=2;while(rand(0,6)-2.5*$r){print $n;$n=$n+2;}

Nếu đầu ra của bạn luôn là 2, thì đây không phải là câu trả lời hợp lệ ...

Nếu chúng ta in $ n bên trong vòng lặp while, thì nó sẽ in như sau: 2,4,6,8,10 .....
Shiva

2
Tuy nhiên, tôi không thấy làm thế nào điều này tuân theo các yêu cầu trong câu hỏi. Bạn sử dụng hai biến: "$ n" và "n". "n" không xác định, do đó sẽ được đặt thành không. Vì vậy, hiệu quả, những gì bạn làm là in một số chẵn và có cơ hội 5/6 in số chẵn tiếp theo. Đây là toán học không tương đương với phân phối trong câu hỏi.

Typo, n nên luôn luôn là 2, cập nhật mã.
Shiva

Vẫn không phải là những gì câu hỏi yêu cầu ... Bây giờ bạn đang ném một con súc sắc, kiểm tra xem nó có phải là năm (= 2 * 2.5) không; nếu chết là năm, bạn dừng lại và nếu không phải là năm, bạn viết số chẵn tiếp theo và tiếp tục. Về mặt toán học có hiệu quả tương tự như những gì bạn đã làm trong phiên bản trước của mã.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.