Death By Shock Probe: sono molti dadi


20

Nel webcomic Darths & Droids , Pete, che interpreta R2-D2 nella campagna di gioco di ruolo immaginaria su cui si basa il fumetto, una volta afferma (avvertimento: potenziali spoiler nel fumetto collegato) che, con la Sfera perduta di Phanastacoria truccata fino al suo sonda d'urto, ora può lanciare un enorme 1048576d4di danno. (Il GM non ha né confermato né negato questo.) Dato che dovrebbe essere ragionevolmente ovvio che quasi nessuno avrà effettivamente la pazienza di tirare tanti dadi, scrivere un programma per farlo per lui, producendo il valore totale ottenuto in modo ragionevole formato. Le voci saranno classificate in base alle dimensioni del programma (programma più breve, numero di byte, vincite), sia generali che per lingua, con vincoli di runtime. La risposta può essere un programma completo o una definizione di funzione.

Punteggi per lingua

Pyth

Maltysen - 8 byte *

Jakube - 10 byte

APL

Alex A - 10 byte

CJam

Ottimizzatore - 11 byte

J

ɐɔıʇǝɥʇuʎs - 12 byte **

Clip10

Ypnypn - 12 byte **

K

JohnE - 13 byte

Ti-84 BASIC

SuperJedi224 - 17 byte *

R

MickyT - 23 byte

Ottava / MATLAB

Oebele - 24 byte

PARI / GP

Charles - 25 byte **

Wolfram / Mathematica

LegionMammal978 - 27 byte

Perl

Nutki - 29 byte

AsciiThenAnsii - 34 byte

Rubino

Haegin - 32 byte **

ConfusedMr_C - 51 byte **

Commodore Basic

Mark - 37 byte **

PHP

Ismael Miguel - 38 byte

VBA

Sean Cheshire - 40 byte **

PowerShell

Nacht - 41 byte **

Javascript

Ralph Marshall - 41 byte

edc65 - 54 byte (richiede la funzionalità ES6 non disponibile in tutti i browser.)

Lua

criptico - 51 byte

Giava

RobAu - 52 byte **

Geobit - 65 byte

C

Functino - 57 byte

Pitone

CarpetPython - 58 byte

Postgre / SQL

Andrew - 59 byte **

veloce

Skrundz - 69 byte

GoatInTheMachine - 81 byte

Haskell

Zeta - 73 byte **

ActionScript

Brian - 75 byte **

> <>

ConfusedMr_C - 76 byte

PARTIRE

Kristoffer Sall-Storgaard - 78 byte

C #

Brandon - 91 byte **

Andrew - 105 byte

Ewan - 148 byte

Graffiare

SuperJedi224 - 102 byte

C ++

Michelfrancis Bustillos - 154 byte

poliglotti

Ismael Miguel (Javascript / ActionScript2) - 67 byte


Top 10 in generale

Maltysen
Alex A
Jakube
Optimizer
ɐɔıʇǝɥʇuʎs / Ypnypn (ordine incerto)
JohnE
SuperJedi224
MickyT
Oebele

Avvertenza: le voci contrassegnate con un * sono MOLTO LENTI.

Programmato contrassegnato ** Non sono ancora stato in grado di testare correttamente


Aspetta, devo dare la somma del tiro di dado o solo tutti i tiri in una lista?
Maltysen,

5
La tua domanda, così com'è, sarà probabilmente criticata per essere poco chiara o troppo ampia. Sarebbe molto utile se descrivessi in termini obiettivi e specifici come verranno assegnati i punteggi ai programmi e quali metodi i programmi dovrebbero avere a loro disposizione. Inoltre, la notazione di 1048576d4potrebbe non essere chiara per alcuni utenti. Sarebbe utile fornire una descrizione precisa di ciò che dovrebbe essere calcolato e di tutte le linee guida che devono essere seguite.
BrainSteel,

2
Questo problema può essere fatto troppo rapidamente per essere una buona prova a tempo.
isaacg,

12
Puoi provare a creare una classifica dello snippet dello stack per evitare di dover aggiornare manualmente l'elenco degli invii.
Alex A.

1
Adoro questo titolo.
ASCIIThenANSI

Risposte:


10

Pyth - 9 8 byte

Utilizza un metodo ovvio e semplice di sommatoria di randint. Mi ci è voluto un minuto per capire che lo 1048576era2^20 , ora mi sento veramente stupido. Grazie a @Jakube per avermi salvato un byte sottolineando 2^20 = 4^10.

