Death By Shock Thăm dò: Đó là rất nhiều xúc xắc


20

Trong webcomic Darths & Droids , Pete, người đóng vai R2-D2 trong chiến dịch nhập vai giả tưởng xung quanh truyện tranh, đã từng tuyên bố (cảnh báo: những kẻ phá hoại tiềm năng trong truyện tranh được liên kết) rằng, với Lost Orb of Phanastacoria đã xử lý thăm dò sốc, bây giờ anh ta có thể đưa ra một con số khổng lồ 1048576d4về thiệt hại. . định dạng. Các mục nhập sẽ được xếp hạng theo kích thước chương trình (chương trình ngắn nhất, theo số byte, chiến thắng), cả về tổng thể và ngôn ngữ, với các mối quan hệ phá vỡ thời gian chạy. Câu trả lời có thể là một chương trình đầy đủ hoặc một định nghĩa hàm.

Điểm mỗi ngôn ngữ

Bình

Maltysen - 8 byte *

Jakube - 10 byte

APL

Alex A - 10 byte

Camam

Trình tối ưu hóa - 11 byte

J

12 - 12 byte **

Clip10

Ypnypn - 12 byte **

K

JohnE - 13 byte

Ti-84 CƠ BẢN

SuperJedi224 - 17 byte *

R

MickyT - 23 byte

Tháng 10 / MATLAB

Oebele - 24 byte

PARI / GP

Charles - 25 byte **

Wolfram / Mathicala

LegionMammal978 - 27 byte

Perl

Nutki - 29 byte

AsciiThenAnsii - 34 byte

Hồng ngọc

Haegin - 32 byte **

ConfuseMr_C - 51 byte **

Cơ bản hàng hóa

Đánh dấu - 37 byte **

PHP

Ismael Miguel - 38 byte

VBA

Sean Cheshire - 40 byte **

PowerShell

Du thuyền - 41 byte **

Javascript

Ralph Marshall - 41 byte

edc65 - 54 byte (Yêu cầu chức năng ES6 không có sẵn trong tất cả các trình duyệt.)

Lua

cryptych - 51 byte

Java

RobAu - 52 byte **

Geobits - 65 byte

C

Funcino - 57 byte

Con trăn

RugPython - 58 byte

Postgre / SQL

Andrew - 59 byte **

Nhanh

Skrundz - 69 byte

GoatInTheMachine - 81 byte

Haskell

Zeta - 73 byte **

ActionScript

Brian - 75 byte **

> <>

ConfuseMr_C - 76 byte

ĐI

Kristoffer Sall-Storgaard - 78 byte

C #

Brandon - 91 byte **

Andrew - 105 byte

Ewan - 148 byte

Vết trầy

SuperJedi224 - 102 byte

C ++

Michelfrancis Bustillos - 154 byte

Đa sắc

Ismael Miguel (Javascript / ActionScript2) - 67 byte


Top 10 tổng thể

Maltysen
Alex A
Jakube
Trình tối ưu hóa
ɐɔıʇǝɥʇuʎs / Ypnypn (không chắc chắn thứ tự)
JohnE
SuperJedi224
MickyT
Oebele

Các mục cảnh báo được đánh dấu * là RẤT RẤT.

Được lập trình đánh dấu ** Tôi chưa thể kiểm tra đúng cách


Đợi đã, tôi có phải đưa ra tổng số xúc xắc hay chỉ tất cả các cuộn trong danh sách?
Maltysen

5
Câu hỏi của bạn, vì nó đứng, có thể sẽ bị chỉ trích vì không rõ ràng hoặc quá rộng. Sẽ rất hữu ích nếu bạn mô tả một cách cụ thể, khách quan về cách các chương trình sẽ được ghi điểm và phương pháp nào nên có sẵn cho chúng. Ngoài ra, ký hiệu của 1048576d4có thể không rõ ràng đối với một số người dùng. Sẽ rất hữu ích khi cung cấp một mô tả chính xác những gì cần được tính toán và bất kỳ hướng dẫn nào phải được tuân theo.
BrainSteel

2
Vấn đề này có thể được thực hiện quá nhanh để trở thành một thử nghiệm thời gian tốt.
isaacg

12
Bạn có thể thử sức mình trong việc tạo bảng xếp hạng đoạn trích để tránh phải tự cập nhật danh sách các bài nộp.
Alex A.

