Lặp đi lặp lại súc sắc


12

Đưa ra một đầu vào ntrong đó 3 <= n <= 25, thực hiện các bước sau, bắt đầu bằng một nkhuôn mặt đơn (các mặt trong phạm vi [1, n], bao gồm):

  1. In kết quả của việc ngieo xúc xắc có mặt hiện tại trong trò chơi, dưới dạng kdn: X(nơi Xlà kết quả và klà số xúc xắc đang chơi).
  2. Nếu Xlớn hơn hoặc bằng n/2số lần xúc xắc đang chơi, hãy thêm một con súc sắc. Khác, loại bỏ một chết.
  3. Nếu số lượng xúc xắc trong trò chơi bằng 0hoặc n, dừng lại. Khác, đi đến bước 1.

Ví dụ chạy (lưu ý rằng đầu ra trong ngoặc là để giải thích và không bắt buộc):

6 mặt:

1d6: 4 (avg: 3.0, add)
2d6: 6 (avg: 6.0, add)
3d6: 9 (avg: 9.0, add)
4d6: 16 (avg: 12.0, add)
5d6: 13 (avg: 15.0, remove)
4d6: 9 (avg: 12.0, remove)
3d6: 5 (avg: 9.0, remove)
2d6: 7 (avg: 6.0, add)
3d6: 11 (avg: 9.0, add)
4d6: 14 (avg: 12.0, add)
5d6: 17 (avg: 15.0, add)

9 mặt:

1d9: 7 (avg: 4.5, add)
2d9: 14 (avg: 9.0, add)
3d9: 18 (avg: 13.5, add)
4d9: 18 (avg: 18.0, add)
5d9: 28 (avg: 22.5, add)
6d9: 26 (avg: 27.0, remove)
5d9: 28 (avg: 22.5, add)
6d9: 34 (avg: 27.0, add)
7d9: 33 (avg: 31.5, add)
8d9: 30 (avg: 36.0, remove)
7d9: 29 (avg: 31.5, remove)
6d9: 35 (avg: 27.0, add)
7d9: 32 (avg: 31.5, add)
8d9: 42 (avg: 36.0, add)

Quy tắc

  • Đầu ra phải chính xác theo định dạng kdn: X, với các dòng mới phân tách từng cuộn
  • Bạn thực sự phải mô phỏng nhiều con xúc xắc; chỉ cần trả về một số nguyên ngẫu nhiên trong phạm vi [1, n](đã bao gồm) nhân với số lượng xúc xắc hiện đang chơi không được phép, vì điều đó không mô phỏng chính xác việc gieo nhiều xúc xắc.
  • Sơ hở tiêu chuẩn bị cấm
  • Đây là , vì vậy câu trả lời ngắn nhất bằng byte sẽ thắng

Bảng xếp hạng

Đoạn trích Stack ở cuối bài này tạo ra bảng xếp hạng từ các câu trả lời a) dưới dạng danh sách các giải pháp ngắn nhất cho mỗi ngôn ngữ và b) dưới dạng bảng xếp hạng tổng thể.

Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:

## Language Name, N bytes

nơi Nlà kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh chúng qua. Ví dụ:

## Ruby, <s>104</s> <s>101</s> 96 bytes

Nếu ở đó bạn muốn bao gồm nhiều số trong tiêu đề của mình (ví dụ: vì điểm của bạn là tổng của hai tệp hoặc bạn muốn liệt kê riêng các hình phạt cờ phiên dịch), hãy đảm bảo rằng điểm thực tế là số cuối cùng trong tiêu đề:

## Perl, 43 + 2 (-p flag) = 45 bytes

Bạn cũng có thể đặt tên ngôn ngữ thành liên kết sau đó sẽ hiển thị trong đoạn trích:

## [><>](http://esolangs.org/wiki/Fish), 121 bytes


Tôi thấy điều này khó hiểu. Ví dụ câu trả lời?
Hipe99