smhO4^4T

Il runtime è orribile, deve ancora finire sul mio computer, quindi non ha senso eseguirlo online quindi ecco 2^10quello: provalo online qui .

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

4
8 byte sono possibili. 2^20 = 4^10
Jakube,

@Jakube grazie per la punta :)
Maltysen

Questo finisce immediatamente per me.
Carcigenicato

@Carcigenicato stai parlando del link che ho dato? Questo è quello modificato, solo somme 1024d4.
Maltysen,

@Maltysen Whoops, mi dispiace. Ya, tutto qui.
Carcigenicato

9

Perl - 48 44 37 39 34 byte

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

Stampa la somma senza una nuova riga finale.
Salvato 4 byte sostituendo 2**20(grazie Maltysen) e rimuovendo le virgolette attorno alla stampa.
Ho salvato altri 7 byte riorganizzando il codice (grazie Thaylon!) Ho
perso 2 byte perché il mio vecchio codice ha generato 0-4 (dovrebbe essere 1-4).
Ancora una volta, salvato 5 byte grazie a Caek e nutki.

Codice non scritto, correttamente scritto:

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

È stato un po 'difficile ottenere un timer collegato, ma alla fine l'ho fatto funzionare.
SuperJedi224,

2
Dato che non ci preoccupiamo degli avvisi ... $ s + = int rand (5) per (1..2 ** 20); stampa $ s
Thaylon

3
int(rand(5))restituisce l'intervallo da 0 a 4 mentre d4 deve essere
compreso tra

@nutki OK, grazie. L'ho modificato ora.
ASCIIThenANSI

$s+=int rand(4)+1for(1..2**20);print$sRimuovere la parentesi per int funziona anche per me, per salvare un colpo.
Caek,

7

APL, 11 10 byte

+/?4⍴⍨2*20

Questo prende semplicemente la somma di un array di 2 20 = 1048576 numeri interi casuali tra 1 e 4.

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

È possibile eseguire il benchmark di questo su TryAPL stampando il timestamp prima e dopo. Ci vogliono circa 0,02 secondi.

Salvataggio di un byte grazie a Marinus e FUZxxl!


Uno e 5 ??? Un d4 può dare 1, 2, 3 o 4. Non puoi ottenere 5.
Loren Pechtel,

@LorenPechtel: mi dispiace, mia cattiva. Grazie per la segnalazione. Ora è riparato. Ho il cervello stanco.
Alex A.

Salva un byte:+/?4⍴⍨2*20
marinus

Piccolo miglioramento: utilizzare +/?4⍴⍨2*20invece.
FUZxxl

1
Per inciso, questa risposta non è giocata in alcun modo: sarebbe scritta esattamente allo stesso modo nel codice APL di produzione.
FUZxxl,

7

Ti-84 Basic, 17 byte

Impronta totale - Dimensione dell'intestazione del programma = 17 byte

Tempo di esecuzione: sconosciuto, stimato in 5-6 ore base alle prestazioni per un numero inferiore di rotoli (quindi, sostanzialmente, non molto buono)

Σ (randInt (1,4), A, 1,2 ^ 20

1
+1 per averlo eseguito su una TI-84. Immagino che il tempo non sia un problema qui, quelli sono calcolatori di 30-40 anni ormai.
ASCIIThenANSI

Presumo che ci sia una funzione per campionare una distribuzione normale piuttosto che una uniforme? Dovrebbe essere molto più veloce.
Ben Voigt,

@BenVoigt: poiché questo ha lo scopo di simulare il lancio di dadi, una distribuzione normale non è appropriata; dovrebbe essere uniforme.
Alex A.

2
@AlexA .: Il Teorema del limite centrale prevede che la somma di molti dadi uniformi sia indistinguibile da una distribuzione normale. Quindi dipende da quanto siamo pedanti nel "simulare il rotolamento".
Ben Voigt,

1
@MIWright, pensavo fosse solo per la comunicazione. Almeno quello che ho usa batterie AAA.
Arturo Torres Sánchez,

7

R, 32 24 23 21 byte

Modifica: Elimina la as.integerdivisione intera utilizzata %/%. Accelera leggermente.

Grazie ad Alex A per il suggerimento del campione ... e Giuseppe per aver rimosso il file r=

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

Testato con

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)

Uscite

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