1
Tôi hoàn toàn thích danh hiệu này.
ASCIIThenANSI

Câu trả lời:


10

Pyth - 9 8 byte

Sử dụng phương pháp đơn giản rõ ràng của tổng hợp randint. Đưa tôi vài phút để nhận ra 10485762^20, bây giờ tôi cảm thấy thực sự ngu ngốc. Cảm ơn @Jakube đã tiết kiệm cho tôi một byte bằng cách chỉ ra 2^20 = 4^10.

smhO4^4T

Thời gian chạy thật kinh khủng, nó vẫn chưa kết thúc trên máy tính của tôi, vì vậy không có điểm nào để chạy nó trực tuyến vì vậy đây là 2^10một: Hãy thử trực tuyến tại đây .

s        Summation
 m       Map
  h      Incr (accounts for 0-indexed randint)
   O4    Randint 4
  ^4T    Four raised to ten

4
8 byte là có thể. 2^20 = 4^10
Jakube

@Jakube cảm ơn vì tiền boa :)
Maltysen

Điều này kết thúc ngay lập tức cho tôi.
Carcigenicate

@Carcigenicate bạn đang nói về liên kết tôi đã đưa ra? Đó là một trong những sửa đổi, chỉ một khoản tiền 1024d4.
Maltysen

@Maltysen Rất tiếc, xin lỗi. Ya, vậy thôi.
Carcigenicate

9

Perl - 48 44 37 39 34 byte

$-+=rand(4)+1for(1..2**20);print$-

In tổng mà không có một dòng mới.
Đã lưu 4 byte bằng cách thay thế 2**20(cảm ơn Maltysen) và xóa dấu ngoặc kép xung quanh bản in.
Đã lưu thêm 7 byte bằng cách sắp xếp lại mã (cảm ơn Thaylon!)
Mất 2 byte vì mã cũ của tôi tạo 0-4 (nên là 1-4).
Một lần nữa, đã lưu 5 byte nhờ Caek và nutki.

Ungolfed, viết đúng mã:

my $s = 0
$s += int( rand(4) + 1 ) for (1 .. 2**20);
print "$s";

Có một chút khó khăn để có được một bộ đếm thời gian được nối, nhưng cuối cùng tôi đã làm cho nó hoạt động.
SuperJedi224

2
Vì chúng tôi không quan tâm đến các cảnh báo ... $ s + = int rand (5) cho (1..2 ** 20); in $ s
Thaylon

3
int(rand(5))trả về phạm vi 0 đến 4 trong khi d4 nên từ 1 đến 4.
nutki

@nutki OK, cảm ơn. Tôi đã chỉnh sửa nó ngay bây giờ.
ASCIIThenANSI

$s+=int rand(4)+1for(1..2**20);print$sXóa dấu ngoặc đơn cho int cũng hoạt động đối với tôi, để lưu đột quỵ.
Caek

7

APL, 11 10 byte

+/?4⍴⍨2*20

Điều này chỉ cần tổng của một mảng gồm 2 20 = 1048576 số nguyên ngẫu nhiên trong khoảng từ 1 đến 4.

+/           ⍝ Reduce by summing a
  ?          ⍝ random integer
   4⍴⍨       ⍝ array with values between 1 and 4
      2*20   ⍝ of length 2^20

Bạn có thể điểm chuẩn này trên TryAPL bằng cách in dấu thời gian trước và sau. Mất khoảng 0,02 giây.

Đã lưu một byte nhờ vào bến và FUZxxl!


Một và 5 ??? Một d4 có thể cho 1, 2, 3 hoặc 4. Bạn không thể nhận được 5.
Loren Pechtel

@LorenPechtel: Xin lỗi, xấu của tôi. Cảm ơn đã chỉ ra rằng. Bây giờ nó đã được sửa. Tôi bị mệt não.
Alex A.

Lưu một byte:+/?4⍴⍨2*20
bến

Cải thiện nhỏ: sử dụng +/?4⍴⍨2*20thay thế.
FUZxxl

1
Ngẫu nhiên, câu trả lời này không được đánh gôn theo bất kỳ cách nào: Nó sẽ được viết chính xác theo cùng một cách trong mã APL sản xuất.
FUZxxl 11/07/2015

7

Ti-84 cơ bản, 17 byte

Tổng số dấu chân - Kích thước của tiêu đề chương trình = 17 byte