Ví dụ trả lời , như các ví dụ là ngắn gọn.
Hipe99

Chỉnh sửa của bạn làm rõ. Cảm ơn!
Hipe99

16
Bạn có chắc chắn về số học của bạn? Một d6 thông thường có cuộn trung bình 3,5.
Peter Taylor

11
Tất cả trung bình trong các ví dụ của bạn có vẻ sai
edc65

Câu trả lời:



3

Toán học, 95 89 80 ký tự

For[k=1,0<k<#,If[Print[k,d,#,": ",x=Tr[{1,#}~RandomInteger~k]];x<k/2#,k--,k++]]&

Ung dung

For[
  k = 1,
  0 < k < #,
  If[
    Print[k, d, #, ": ", x = Tr[{1, #}~RandomInteger~k]];
    x < k/2 #,
    k--,
    k++
  ]
] &

1
@ MartinBüttner cảm ơn lời đề nghị của bạn. EchoThật không may, không thể có một chuỗi các đầu vào như thế Print.
shrx 7/12/2015

Oh, điểm tốt.
Martin Ender

3

PHP 164 121 112 113 109 byte

Phiên bản cuối cùng, tôi hứa. Cải thiện bằng cách sử dụng đề xuất của Titus:

function d($x,$y){for($i=$y;$i--;)$r+=rand(1,$x);echo$y."d$x: $r\n";$y+=$r/$y>$x/2?:-1;$y<$x&&$y?d($x,$y):0;}

EDIT: Đã thêm một byte để định dạng. Quên có một IF trong đó, nhờ bỏ văn bản "thêm / phụ", có thể là một toán tử tạm thời:

function d($x,$y){for($i=$y;$i--;)$r+=rand(1,$x);echo$y."d$x: $r\n";$r/$y>$x/2?$y++:$y--;if($y<$x&&$y)d($x,$y);}

Đầu ra bây giờ trông như:

1d6: 5
2d6: 11
3d6: 8
2d6: 11
3d6: 7
2d6: 4
1d6: 5

EDIT: Cảm ơn @Manatwork, đã cứu tôi rất nhiều! Phiên bản mới và hấp dẫn:

function d($x,$y){for($i=$y;$i--;)$r+=rand(1,$x);echo$y."d$x=$r\n";if($r/$y>$x/2)$y++;else$y--;if($y<$x&&$y){d($x,$y);}}

Mục trước:

function d($x,$y){for($i=0;$i<$y;$i++)($r+=rand(1,$x));$s=$y."d$x=$r, ";if($r/$y>$x/2){$y++;$s.="add";}else{$y--;$s.="sub";}echo $s."\n";if($y<$x&&$y>0){d($x,$y);}}`

Rolls riêng biệt, đầu ra này:

1d6=6, add
2d6=7, add
3d6=11, add
4d6=14, add
5d6=15, sub
4d6=15, add
5d6=18, add

Và nó được gọi như vậy: d(6, 1);

Là hiển thị AddSubhậu tố bắt buộc? Điều này không rõ ràng từ câu hỏi của bạn.


Yêu cầu nói rằng lưu ý rằng đầu ra trong ngoặc đơn là để giải thích và không bắt buộc. Cách này có vẻ ngắn hơn:function d($x,$y=1){for($i=$y;$i--;)$r+=rand(1,$x);echo$y."d$x, $r↵";$r/$y>$x/2?$y++:$y--;if($y<$x&&$y)d($x,$y);}
manatwork 7/12/2015

@manatwork Cảm ơn, bạn thực sự đã giúp rất nhiều!
steenbergh

Nếu vẫn có thể là một ternary, tiết kiệm một byte. Và tu sửa tăng / giảm có thể tiết kiệm hai byte:$y-=$r/$y>$x/2?:-1
Tít

2

Con trăn 3, 125

Đã lưu 3 byte nhờ DSM.

def x(d):
 import random;c=1
 while 0<c<d:r=sum(map(random.randint,[1]*c,[d]*c));print('%id%i: %i'%(c,d,r));c+=2*(r>=d*c/2)-1

Khá đơn giản, cuộn một loạt súc sắc và kiểm tra mức trung bình. Không có gì quá lạ mắt ở đây.
Nó cần được gọi với một int. Vì vậy, x(6)sẽ sản xuất một cái gì đó như thế này:

1d6: 5
2d6: 10
3d6: 8
2d6: 7
3d6: 11
4d6: 8
3d6: 13
4d6: 19
5d6: 13
4d6: 15
5d6: 22

.


2

JavaScript (ES6), 97 102 106 112 byte

Cảm ơn @ user81655 và @Jupotter đã tiết kiệm cho tôi một vài byte.

f=n=>{for(k=1;k%n;console.log(k+`d${n}: `+x),k+=x<k*n/2?-1:1)for(x=i=k;i--;)x+=Math.random()*n|0}

// 102 bytes:
f=n=>{for(k=1;k%n;console.log(k+`d${n}: `+x),k+=x<k*n/2?-1:1)for(x=i=0;++i<=k;)x+=1+Math.random()*n|0}

// Previous attempt, 112 bytes
f=n=>{k=1;while(k&&k!=n){for(x=i=0;i++<=k;)x+=1+~~(Math.random()*n);console.log(k+`d${n}: `+x);k+=x<k*n/2?-1:1}}

Bản giới thiệu

Điều này chỉ hoạt động trong các trình duyệt tuân thủ ES6 (tại thời điểm này bao gồm Firefox và Edge, có thể với Chrome và Opera có bật các tính năng JavaScript thử nghiệm):

f=n=>{for(k=1;k%n;console.log(k+`d${n}: `+x),k+=x<k*n/2?-1:1)for(x=i=k;i--;)x+=Math.random()*n|0}

// Snippet stuff
console.log = x => {
  document.getElementById('O').innerHTML += x + `<br>`;
}

document.getElementById('F').addEventListener('submit', e => {
  document.getElementById('O').innerHTML = ``
  f(document.getElementById('I').valueAsNumber)
})
<form id=F action=# method=get>
  <label>
    Number of faces: 
    <input type=number min=3 max=25 value=9 required id=I>
  </label>
  <button>Play</button>
  
  <div>
    <output id=O></output>
  </div>
</form>


Bạn có thể thay đổi whilethành một forvòng lặp, làm tròn xuống |0thay vì ~~()và di chuyển một vài câu lệnh để bạn có thể xóa dấu ngoặc để lưu một vài byte. Ngoài ra, bạn được phép biến nó thành một hàm ẩn danh (không f=). 103 byte:n=>{for(k=1;k&&k!=n;k+=x<k*n/2?-1:1)for(x=i=0;i++<=k;console.log(k+`d${n}: `+x))x+=1+Math.random()*n|0}
user81655 7/12/2015

@ user81655 Cảm ơn. Vì một số lý do, phiên bản của bạn tạo ra rất nhiều đầu ra không liên quan nên tôi đã chuyển console.logsang forvòng lặp khác (tốn hơn 1 char so với của bạn). Vẫn giảm xuống còn 106
rink.attguard.6 7/12/2015

Tôi chỉ viết nó lên mà không kiểm tra nó, vì vậy tôi rất vui vì nó chủ yếu hoạt động. :)
user81655 7/12/2015

Bạn có thể đạt được một ký tự bằng cách thay thế k&&k!=nđiều kiện bằng cách so sánhk%n!=0
Jupotter 7/12/2015

@Jupotter Cảm ơn, k%nhoạt động thậm chí còn tốt hơn;)
rink.attguard.6

1

CJam, 45 byte

ri:M;{X__{Mmr+}*[X'dM':S5$N]o_+XM*<_+(-:XM%}g

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

Triển khai thông số kỹ thuật theo đúng nghĩa đen (bao gồm cả công thức "cuộn trung bình" không chính xác về mặt toán học). Theo dự kiến, chương trình porting GolfScript gốc dưới đây để CJam lưu một loạt các byte do ngắn built-in tên lệnh ( mr, ogthay vì rand, putsdo ).

GolfScript, 51 byte

~:&;{1..{&rand+}*[1"d"&": "4$]puts.+1&*<.+(-:1&%}do

Đây là mục GolfScript gốc của tôi. Thủ thuật đánh golf đáng chú ý bao gồm sử dụng số 1như một biến được khởi tạo thuận tiện để lưu trữ số xúc xắc hiện tại sẽ được tung ra. (Phiên bản CJam thay vì sử dụng X, mà CJam khởi tạo thành giá trị 1.)


Thi thiên Nhìn thấy tiêu đề, ban đầu tôi muốn trả lời điều này trong AnyDice . Nhưng hóa ra là khủng khiếp. lựa chọn cho thử thách này và tôi không nghĩ rằng về mặt kỹ thuật có thể sử dụng nó để thực hiện thông số kỹ thuật này như đã đưa ra.

Vấn đề là AnyDice là một ngôn ngữ dành riêng cho tên miền để viết các chương trình xác định để tính toán thống kê súc sắc. Trong khi kiểm tra các kết quả có thể có của một cuộn và làm cuộn có điều kiện dựa trên họ có thể thông qua đệ quy, không có cách nào để tạo ra bất kỳ ngẫu nhiên thực tế. Vì vậy, trong khi bạn có thể mô phỏng chuỗi cuộn xúc xắc này trong AnyDice, tất cả những gì bạn có thể nhận được là đầu ra là số liệu thống kê về những thứ như, giả sử, số lượng cuộn cho đến khi quá trình kết thúc hoặc phân phối kết quả ở một bước nhất định.

Tất cả những gì đã nói, đây là lần gần nhất tôi có thể nhận được trong AnyDice :

N: 6
K: 1
function: clip X:n { result: X * (X < N) }
function: adjust X:n { result: [clip X + ((XdN)*2 >= X*N)*2-1] * (X > 0) }
loop I over {1..20} {
  output K named "dice in roll [I]"
  output KdN named "outcome of roll [I]"
  K: [adjust K]
}

Đây không phải là mã đặc biệt, vì đó dường như là một bài tập vô ích. Các thủ thuật đánh gôn ngôn ngữ chuẩn, như rút ngắn tên hàm và loại bỏ khoảng trắng không cần thiết, dù sao cũng sẽ làm cạn kiệt hầu hết tiềm năng chơi gôn.

Thủ thuật chính được sử dụng ở đây là, khi bạn gọi một hàm mong đợi một số (như được chỉ ra :ntrong định nghĩa hàm) trong AnyDice, và chuyển nó thành một die (tức là phân phối xác suất), AnyDice sẽ tự động đánh giá hàm cho tất cả các khả năng có thể các giá trị của khuôn và kết hợp các kết quả thành một khuôn mới.

Dưới đây là ảnh chụp màn hình của đầu ra (ở định dạng biểu đồ thanh) cho ba cuộn đầu tiên:

Ảnh chụp màn hình AnyDice

(Lưu ý rằng "0" cột trong mỗi đồ thị chỉ ra xác suất mà lặp dừng lại, do số lượng xúc xắc đánh hoặc 0 hoặc N, trước khi cuộn hiện tại. Điều này xảy ra là một cách thuận tiện để đại diện cho tình trạng dừng, kể từ tất nhiên cán 0dN luôn mang lại 0.)


1

R, 103 byte

Một thực hiện khá thẳng về phía trước. Cuộn xúc xắc được thực hiện bởi sum(sample(n,i)).

i=1;n=scan();while(i&i<=n){cat(i,'d',n,': ',s<-sum(sample(n,i)),'\n',sep='');i=ifelse(s<i*n/2,i-1,i+1)}

Chạy thử nghiệm

> i=1;n=scan();while(i&i<=n){cat(i,'d',n,': ',s<-sum(sample(n,i)),'\n',sep='');i=ifelse(s<i*n/2,i-1,i+1)}
1: 9
2: 
Read 1 item
1d9: 9
2d9: 14
3d9: 10
2d9: 14
3d9: 9
2d9: 9
3d9: 12
2d9: 7
1d9: 9
2d9: 11
3d9: 17
4d9: 18
5d9: 25
6d9: 29
7d9: 33
8d9: 43
9d9: 45
> 

1

CoffeeScript, 106 99 byte

f=(n,k=1)->(x=k;x+=Math.random()*n|0for[k..0];console.log k+"d#{n}: "+x;k+=x<k*n/2&&-1||1)while k%n

# Previous attempt, 106 bytes
f=(n,k=1)->(x=i=0;x+=1+Math.random()*n//1while++i<=k;console.log k+"d#{n}: "+x;k+=x<k*n/2&&-1||1)while k%n

Ung dung

f = (n, k = 1) ->
 (x = k
 x += 1 + Math.random() * n | 0 for [k..0]
 console.log k + "d#{n}: " + x
 k += x < k * n / 2 && -1 || 1
 ) while k % n

1

Julia, 77 byte

n->(N=1;while 0<N<n k=sum(rand(1:n,N));print(N,"d$n: $k
");N+=1-2(2k<N*n)end)

Hầu hết điều này nên tự giải thích - một dòng mới thực sự đang được sử dụng trong printchuỗi thay vì sử dụng printlnđể lưu một byte. rand(1:n,N)tạo ra Ncác số nguyên ngẫu nhiên giữa 1 và n.


1

Ruby, 93 90 82 ký tự

->n{d=s=2
puts"#{d}d#{n}: #{s=eval'+rand(n)+1'*d}"while(d+=s<d*n/2.0?-1:1)>0&&d<n}

Chạy mẫu:

2.1.5 :001 > -->n{d=s=2;puts"#{d}d#{n}: #{s=eval'+rand(n)+1'*d}"while(d+=s<d*n/2.0?-1:1)>0&&d<n}[6]
1d6: 5
2d6: 10
3d6: 6
2d6: 5
1d6: 5
2d6: 8
3d6: 15
4d6: 18
5d6: 22

0

QBIC , 83 byte (không cạnh tranh)

:c=a{e=0[1,q|e=e+_rq,a|]?!q$+@d|!+a$+@:|+!e$~e<c/2|q=q-1\q=q+1]c=q*a~q=a|_X]~q=0|_X

Giải trình:

q                    Tracks the number of dice (is implicitly 1 at the start)
:                    Takes input from a CMD line parameter
[1,q|e=e+_rq,a|]     Rolls the dice separately
?!q$+@d|!+a$+@:|+!e$ Prints the roll result (requires an unfortunate amount of casting...)
~e<c/2|q=q-1\q=q+1]  Checks whether to increase or decrease
~q=a|_X]~q=0|_X      Tests the amount of dice and quits on either boundary.

0

PHP, 104 byte

for($n=$argv[$k=1];$k&&$k<$n;print$k."d$n: $x\n",$k-=$x<$n*$k/2?:-1)for($x=$i=0;$i++<$k;)$x+=rand(1,$n);

Chạy với php -r '<code>' <N>

phá vỡ

for($n=$argv[$k=1];     // import input, init number of dice
    $k&&$k<$n;          // while 0<$k<$n
    print$k."d$n: $x\n",    // 2. print results
    $k-=$x<$n*$k/2?:-1      // 3. remove or add a die
)
    for($x=$i=0;$i++<$k;)   // 1. roll dice separately
        $x+=rand(1,$n);         // sum up results
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.