Per una velocità pura, quanto segue viene completato in microsecondi. Tuttavia non sono sicuro di avere la mia logica corretta per questo. I risultati sembrano coerenti con il metodo casuale. Peccato che sia una lunghezza più lunga.

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

Ecco una sequenza temporale che ho fatto sulla mia macchina

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 

È possibile salvare un paio di byte usando sample()al posto di runif(), ad es sum(sample(4,2^20,r=T)).
Alex A.

Ho appena fatto alcuni benchmark sul mio computer ed sample()è anche più veloce!
Alex A.

@AlexA. Grazie
testerò

non per necro questo o niente ma non è necessario r=T, Tva bene solo per la sostituzione.
Giuseppe,

1
@Giuseppe, grazie .. questo era davvero vecchio
MickyT il

6

Python 2, 58 byte

Otteniamo 1048576 caratteri casuali dal sistema operativo, prendiamo 2 bit di ciascuno e li sommiamo. L'uso della oslibreria sembra salvare alcuni caratteri rispetto all'uso della randomlibreria.

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

Questo richiede circa 0,2 secondi sul mio PC.


6

CJam, 12 11 byte

YK#_{4mr+}*

Questo è piuttosto diretto:

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)

Ma il bello è che è anche molto veloce! Sulla mia macchina (e usando il compilatore Java ) ci vogliono in media 70 millisecondi.

La versione online impiega circa 1,7 secondi sul mio computer.

Aggiornamento : 1 byte salvato grazie a DocMax


La versione online impiega circa 6 secondi dai computer qui, ma probabilmente è solo la rete e / oi macbook che la scuola insiste nell'usare. Proverò di nuovo quando torno a casa.
SuperJedi224,

@ SuperJedi224 La versione online è tutta in JavaScript, non effettua chiamate di rete. È possibile scaricare la versione Java ed eseguirla utilizzando le istruzioni sul sito Web.
Ottimizzatore

3
A meno che non mi manchi qualcosa (che è purtroppo troppo comune con CJam e me), invece di eseguire il seeding con 0 e aggiungere 1 per 2 ^ 20 corse, seed con 2 ^ 20 per salvare 1 byte:YK#_{4mr+}*
DocMax

@DocMax Hai ragione. Grazie!
Ottimizzatore

+1; Avevo intenzione di pubblicare questa risposta esatta (tranne con 4A#invece di YK#), ma mi hai battuto. :)
Ilmari Karonen,

6

JavaScript (ES6), 54 byte

Tempo medio <100 msec. Esegui snippet per testare (in 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>

Spiegazione

Senza pacchetto statistico integrato, in Javascript il modo più breve per ottenere la somma di 1 milione di numeri casuali è chiamare random () per un milione di volte. Così semplicemente

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
}

Ora, l'aggiunta di 1 per un milione di volte è esattamente la stessa dell'aggiunta di 1 milione o, ancora meglio, inizia la somma con 1 milione e poi aggiungi il resto:

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
}

Quindi golf, rilascia la variabile temp r e rilascia la dichiarazione delle variabili locali. tè un parametro, poiché è necessario accorciare la dichiarazione di f. iè globale (cosa negativa)

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

Quindi trova un modo per evitare il "ritorno" usando una funzione interna senza nome. Come effetto collaterale, otteniamo un altro parametro, quindi non vengono utilizzati globali

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

Non funziona in Chrome. Per testare in FF.
SuperJedi224,

Ovviamente. Chrome è ES5
edc65,

1
Ha un supporto ES6 (la maggior parte dei quali è disponibile solo abilitando javascript sperimentale da chrome: \\ flags), ma non supporta ancora le funzioni freccia
SuperJedi224

5

Perl, 29

Genera una tabella della lunghezza richiesta.

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

Ricevo un errore di sintassi su questo.
SuperJedi224,