Thời gian chạy: Không xác định, ước tính khoảng 5-6 giờ dựa trên hiệu suất cho số lượng cuộn nhỏ hơn (vì vậy, về cơ bản, không tốt lắm)

(RandInt (1,4), A, 1,2 ^ 20

1
+1 để làm cho nó chạy trên TI-84. Tôi đoán thời gian không phải là vấn đề ở đây, đó là những máy tính 30 - 40 tuổi.
ASCIIThenANSI

Tôi đoán có một chức năng để lấy mẫu phân phối bình thường chứ không phải là một thống nhất? Nên nhanh hơn nhiều.
Ben Voigt

@BenVoigt: Vì điều này có nghĩa là mô phỏng việc gieo xúc xắc, nên một phân phối bình thường là không phù hợp; nó sẽ phải được thống nhất
Alex A.

2
@AlexA.: Định lý giới hạn trung tâm quy định rằng tổng của nhiều viên xí ngầu thống nhất không thể phân biệt được với phân phối chuẩn. Vì vậy, nó phụ thuộc vào mức độ mô phạm của chúng ta về "mô phỏng cán".
Ben Voigt

1
@MIWright, tôi nghĩ rằng nó chỉ dành cho giao tiếp. Ít nhất là cái tôi đã sử dụng pin AAA.
Arturo Torres Sánchez

7

R, 32 24 23 21 byte

Chỉnh sửa: Đã thoát khỏi as.integerphân chia số nguyên và được sử dụng %/%. Tăng tốc lên một chút.

Cảm ơn Alex A về mẹo mẫu ... và Giuseppe đã xóa r=

sum(sample(4,2^20,T))

Đã thử nghiệm với

i = s = 0
repeat {
i = i + 1
print(sum(sample(4,2^20,r=T)))
s = s + system.time(sum(sample(4,2^20,r=T)))[3]
if (i == 10) break
}
print (s/10)

Đầu ra

[1] 2621936
[1] 2620047
[1] 2621004
[1] 2621783
[1] 2621149
[1] 2619777
[1] 2620428
[1] 2621840
[1] 2621458
[1] 2620680
elapsed 
   0.029 

Đối với tốc độ thuần túy sau đây hoàn thành trong micro giây. Tuy nhiên tôi không chắc chắn tôi đã có logic của tôi cho nó. Các kết quả xuất hiện phù hợp với phương pháp ngẫu nhiên. Xấu hổ vì nó dài hơn.

sum(rmultinom(1,2^20,rep(1,4))*1:4)

Đây là một lần chạy tôi đã làm trên máy của mình

system.time(for(i in 1:1000000)sum(rmultinom(1,2^20,rep(1,4))*1:4))
                   user                  system                 elapsed 
7.330000000000040927262 0.000000000000000000000 7.370000000000345607987 

Bạn có thể tiết kiệm một vài byte bằng cách sử dụng sample()ở vị trí của runif(), tức là sum(sample(4,2^20,r=T)).
Alex A.

Chỉ cần làm một số điểm chuẩn trên máy tính của tôi và sample()thực sự cũng nhanh hơn!
Alex A.

@AlexA. Cảm ơn sẽ kiểm tra và thay đổi khi tôi đến gần máy tính
MickyT

không cần phải làm điều này hoặc bất cứ điều gì nhưng bạn không cần r=T, chỉ Tlà tốt để thay thế.
Giuseppe

1
@Giuseppe, cảm ơn .. đây thực sự là một cái cũ
MickyT

6

Python 2, 58 byte

Chúng tôi nhận được 1048576 ký tự ngẫu nhiên từ hệ điều hành, lấy 2 bit mỗi ký tự và thêm chúng vào. Sử dụng osthư viện dường như tiết kiệm một vài ký tự so với sử dụng randomthư viện.

import os
print sum(1+ord(c)%4 for c in os.urandom(1<<20))

Điều này mất khoảng 0,2 giây trên PC của tôi.


6

CJam, 12 11 byte

YK#_{4mr+}*

Đây là foward khá thẳng:

YK                  e# Y is 2, K is 20
  #                 e# 2 to the power 20
   _                e# Copy this 2 to the power 20. The first one acts as a base value
    {    }*         e# Run this code block 2 to the power 20 times
     4mr            e# Get a random int from 0 to 3. 0 to 3 works because we already have
                    e# 2 to the power 20 as base value for summation.
        +           e# Add it to the current sum (initially 2 to the power 20)

Nhưng cái hay của nó là nó cũng rất nhanh! Trên máy của tôi (và sử dụng trình biên dịch Java ), nó mất trung bình 70 mili giây.

Các phiên bản trực tuyến mất khoảng 1,7 giây trên máy tính của tôi.

Cập nhật : 1 byte được lưu nhờ vào DocMax


Phiên bản trực tuyến mất khoảng 6 giây từ các máy tính ở đây, nhưng đó có lẽ chỉ là mạng và / hoặc macbook mà trường khăng khăng sử dụng. Tôi sẽ thử lại khi về đến nhà.
SuperJedi224

@ SuperJedi224 Phiên bản trực tuyến hoàn toàn bằng JavaScript, không thực hiện bất kỳ cuộc gọi mạng nào. Bạn có thể tải xuống phiên bản Java và chạy nó bằng cách sử dụng các hướng dẫn trên trang web.
Tối ưu hóa

3
Trừ khi tôi thiếu một cái gì đó (điều đáng buồn là quá phổ biến với CJam và tôi), thay vì gieo bằng 0 và thêm 1 cho 2 ^ 20 lần chạy, hãy tạo hạt giống với 2 ^ 20 để tiết kiệm 1 byte:YK#_{4mr+}*
DocMax

@DocMax Bạn nói đúng. Cảm ơn!
Tối ưu hóa

+1; Tôi sẽ đăng câu trả lời chính xác này (trừ 4A#thay vì YK#), nhưng bạn đã đánh bại tôi. :)
Ilmari Karonen

6

JavaScript (ES6), 54 byte

Thời gian trung bình <100 msec. Chạy đoạn mã để kiểm tra (trong Firefox)

// This is the answer
f=t=>(i=>{for(t=i;i--;)t+=Math.random()*4|0})(1<<20)|t

// This is the test
test();

function test(){
  var time = ~new Date;
  var tot = f();
  time -= ~new Date;
  
  Out.innerHTML = "Tot: " + tot + " in msec: " + time + "\n" + Out.innerHTML;
}
<button onclick="test()">Repeat test</button><br>
<pre id=Out></pre>

Giải trình

Không có gói thống kê tích hợp, trong Javascript, cách ngắn nhất để có được tổng số 1 triệu số ngẫu nhiên là gọi ngẫu nhiên () trong một triệu lần. Rất dễ

f=()=>{
   var t = 0, r, i
   for (i=1<<20; i--; ) 
   {
      r = Math.random()*4 // random number between 0 and 3.9999999
      r = r + 1 // range 1 ... 4.999999
      r = r | 0 // truncate to int, so range 1 ... 4
      t = t+r
   }
   return t
}

Bây giờ, thêm 1 cho một triệu lần hoàn toàn giống với việc thêm 1 triệu hoặc thậm chí tốt hơn, bắt đầu tổng với 1 triệu và sau đó thêm phần còn lại:

f=()=>{
   var t, r, i
   for (t = i = 1<<20; i--; ) 
   {
      r = Math.random()*4 // random number between 0 and 3.9999999
      r = r | 0 // truncate to int, so range 0 ... 3
      t = t+r
   }
   return t
}

Sau đó đánh golf, thả biến temp r và thả khai báo biến cục bộ. tlà một tham số, vì người ta cần rút ngắn khai báo f. ilà toàn cầu (điều xấu)

f=t=>{
   for(t=i=1<<20;i--;) 
      t+=Math.random()*4|0
   return t
}

Sau đó tìm cách tránh 'quay trở lại' bằng cách sử dụng chức năng bên trong không tên. Là một tác dụng phụ, chúng tôi có được một tham số khác để không sử dụng toàn cầu

f=t=>(
  (i=>{ // start inner function body
     for(t=i;i--;)t=t+Math.random()*4|0 // assign t without returning it
   })(1<<20) // value assigned to parameter i
  | t // the inner function returns 'undefined', binary ored with t gives t again
) // and these open/close bracket can be removed too

Không hoạt động trong chrome. Giới thiệu để kiểm tra trong FF.
SuperJedi224

Tất nhiên. Chrome là ES5
edc65

1
Nó có một số hỗ trợ ES6 (hầu hết chỉ hỗ trợ bằng cách bật javascript thử nghiệm từ chrome: \ flags), nhưng chưa hỗ trợ các chức năng mũi tên
SuperJedi224

5

Perl, 29

Tạo một bảng có độ dài cần thiết.

print~~map{0..rand 4}1..2**20

Tôi đang nhận được một lỗi cú pháp trên cái này.
SuperJedi224

Điều này cần một phiên bản đủ mới của Perl (toán tử smartmatch được giới thiệu trong 5.10.1 và tôi nghĩ rằng nó không được cung cấp theo mặc định cho đến sau này).
Đánh dấu

~~không phải là một smartmatch, chỉ là một sự đảo ngược đôi chút để buộc bối cảnh vô hướng. Một nhân vật dài hơn sẽ là print$x=map.... Có thể trên các phiên bản mới hơn, nó cảnh báo vì sự mơ hồ với smartmatch, nhưng dường như nó không hoạt động mà không có cảnh báo trên hệ thống của tôi và tại đây: ideone.com/LAIWzq
nutki

Đúng, nó hoạt động trên IDEone. Tôi sẽ cung cấp cho bạn.
SuperJedi224

5

J (12 byte, khoảng 9,8 mili giây)

+/>:?4$~2^20

Tôi nghi ngờ điều này chủ yếu là giới hạn bộ nhớ: tôi thậm chí không thể lấy nó để tối đa hóa một lõi ...

Bạn có thể kiểm tra điều này với mã sau đây:

   timeit =: 13 : '(1000 * >./ ($/x) 6!:2"0 1 y)'
   4 20 timeit '+/>:?4$~2^20'
9.90059

Điều này chạy nó trong 4 nhóm 20 con đường và trả về số mili giây của thời gian bay trong nhóm nhanh nhất. Một thông dịch viên có thể được tìm thấy ở đây .


4

Bình thường, 10 byte

u+GhO4^4TZ

Điều này có nhiều byte hơn một chút so với giải pháp Pyth của @ Maltysen. Nhưng nó chạy trong 8,5 giây trên máy tính xách tay của tôi, trong khi giải pháp của @ Maltysen không tạo ra giải pháp nào trong 20 phút chạy.

Nhưng vẫn còn một chút quá chậm cho trình biên dịch trực tuyến.

Giải trình

u     ^4TZ   start with G = 0, for H in 0, ... 4^10-1:
                G = 
 +GhO4              G + (rand_int(4) + 1)
             result is printed implicitly 

Sẽ kiểm tra chiều nay.
SuperJedi224

4

Java, 65

Vì chúng tôi có điểm số được liệt kê theo ngôn ngữ, tại sao không ném Java vào hỗn hợp? Không có nhiều thứ để chơi golf ở đây, chỉ là một vòng lặp đơn giản, nhưng tôi đã có thể vắt kiệt một vài nỗ lực ban đầu của mình:

int f(){int i=1<<20,s=i;while(i-->0)s+=Math.random()*4;return s;}

Sẽ kiểm tra chiều nay.
SuperJedi224

Không vấn đề gì. Phải mất khoảng 80ms trên PC (chậm) này, nhưng tôi không biết bạn đang sử dụng thời gian nào.
Geobits

Tôi không tin rằng chương trình của bạn là một mô hình chính xác. Nó có thể và thực hiện trong thử nghiệm của tôi thêm 0 vào một số cuộn. Theo tôi hiểu thì hầu hết các d4 là 1,2,3,4 (không có 0).

4
@ user39526 s(tổng số tiền) bắt đầu từ 1<<20(số lượng cuộn). Điều này tương đương với việc thêm một cho mỗi cuộn. Khi bộ ngẫu nhiên ném 0, nó sẽ quay số 1, v.v.
Geobits

Bạn nên nâng cấp lên Java 8! codegolf.stackexchange.com/a/52919/7021
RobAu 10/07/2015

4

Matlab, 24

Trình đầu tiên bao giờ hết!

sum(randi([1,4],1,2^20))

Tôi đã hy vọng sử dụng randi ([1,4], 1024), đưa ra ma trận gồm 1048576 phần tử, nhưng sau đó tôi cần một khoản tiền gấp đôi, cần nhiều ký tự hơn số này.

Về tốc độ chạy được đề cập trong câu hỏi, timeitcho tôi biết thời gian chạy là khoảng 0,031 giây. Vì vậy, khá nhiều ngay lập tức.


Tôi nhận được 0,04 đến 0,05 giây qua quãng tám trực tuyến.
SuperJedi224

4

Haskell, 73 byte

import System.Random
f=fmap sum.(sequence.replicate(2^20))$randomRIO(1,4)

Sử dụng:

$ ghci sourcefile.hs
ghci> f
2622130

4

C #: 105 byte

using System.Linq;class C{int D(){var a=new System.Random();return new int[1<<20].Sum(i=>a.Next(1,5));}}

Thật tuyệt, tôi thích điều này ngay cả khi nó sai hai lần. Đó là 1 << 20, không phải 2 << 20. Và tham số thứ hai của Random.Next là The *exclusive* upper bound of the rangevậy nên là 5
edc65

@ edc65 Cảm ơn bạn đã bắt những lỗi đó. Tôi đã cập nhật câu trả lời.
Andrew

1
Bạn có thể lưu 9 ký tự bằng cách loại bỏ avà di chuyển new System.Random()bên trong Sum. Chắc chắn, nó sẽ tạo ra một cái mới Randommỗi lần, nhưng ai quan tâm miễn là nó cho kết quả?
LegionMammal978

@ LegionMammal978 nếu bạn tạo ngẫu nhiên mới hết lần này đến lần khác, kết quả chủ yếu là không ngẫu nhiên
edc65

@ edc65 Đó là lý do tại sao tôi không đi theo con đường đó. Tôi đã không có cơ hội để kiểm tra những gì sẽ xảy ra nếu tôi làm theo gợi ý.
Andrew

4

PHP 38 37 byte

Điều này sử dụng một ý tưởng rất đơn giản: tổng hợp tất cả!

Ngoài ra, tôi đã nhận thấy rằng đó 104857610000000000000000000trong nhị phân, tương đương với 1<<20.

Đây là mã:

while($i++<1<<20)$v+=rand(1,4);echo$v

Kiểm tra trong trình duyệt của bạn (với các thay đổi RẤT LỚN ):

$i=$v=0;while($i++<1<<20)$v+=rand(1,4);printf($v);

Tất cả các thay đổi trong mã được giải thích trong các ý kiến.


Bạn có thể xóa ;sauecho$v
Martijn

@Martijn Tôi để nó ở đó vì phần lớn thời gian PHP phàn nàn về nó. Nhưng tôi đã loại bỏ nó ngay bây giờ. Nó hoạt động trên sandbox.onlinephpfifts.com và thế là đủ.
Ismael Miguel

4

Toán học, 30 27 byte

Tr[RandomInteger[3,2^20]+1]

Mathematica có tên hàm khá dài ...


3

C, 57 byte

main(a,b){for(b=a=1<<20;a--;b+=rand()%4);printf("%d",b);}

Mã này hoạt động ... một lần. Nếu bạn cần cuộn lại những viên xí ngầu đó, bạn sẽ cần đặt srand(time(0))vào đó, thêm 14 byte.


Tại sao bạn cần thêm srand(time(0))? (Xin lỗi, tôi không sử dụng C.)
ASCIIThenANSI

@ASCIIThenANSI Nhiều triển khai của randhạt giống C đến cùng một giá trị mỗi lần chạy. srandgieo hạt RNG và time(0)nhận được thời gian hiện tại tính bằng giây kể từ năm 1970.
Funcino

Nếu bạn khởi tạo a=b=1<<20thì bạn có thể bỏ qua 1+, điều này sẽ tiết kiệm 4 byte.
nutki

Ngoài ra, inttrước đây mainlà không cần thiết.
nutki

Gợi ý cho bất cứ ai làm t=0, sau đó t=t (...) +1trong 1048576 lần: nghĩ lại! (cuối cùng cũng thấy câu trả lời của tôi)
edc65

3

PostgreSQL, 59 byte

select sum(ceil(random()*4)) from generate_series(1,1<<20);

Về random()mặt lý thuyết, tôi sẽ thừa nhận một vấn đề nhỏ có thể tạo ra chính xác bằng 0, trong trường hợp đó, trục lăn sẽ bằng không.


Bạn không thực sự cần phải ;chấm dứt truy vấn vì đó là truy vấn duy nhất
MickyT

3

Ruby, 32 byte

(1..2**20).inject{|x|x-~rand(4)}

Ở dạng dễ đọc hơn:

(1..2**20).inject(0) do |x|
  x + rand(4) + 1
end

Nó tạo ra một phạm vi từ 1 đến 1048576 và sau đó lặp đi lặp lại trên khối đó nhiều lần. Mỗi lần khối được thực thi, giá trị từ lần lặp trước được truyền vào là x(ban đầu là 0, mặc định cho inject). Mỗi lần lặp, nó tính toán một số ngẫu nhiên trong khoảng từ 0 đến 3 (đã bao gồm), thêm một số để nó mô phỏng việc cán d4 và cộng tổng đó.

Trên máy của tôi, nó chạy khá nhanh ( 0.25 real, 0.22 user, 0.02 sys).

Nếu bạn đã cài đặt Ruby, bạn có thể chạy nó ruby -e 'p (1..2**20).inject{|x|x+rand(4)+1}'( pcần phải xem đầu ra khi chạy theo cách này, bỏ qua nếu bạn không quan tâm đến điều đó hoặc chỉ chạy nó trong IRB nơi kết quả được in ra màn hình cho bạn). Tôi đã thử nó trên Ruby 2.1.6.

Cảm ơn histocrat cho hack twiddling thay thế x + rand(4) + 1bằng x-~rand(4).


1
Bạn có thể giải thích làm thế nào nó hoạt động?
ASCIIThenANSI

Trình thông dịch trực tuyến đầu tiên tôi có thể thấy rằng thực sự muốn tải các khiếu nại rằng phương thức rand () không tồn tại. Tôi sẽ cố gắng tìm một cái khác.
SuperJedi224

Được rồi, tôi tìm thấy một trong những hoạt động.
SuperJedi224 1/5/2015

Bit twiddling hack: x-~rand(4)tương đương với x+rand(4)+1.
lịch sử

Ngoài ra, bạn có thể thay thế 2**20bằng 4e10.
lịch sử

3

PARI / GP, 25 byte

Thực sự, không cần phải chơi golf ở đây - đây là cách đơn giản để thực hiện phép tính trong GP. Nó chạy trong 90 mili giây trên máy của tôi. Nâng hàng +1tiết kiệm khoảng 20 mili giây.

sum(i=1,2^20,random(4)+1)

Chỉ để cho vui: nếu một người được tối ưu hóa cho hiệu suất trong PARI,

inline long sum32d4(void) {
  long n = rand64();
  // Note: __builtin_popcountll could replace hamming_word if using gcc
  return hamming_word(n) + hamming_word(n & 0xAAAAAAAAAAAAAAAALL);
}

long sum1048576d4(void) {
  long total = 0;
  int i;
  for(i=0; i<32768; i++) total += sum32d4();
  return total;
}

có tổng số thao tác rất nhỏ - nếu xorgens cần ~ 27 chu kỳ cho mỗi từ 64 bit (có ai có thể xác minh điều này không?), thì bộ xử lý có POPCNT chỉ mất khoảng 0,5 chu kỳ / bit, hoặc vài trăm micro giây cho lần cuối con số.

Điều này sẽ có hiệu suất trong trường hợp xấu nhất gần tối ưu giữa các phương pháp sử dụng số ngẫu nhiên có chất lượng tương tự hoặc cao hơn. Có thể tăng đáng kể tốc độ trung bình bằng cách kết hợp các trường hợp - có thể là một triệu cuộn mỗi lần - và chọn với (về cơ bản) mã hóa số học .


3

Javascript, 55 53 50 47 41 byte

for(a=i=1<<20;i--;)a+=(Math.random()*4)|0

Tôi đã không nhận ra rằng các số không ngẫu nhiên là một tác nhân gây khó chịu đã biết, vì vậy tôi cho rằng tôi nên đăng một giải pháp thực sự. Không có sự thiếu tôn trọng.

Bình luận: như được lưu ý bởi những người khác ở trên, bạn có thể bỏ qua +1 cho mỗi cuộn bằng cách bắt đầu với số lượng cuộn trong câu trả lời của mình và không phải viết a = 0, i = 1 << 20 bạn lưu hai byte và thêm 2 vì bạn không thêm +1 vào mỗi cuộn. Hàm parseInt thực hiện tương tự như Math.floor nhưng ngắn hơn 2 ký tự.


Lưu ý rằng câu trả lời này hoàn toàn khác với câu trả lời ban đầu của SuperJedi224 và @Andrew
Ralph Marshall

Bạn có thể xóa cả dấu ngoặc và dấu chấm phẩy cuối cùng (và chỉ dấu cuối cùng) để cắt giảm thêm một vài ký tự. Ngoài ra, phiên bản hiện tại chỉ có 50 ký tự, không phải 52.
SuperJedi224

SuperJedi - cảm ơn vì những gợi ý. Tôi nghĩ rằng tôi đã thử nó mà không có dấu ngoặc chỉ để gặp vấn đề, nhưng có lẽ tôi đã có một vấn đề khác. Trong mọi trường hợp, tôi nghĩ rằng điều này là tốt như nó sẽ nhận được.
Ralph Marshall

a+=parseInt(Math.random()*4)có thể được rút ngắn thành a+=1+Math.random()*4&7. Chỉ 1+là nếu bạn quan tâm nếu nó cuộn 0 hay không.
Ismael Miguel

Bạn có thể đánh gôn xuống đây : for(a=i=1<<20;i--;)a+=(Math.random()*4)|0, chỉ có 41 byte
SuperJedi224

2

Clip 10 , 12 byte

r+`m[)r4}#WT

         #4T    .- 4^10 = 1048576             -.
   m[   }       .- that many...               -.
     )r4        .-          ...random numbers -.
r+`             .- sum                        -.

Mất khoảng 0,6 giây để chạy trên máy của tôi.


2

Đi, 78 byte

Chơi gôn

import."math/rand";func r()(o int){for i:=2<<19;i>=0;i--{o+=Intn(4)+1};return}

Vẫn đang làm việc với nó

Chạy trực tuyến tại đây http://play.golang.org/p/pCliUpu9Eq


Thật không may, sân chơi golang.org không thực hiện đúng các thao tác thời gian và repl.it không muốn tải ngay bây giờ. Tôi sẽ xem những gì tôi có thể làm về nó chiều nay.
SuperJedi224

2

Đi, 87 byte

Giải pháp ngây thơ

import"math/rand";func r(){o,n:=0,2<<19;for i:=0;i<n;i++{o+=rand.Intn(4)};println(o+n)}

Chạy trực tuyến tại đây: http://play.golang.org/p/gwP5Os7_Sq

Do cách hoạt động của sân chơi cờ vây, bạn phải thay đổi hạt giống theo cách thủ công (thời gian luôn giống nhau)


2

Cơ bản hàng hóa, 37 byte

1F┌I=1TO2↑20:C=C+INT(R/(1)*4+1):N─:?C

Thay thế PETSCII: = SHIFT+E, /= SHIFT+N, =SHIFT+O

Thời gian chạy ước tính dựa trên các lần chạy với số lượng xúc xắc thấp hơn: 4,25 giờ.

Thật hấp dẫn khi cố gắng đánh bại hai byte bằng cách tạo Cmột số nguyên, làm tròn số các số ngẫu nhiên. Tuy nhiên, phạm vi trên các số nguyên trong Commodore Basic là -32678 đến 32767 - không đủ, khi câu trả lời trung bình là 2621440.



2

Ruby, 51 47 ký tự

x=[];(2**20).times{x<<rand(4)+1};p x.inject(:+)

Tôi đã xem tất cả các câu trả lời trước khi tôi làm điều này, và sum(2**20 times {randInt(4)}) chiến lược thực sự bế tắc, vì vậy tôi đã sử dụng nó.

> <>, 76 ký tự

012a*&>2*&1v
|.!33&^?&:-<
3.v < >-:v >
   vxv1v^<;3
  1234    n+
  >>>> >?!^^

Tôi không chắc cái này có hoạt động không, vì trình duyệt của tôi bị hỏng khi tôi thử kiểm tra nó, nhưng đây là trình thông dịch trực tuyến.


Tôi sẽ cho bạn +1 cho câu trả lời> <>.
SuperJedi224

2

Swift, 64 byte

Không có gì thông minh, chơi golf trong Swift rất khó ...

func r()->Int{var x=0;for _ in 0..<(2<<19) {x+=Int(arc4random()%4)+1;};return x;}

Phiên bản 2 (quá muộn)

var x=0;for _ in 0..<(2<<19){x+=Int(arc4random()%4)+1;};print(x)

2

Java (Java 8) - 52

int f(){return new Random().ints(1<<20,1,5).sum();}
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.