Ciò richiede una versione abbastanza nuova di Perl (l'operatore smartmatch è stato introdotto in 5.10.1 e penso che non sia stato reso disponibile per impostazione predefinita fino a dopo).
Segna il

~~non è una smartmatch, solo un'inversione a doppio bit per forzare il contesto scalare. Un modo più lungo di un personaggio sarebbe print$x=map.... Forse sulle versioni più recenti avverte a causa dell'ambiguità con smartmatch, ma sembra funzionare senza avvisi sul mio sistema e qui: ideone.com/LAIWzq
nutki

Sì, funziona su IDEone. Io darò a te.
SuperJedi224,

5

J (12 byte, circa 9,8 millisecondi)

+/>:?4$~2^20

Ho il sospetto che questo sia principalmente un limite di memoria limitato: non riesco nemmeno a ottenere il massimo da un singolo core ...

Puoi testarlo con il seguente codice:

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

Questo lo esegue in 4 gruppi di 20 tracce e restituisce il numero di millisecondi del tempo medio nel gruppo più veloce. Un interprete può essere trovato qui .


4

Pyth, 10 byte

u+GhO4^4TZ

Questo ha un numero leggermente maggiore di byte rispetto alla soluzione Pyth di @ Maltysen. Ma funziona in 8,5 secondi sul mio laptop, mentre la soluzione di @ Maltysen non ha prodotto soluzione in 20 minuti di funzionamento.

Ma ancora un po 'troppo lento per il compilatore online.

Spiegazione

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

Lo proverò questo pomeriggio.
SuperJedi224,

4

Java, 65

Since we have scores listed by language, why not throw Java into the mix? There's not much to golf here, just a simple loop, but I was able to squeeze a couple out of my initial attempt:

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

Will test this this afternoon.
SuperJedi224

No problem. It takes around 80ms on this (slow) PC, but I don't know what you're using to time.
Geobits

I do not believe your program is a correct model. It can and does in my testing add 0 on some rolls. As I understand it most d4's are 1,2,3,4 (no 0 possible).

4
@user39526 s (the total sum) starts at 1<<20 (the number of rolls). This is equivalent to adding one to each roll. When the randomizer throws 0, it's rolled a 1, etc.
Geobits

You should upgrade to Java 8 !codegolf.stackexchange.com/a/52919/7021
RobAu

4

Matlab, 24

First submission ever!

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

I had hoped to make use of randi([1,4],1024), which gives a matrix of 1048576 elements, but then I needed a double sum, which takes more characters than this.

Regarding the running speed mentioned in the question, timeit tells me the runtime is about 0.031 seconds. So, pretty much instant.


I'm getting 0.04 to 0.05 seconds via octave online.
SuperJedi224

4

Haskell, 73 bytes

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

Usage:

$ ghci sourcefile.hs
ghci> f
2622130

4

C#: 105 bytes

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

Nice, I like this even if it's two times wrong. It's 1<<20, not 2<<20. And the second parameter of Random.Next is The *exclusive* upper bound of the range so it should be 5
edc65

@edc65 Thanks for catching those errors. I have updated the answer.
Andrew

1
You could save 9 chars by eliminating a and moving the new System.Random() inside of the Sum. Sure, it will create a new Random every time, but who cares as long as it gives a result?
LegionMammal978

@LegionMammal978 if you create a new Random again and again, the result is mostly non-random
edc65

@edc65 That is why I didn't go that route. I haven't had a chance to test what happens if I followed the suggestion.
Andrew

4

PHP, 38 37 bytes

This uses a very simple idea: sum them all!

Also, I've noticed that 1048576 is 10000000000000000000 in binary, equivalent to 1<<20.

Here's the code:

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

Test in your browser (with VERY LITTLE changes):

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

All the changes in the code are explained in comments.


You can remove the ; after echo$v
Martijn

@Martijn I left it there because most of the time PHP complains about it. But I have removed it now. It works on sandbox.onlinephpfunctions.com and that's enough.
Ismael Miguel

4

Mathematica, 30 27 bytes

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

Mathematica has quite long function names...


3

C, 57 bytes

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

This code works... once. If you ever need to roll those dice again, you'll need to put srand(time(0)) in there, adding 14 bytes.


Why would you need to add srand(time(0))? (Sorry, I don't use C.)
ASCIIThenANSI

@ASCIIThenANSI Many implementations of C's rand seed it to the same value every run. srand seeds the RNG, and time(0) gets the current time in seconds since 1970.
Functino

If you initialize a=b=1<<20 then you can skip 1+, this saves 4 bytes.
nutki

Also, int before main is not required.
nutki

Hint to anybody doing t=0, then t=t (...) +1 for 1048576 times: think again! (see my answer, eventually)
edc65

3

PostgreSQL, 59 bytes

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

I'll admit to the slight problem that random() could, in theory, produce exactly zero, in which case the die roll would be zero.


You don't really need the ; to terminate the query since it is the only one
MickyT

3

Ruby, 32 bytes

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

In a more readable form:

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

It creates a range from 1 to 1048576 and then iterates over the block that many times. Each time the block is executed the value from the previous iteration is passed in as x (initially 0, the default for inject). Each iteration it calculates a random number between 0 and 3 (inclusive), adds one so it simulates rolling a d4 and adds that to the total.

On my machine it's pretty fast to run (0.25 real, 0.22 user, 0.02 sys).

If you've got Ruby installed you can run it with ruby -e 'p (1..2**20).inject{|x|x+rand(4)+1}' (the p is necessary to see the output when run in this manner, omit it if you don't care for that or just run it inside IRB where the result is printed to the screen for you). I've tested it on Ruby 2.1.6.

Thanks to histocrat for the bit twiddling hack that replaces x + rand(4) + 1 with x-~rand(4).


1
Could you explain how it works?
ASCIIThenANSI

The first online interpreter I could find that actually wants to load claims that the method rand() doesn't exist. I'll try to find another one.
SuperJedi224

Okay, I found one that works.
SuperJedi224

Bit twiddling hack: x-~rand(4) is equivalent to x+rand(4)+1.
histocrat

Also, you can replace 2**20 with 4e10.
histocrat

3

PARI/GP, 25 bytes

Really, no need for golfing here -- this is the straightforward way of doing the calculation in GP. It runs in 90 milliseconds on my machine. Hoisting the +1 saves about 20 milliseconds.

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

Just for fun: if one were optimizing for performance in 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;
}

has a very small total operation count -- if xorgens needs ~27 cycles per 64-bit word (can anyone verify this?), then a processor with POPCNT should take only about 0.5 cycle/bit, or a few hundred microseconds for the final number.

This should have close-to-optimal worst-case performance among methods using random numbers of similar or higher quality. It should be possible to greatly increase average speed by combining cases -- maybe a million rolls at a time -- and selecting with (essentially) arithmetic coding.


3

Javascript, 55 53 50 47 41 bytes

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

I didn't realize that non-random numbers were a known irritant, so I figure that I ought to post a real solution. Meant no disrespect.

Commentary: as noted by others above you can skip the +1 to each roll by starting off with the number of rolls in your answer, and by not having to write a=0,i=1<<20 you save two bytes, and another 2 because you don't add +1 to each roll. The parseInt function does the same thing as Math.floor but is 2 characters shorter.


Note that this answer is completely different from the one originally commented on by SuperJedi224 and @Andrew
Ralph Marshall

You can remove both brackets and the last semicolon (and only the last one) to cut down a few further characters. Also, the current version is only 50 characters, not 52.
SuperJedi224

SuperJedi - thanks for the suggestions. I thought I'd tried it without the brackets only to run into problems, but perhaps I had a different problem. In any case, I think this is about as good as it's going to get.
Ralph Marshall

a+=parseInt(Math.random()*4) may be shortened to a+=1+Math.random()*4&7. The 1+ is only if you care if it rolls 0 or not.
Ismael Miguel

You can golf it down to this: for(a=i=1<<20;i--;)a+=(Math.random()*4)|0, that's only 41 bytes
SuperJedi224

2

Clip 10, 12 bytes

r+`m[)r4}#WT

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

It takes approximately 0.6 seconds to run on my machine.


2

Go, 78 bytes

Golfed

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

Still working on it

Run online here http://play.golang.org/p/pCliUpu9Eq


Unfortunately, the golang.org playground doesn't implement the time operations properly and the repl.it one doesn't want to load right now. I'll see what I can do about it this afternoon.
SuperJedi224


2

Commodore Basic, 37 bytes

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

PETSCII substitutions: = SHIFT+E, / = SHIFT+N, = SHIFT+O

Estimated runtime based on runs with lower dice counts: 4.25 hours.

It's tempting to try to golf off two bytes by making C an integer, getting implicit rounding of the random numbers. However, the range on integers in Commodore Basic is -32678 to 32767 -- not enough, when the median answer is 2621440.



2

Ruby, 51 47 chars

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

I looked at all of the answers before I did this, and the sum(2**20 times {randInt(4)}) strategy really stuck out, so I used that.

><>, 76 chars

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

I'm not sure if this one works, because my browser crashed when I tried to test it, but here's the online interpreter.


I'll give you a +1 for the ><> answer.
SuperJedi224

2

Swift, 64 bytes

Nothing clever, golfing in Swift is hard...

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

Version 2 (too late)

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();}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.