Death By Shock Probe: To dużo kości

20

W komiksie internetowym Darths & Droids Pete, który gra R2-D2 w fikcyjnej kampanii RPG, wokół której opiera się komiks, twierdzi kiedyś (ostrzeżenie: potencjalne spoilery w połączonym komiksie), że wraz z Zagubioną Kulą Phanastacorii przygotował się do jego sonda uderzeniowa, teraz może wydać potężną 1048576d4uszkodzenia. (MG nie potwierdził ani nie zaprzeczył temu.) Ponieważ powinno być dość oczywiste, że prawie nikt nie będzie miał cierpliwości, aby rzucić tyloma kostkami, napisz program komputerowy, który zrobi to za niego, przedstawiając całkowitą wartość wyrzuconą w rozsądnych granicach format. Wpisy zostaną uszeregowane według wielkości programu (najkrótszy program, liczba bajtów, wygrane), zarówno w ujęciu ogólnym, jak i według języka, z przerwami w czasie wykonywania. Odpowiedź może być pełną definicją programu lub funkcji.

Wyniki dla poszczególnych języków

Pyt

Maltysen - 8 bajtów *

Jakube - 10 bajtów

APL

Alex A - 10 bajtów

CJam

Optymalizator - 11 bajtów

jot

--ıʇǝɥʇuʎs - 12 bajtów **

Clip10

Ypnypn - 12 bajtów **

K.

JohnE - 13 bajtów

Ti-84 BASIC

SuperJedi224 - 17 bajtów *

R

MickyT - 23 bajty

OCTAVE / MATLAB

Oebele - 24 bajty

PARI / GP

Charles - 25 bajtów **

Wolfram / Mathematica

LegionMammal978 - 27 bajtów

Perl

Nutki - 29 bajtów

AsciiThenAnsii - 34 bajty

Rubin

Haegin - 32 bajty **

ConfusedMr_C - 51 bajtów **

Commodore Basic

Znak - 37 bajtów **

PHP

Ismael Miguel - 38 bajtów

VBA

Sean Cheshire - 40 bajtów **

PowerShell

Nacht - 41 bajtów **

JavaScript

Ralph Marshall - 41 bajtów

edc65 - 54 bajty (wymaga funkcji ES6 nie jest dostępna we wszystkich przeglądarkach).

Lua

kryptych - 51 bajtów

Jawa

RobAu - 52 bajty **

Geobity - 65 bajtów

do

Functino - 57 bajtów

Pyton

CarpetPython - 58 bajtów

Postgre / SQL

Andrew - 59 bajtów **

Szybki

Skrundz - 69 bajtów

GoatInTheMachine - 81 bajtów

Haskell

Zeta - 73 bajty **

ActionScript

Brian - 75 bajtów **

> <>

ConfusedMr_C - 76 bajtów

UDAĆ SIĘ

Kristoffer Sall-Storgaard - 78 bajtów

DO#

Brandon - 91 bajtów **

Andrew - 105 bajtów

Ewan - 148 bajtów

Zadraśnięcie

SuperJedi224 - 102 bajty

C ++

Michelfrancis Bustillos - 154 bajty

Poligloty

Ismael Miguel (JavaScript / ActionScript2) - 67 bajtów


Top 10 ogólnie

Maltysen
Alex A.
Jakube
Optymalizator
ɐɔıʇǝɥʇuʎs / Ypnypn (niepewne zamówienie)
JohnE
SuperJedi224
MickyT
Oebele

Ostrzeżenie - wpisy oznaczone * są BARDZO WOLNE.

Zaprogramowany oznaczony ** Nie byłem jeszcze w stanie poprawnie przetestować

SuperJedi224
źródło
Czekaj, czy muszę podać sumę rzutu kostką, czy tylko wszystkie rzuty na liście?
Maltysen
5
Twoje pytanie, na obecnym etapie, zostanie prawdopodobnie skrytykowane za to, że jest niejasne lub nadmiernie szerokie. Byłoby bardzo pomocne, gdybyś opisał szczegółowo, obiektywnie, w jaki sposób programy będą oceniane i jakie metody powinny mieć dla nich dostępne programy. Ponadto oznaczenie 1048576d4może być niejasne dla niektórych użytkowników. Pomocne byłoby podanie dokładnego opisu tego, co należy obliczyć, oraz wszelkich wytycznych, których należy przestrzegać.
BrainSteel
2
Ten problem można rozwiązać zbyt szybko, aby był to dobry czas.
isaacg
12
Możesz spróbować swoich sił w tworzeniu tabeli liderów fragmentów stosu, aby uniknąć konieczności ręcznego aktualizowania listy zgłoszeń.
Alex A.
1
Absolutnie uwielbiam ten tytuł.
ASCIIThenANSI

Odpowiedzi:

10

Pyth - 9 8 bajtów

Wykorzystuje oczywistą prostą metodę sumowania randinta. Uświadomienie sobie , że zajęło mi chwilę, 1048576było 2^20naprawdę głupie. Dzięki @Jakube za uratowanie mi bajtu przez wskazanie 2^20 = 4^10.

smhO4^4T

Środowisko uruchomieniowe jest okropne, jeszcze nie skończyło się na moim komputerze, więc nie ma sensu uruchamiać go online, więc oto 2^10jeden: wypróbuj go tutaj .

s        Summation
 m       Map
  h      Incr (accounts for 0-indexed randint)
   O4    Randint 4
  ^4T    Four raised to ten
Maltysen
źródło
4
Możliwe jest 8 bajtów. 2^20 = 4^10
Jakube,
@Jakube dzięki za wskazówkę :)
Maltysen
To kończy się natychmiast dla mnie.
Carcigenicate
@Carcigenicate mówisz o linku, który podałem? To zmodyfikowany, tylko sumy 1024d4.
Maltysen
@Maltysen Ups, przepraszam. Tak, o to chodzi.
Carcigenicate
9

Perl - 48 44 37 39 34 bajtów

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

Drukuje sumę bez końcowego znaku nowej linii.
Zaoszczędzono 4 bajty, zastępując 2**20(dzięki Maltysen) i usuwając cudzysłowy wokół wydruku.
Zapisałem kolejne 7 bajtów, przestawiając kod (dzięki Thaylon!)
Straciłem 2 bajty, ponieważ mój stary kod wygenerował 0-4 (powinno być 1-4).
Jeszcze raz zaoszczędziłem 5 bajtów dzięki Caek i nutki.

Nieskluczony, poprawnie napisany kod:

my $s = 0
$s += int( rand(4) + 1 ) for (1 .. 2**20);
print "$s";
ASCIIThenANSI
źródło
Trochę trudno było podłączyć stoper, ale w końcu udało mi się go uruchomić.
SuperJedi224
2
Ponieważ nie obchodzą nas ostrzeżenia ... $ s + = int rand (5) dla (1..2 ** 20); wydrukuj $ s
Thaylon
3
int(rand(5))zwraca zakres od 0 do 4, podczas gdy d4 powinno wynosić od 1 do 4.
nutki
@nutki OK, dziękuję. Zredagowałem to teraz.
ASCIIThenANSI
$s+=int rand(4)+1for(1..2**20);print$sUsunięcie nawiasu dla int również działa dla mnie, aby zapisać skok.
Caek
7

APL, 11 10 bajtów

+/?4⍴⍨2*20

To po prostu bierze sumę tablicy 2 20 = 1048576 losowych liczb całkowitych od 1 do 4.

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

Możesz to przetestować na TryAPL , drukując znacznik czasu przed i po. Zajmuje to około 0,02 sekundy.

Zaoszczędzono bajt dzięki marinus i FUZxxl!

Alex A.
źródło
Jeden i 5 ??? K4 może dać 1, 2, 3 lub 4. Nie możesz dostać 5.
Loren Pechtel 30.04.2015
@LorenPechtel: Przepraszam, mój zły. Dzięki za zwrócenie na to uwagi. Teraz jest naprawione. Mam zmęczony mózg.
Alex A.
Zapisz bajt:+/?4⍴⍨2*20
marinus
Mała poprawa: +/?4⍴⍨2*20zamiast tego użyj .
FUZxxl
1
Czasami ta odpowiedź nie jest w żaden sposób golfa: byłaby napisana dokładnie tak samo w produkcyjnym kodzie APL.
FUZxxl,
7

Ti-84 Basic, 17 bajtów

Całkowity ślad - Rozmiar nagłówka programu = 17 bajtów

Czas pracy: nieznany, szacowany na 5-6 godzin na podstawie wydajności dla mniejszej liczby rolek (więc w zasadzie niezbyt dobry)

Σ (randInt (1,4), A, 1,2 ^ 20
SuperJedi224
źródło
1
+1 za uruchomienie go na TI-84. Wydaje mi się, że czas nie stanowi tutaj problemu, są to już kalkulatory w wieku 30–40 lat.
ASCIIThenANSI
Zakładam, że istnieje funkcja próbkowania rozkładu normalnego zamiast jednolitego? Powinno być znacznie szybsze.
Ben Voigt,
@BenVoigt: Ponieważ ma to na celu symulację rzutu kostkami, normalny rozkład nie jest właściwy; musiałoby być jednolite.
Alex A.
2
@AlexA .: Twierdzenie o limicie centralnym stanowi, że suma wielu jednorodnych kości jest nie do odróżnienia od rozkładu normalnego. To zależy od tego, jak pedantycznie jesteśmy w kwestii „symulowania toczenia”.
Ben Voigt
1
@MIWright, myślałem, że to tylko komunikacja. Przynajmniej ten, który mam, używa baterii AAA.
Arturo Torres Sánchez
7

R, 32 24 23 21 bajtów

Edycja: Pozbyłem się as.integeri użyłem podziału na liczby całkowite %/%. Przyspiesz nieznacznie.

Dzięki Alex A za końcówkę próbki ... i Giuseppe za usunięcie r=

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

Testowane z

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)

Wyjścia

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

Aby uzyskać czystą prędkość, należy wykonać następujące czynności w mikrosekundach. Jednak nie jestem pewien, czy moja logika jest poprawna. Wyniki wydają się zgodne z metodą losową. Szkoda, że ​​to dłuższa długość.

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

Oto przebieg pomiaru czasu na moim komputerze

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 
MickyT
źródło
Możesz zapisać kilka bajtów, używając sample()zamiast runif(), tj sum(sample(4,2^20,r=T)).
Alex A.
Właśnie przeprowadziłem testy porównawcze na moim komputerze i sample()faktycznie jest też szybszy!
Alex A.
@AlexA. Dzięki przetestuję i zmienię, gdy
zbliżę się
aby nie nekrować tego lub czegokolwiek, ale nie potrzebujesz r=T, po prostu Tjest w porządku do wymiany.
Giuseppe,
1
@Giuseppe, dzięki .. to naprawdę był stary
MickyT
6

Python 2, 58 bajtów

Otrzymujemy 1048576 losowych znaków z systemu operacyjnego, pobieramy po 2 bity i dodajemy. Korzystanie z osbiblioteki pozwala zaoszczędzić kilka znaków przed użyciem randombiblioteki.

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

To zajmuje około 0,2 sekundy na moim komputerze.

Logic Knight
źródło
6

CJam, 12 11 bajtów

YK#_{4mr+}*

To jest całkiem proste:

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)

Ale piękno tego polega na tym, że jest też naprawdę szybki! Na moim komputerze (i przy użyciu kompilatora Java ) zajmuje to średnio 70 milisekund.

Wersja online zajmuje około 1,7 sekundy na moim komputerze.

Aktualizacja : 1 bajt zapisany dzięki DocMax

Optymalizator
źródło
Wersja online zajmuje około 6 sekund z komputerów tutaj, ale prawdopodobnie jest to tylko sieć i / lub macbooki, z których szkoła chce korzystać. Spróbuję ponownie, kiedy wrócę do domu.
SuperJedi224
@ SuperJedi224 Wersja online jest w JavaScript, nie wykonuje żadnych połączeń sieciowych. Możesz pobrać wersję Java i uruchomić ją, postępując zgodnie z instrukcjami na stronie internetowej.
Optymalizator
3
Chyba, że ​​coś mi brakuje (co jest niestety zbyt częste w CJam i dla mnie), zamiast wysiewać z 0 i dodawać 1 dla 2 ^ 20 przebiegów, YK#_{4mr+}*
seeduj
@DocMax Masz rację. Dzięki!
Optymalizator
+1; Zamierzałem opublikować tę dokładną odpowiedź (z wyjątkiem 4A#zamiast zamiast YK#), ale pobiłaś mnie. :)
Ilmari Karonen
6

JavaScript (ES6), 54 bajty

Średni czas <100 ms Uruchom fragment kodu, aby przetestować (w przeglądarce 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>

Wyjaśnienie

Bez wbudowanego pakietu statystycznego, w Javascripcie najkrótszym sposobem uzyskania sumy 1 miliona liczb losowych jest milionowe wywołanie random (). Po prostu

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
}

Teraz dodanie 1 miliona razy jest dokładnie takie samo jak dodanie 1 miliona, a nawet lepiej, zacznij sumę od 1 miliona, a następnie dodaj resztę:

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
}

Następnie golf, upuść zmienną temp r i upuść deklarację zmiennych lokalnych. tjest parametrem, ponieważ potrzebny jest do skrócenia deklaracji f. ijest globalny (zła rzecz)

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

Następnie znajdź sposób na uniknięcie „powrotu” za pomocą bezimiennej funkcji wewnętrznej. Jako efekt uboczny uzyskujemy kolejny parametr, więc nie używa się globałów

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
edc65
źródło
Nie działa w chromie. O test w FF.
SuperJedi224
Oczywiście. Chrome jest ES5
edc65
1
Ma pewne wsparcie ES6 (większość jest dostępna tylko po włączeniu eksperymentalnego javascript z chrome: \\ flags), ale nie obsługuje jeszcze funkcji strzałek
SuperJedi224
5

Perl, 29

Generuje tabelę o wymaganej długości.

print~~map{0..rand 4}1..2**20
nutki
źródło
Otrzymuję błąd składniowy w tym przypadku.
SuperJedi224,
Wymaga to wystarczająco nowej wersji Perla (operator smartmatch został wprowadzony w 5.10.1 i myślę, że nie był domyślnie udostępniany później).
Mark
~~to nie jest smartmatch, tylko dwukrotna inwersja, aby wymusić kontekst skalarny. Dalsza droga byłaby jedną postacią print$x=map.... Może w nowszych wersjach ostrzega z powodu niejednoznaczności z smartmatch, ale wydaje się, że działa bez ostrzeżeń w moim systemie i tutaj: ideone.com/LAIWzq
nutki
Tak, działa na IDEone. Dam ci to.
SuperJedi224
5

J (12 bajtów, około 9,8 milisekund)

+/>:?4$~2^20

Podejrzewam, że jest to głównie ograniczenie przepustowości pamięci: nie mogę nawet zmaksymalizować jednego rdzenia ...

Możesz to przetestować za pomocą następującego kodu:

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

Prowadzi to do 4 grup po 20 tras i zwraca liczbę milisekund średniego czasu w najszybszej grupie. Tłumacz można znaleźć tutaj .

.ıʇǝɥʇuʎs
źródło
4

Pyth, 10 bajtów

u+GhO4^4TZ

Ma to nieco więcej bajtów niż rozwiązanie Pyth @ Maltysen. Ale działa na 8,5 sekundy na moim laptopie, podczas gdy rozwiązanie @ Maltysen nie wyprodukowało żadnego rozwiązania w ciągu 20 minut.

Ale wciąż jest trochę za wolny dla kompilatora online.

Wyjaśnienie

u     ^4TZ   start with G = 0, for H in 0, ... 4^10-1:
                G = 
 +GhO4              G + (rand_int(4) + 1)
             result is printed implicitly 
Jakube
źródło
Przetestuję dziś po południu.
SuperJedi224
4

Java, 65

Skoro mamy wyniki wymienione według języka, dlaczego nie wrzucić Java do miksu? Nie ma tu dużo golfa, tylko prosta pętla, ale udało mi się wycisnąć kilka z mojej pierwszej próby:

int f(){int i=1<<20,s=i;while(i-->0)s+=Math.random()*4;return s;}
Geobity
źródło
Przetestuję dziś po południu.
SuperJedi224
Nie ma problemu. Na tym (wolnym) komputerze trwa to około 80 ms, ale nie wiem, czego używasz do tego czasu.
Geobits
Nie wierzę, że twój program jest poprawnym modelem. W moich testach może i dodaje 0 w niektórych rolkach. Jak rozumiem, większość d4 to 1,2,3,4 (nie ma możliwości 0).
4
@ użytkownik39526 s(łączna suma) zaczyna się od 1<<20(liczba rolek). Jest to równoważne z dodaniem jednego do każdego rzutu. Kiedy randomizator rzuca 0, rzuca 1, itd.
Geobity
Powinieneś uaktualnić do Java 8! codegolf.stackexchange.com/a/52919/7021
RobAu
4

Matlab, 24

Pierwsze zgłoszenie w historii!

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

Miałem nadzieję, że skorzystam z randi ([1,4], 1024), która daje macierz 1048576 elementów, ale potem potrzebowałem podwójnej sumy, która zajmuje więcej znaków niż to.

Jeśli chodzi o prędkość biegu wspomnianą w pytaniu, timeitmówi mi, że czas działania wynosi około 0,031 sekundy. Tak więc prawie natychmiast.

Oebele
źródło
Dostaję 0,04 do 0,05 sekundy za pośrednictwem oktawy online.
SuperJedi224
4

Haskell, 73 bajty

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

Stosowanie:

$ ghci sourcefile.hs
ghci> f
2622130
Zeta
źródło
4

C #: 105 bajtów

using System.Linq;class C{int D(){var a=new System.Random();return new int[1<<20].Sum(i=>a.Next(1,5));}}
Andrzej
źródło
Fajnie, podoba mi się to, nawet jeśli jest dwa razy źle. To 1 << 20, a nie 2 << 20. Drugim parametrem Random.Next jest The *exclusive* upper bound of the rangewięc 5
edc65
@ edc65 Dziękujemy za wyłapanie tych błędów. Zaktualizowałem odpowiedź.
Andrew
1
Możesz zapisać 9 znaków, eliminując ai przesuwając new System.Random()wnętrze Sum. Jasne, za Randomkażdym razem stworzy nowy , ale kogo to obchodzi, o ile daje to wynik?
LegionMammal978
@ LegionMammal978, jeśli ciągle tworzysz nowy Losowy, wynik jest w większości nieprzypadkowy
edc65
@ edc65 Dlatego nie poszedłem tą drogą. Nie miałem okazji sprawdzić, co się stanie, jeśli zastosuję się do sugestii.
Andrew
4

PHP, 38 37 bajtów

Wykorzystuje to bardzo prosty pomysł: zsumuj je wszystkie!

Zauważyłem też, że 1048576jest to 10000000000000000000binarny odpowiednik 1<<20.

Oto kod:

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

Przetestuj w przeglądarce (z bardzo małymi zmianami):

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

Wszystkie zmiany w kodzie są wyjaśnione w komentarzach.

Ismael Miguel
źródło
Możesz usunąć ;poecho$v
Martijn
@Martijn Zostawiłem go tam, ponieważ przez większość czasu PHP narzeka. Ale teraz go usunąłem. Działa na sandbox.onlinephpfunctions.com i to wystarczy.
Ismael Miguel
4

Mathematica, 30 27 bajtów

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

Mathematica ma dość długie nazwy funkcji ...

LegionMammal978
źródło
3

C, 57 bajtów

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

Ten kod działa ... raz. Jeśli kiedykolwiek trzeba ponownie toczyć te kości, musisz umieścić srand(time(0))tam, dodając 14 bajtów.

Functino
źródło
Dlaczego warto dodać srand(time(0))? (Przepraszam, nie używam C.)
ASCIIThenANSI 30.04.15
@ASCIIThenANSI Wiele implementacji C- randseed za każdym razem ma tę samą wartość. srandtime(0)
uruchamia
Jeśli zainicjujesz a=b=1<<20, możesz pominąć 1+, to oszczędza 4 bajty.
nutki
Również intwcześniej mainnie jest wymagane.
nutki
Wskazówka dla każdego t=0, kto robi , a następnie t=t (...) +11048576 razy: pomyśl jeszcze raz! (ostatecznie zobacz moją odpowiedź)
edc65
3

PostgreSQL, 59 bajtów

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

Przyznaję się do drobnego problemu, random()który teoretycznie mógłby dać dokładnie zero, w którym to przypadku rzut matrycy wynosiłby zero.

Andrzej
źródło
Naprawdę nie potrzebujesz, ;aby zakończyć zapytanie, ponieważ jest to jedyne
MickyT
3

Rubinowy, 32 bajty

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

W bardziej czytelnej formie:

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

Tworzy zakres od 1 do 1048576, a następnie tyle razy iteruje blok. Za każdym razem, gdy blok jest wykonywany, wartość z poprzedniej iteracji jest przekazywana jako x(początkowo 0, domyślnie dlainject ). Każda iteracja oblicza liczbę losową od 0 do 3 (włącznie), dodaje jedną, symulując rzut d4 i dodaje ją do sumy.

Na moim komputerze jest dość szybki do uruchomienia (0.25 real, 0.22 user, 0.02 sys ).

Jeśli masz zainstalowany Ruby, możesz go uruchomić z ruby -e 'p (1..2**20).inject{|x|x+rand(4)+1}'(p konieczne jest, aby zobaczyć wynik, gdy jest uruchamiany w ten sposób, pomiń go, jeśli cię to nie obchodzi, lub po prostu uruchom go w IRB, gdzie wynik jest drukowany na ekranie dla Ciebie). Przetestowałem to na Ruby 2.1.6.

Dzięki histocrat dla bitowym twiddling hack, który zastępuje x + rand(4) + 1z x-~rand(4).

Haegin
źródło
1
Czy możesz wyjaśnić, jak to działa?
ASCIIThenANSI
Pierwszy znaleziony przeze mnie interpreter online, który faktycznie chce załadować, twierdzi, że metoda rand () nie istnieje. Spróbuję znaleźć inny.
SuperJedi224
Ok, znalazłem taki, który działa.
SuperJedi224
Bit twiddling hack: x-~rand(4)jest równoważny z x+rand(4)+1.
histokrata
Ponadto, można wymienić 2**20z 4e10.
histokrata
3

PARI / GP, 25 bajtów

Naprawdę nie ma tu potrzeby gry w golfa - jest to prosty sposób na wykonanie obliczeń w GP. Działa na mojej maszynie w 90 milisekund. Podnoszenie +1oszczędza około 20 milisekund.

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

Dla zabawy: jeśli ktoś optymalizuje wydajność w 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;
}

ma bardzo małą całkowitą liczbę operacji - jeśli xorgens potrzebuje ~ 27 cykli na 64-bitowe słowo (czy ktoś może to zweryfikować?), to procesor z POPCNT powinien zająć tylko około 0,5 cyklu / bit, lub kilkaset mikrosekund do końcowego numer.

Powinno to mieć prawie optymalną wydajność w najgorszym przypadku wśród metod wykorzystujących losowe liczby o podobnej lub wyższej jakości. Powinno być możliwe znaczne zwiększenie średniej prędkości poprzez łączenie przypadków - może milion rolek na raz - i wybieranie z (zasadniczo) kodowaniem arytmetycznym .

Charles
źródło
3

JavaScript, 55 53 50 47 41 bajtów

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

Nie zdawałem sobie sprawy, że liczby nieprzypadkowe są znanym czynnikiem drażniącym, więc sądzę, że powinienem opublikować prawdziwe rozwiązanie. Oznacza brak szacunku.

Komentarz: jak zauważyli inni powyżej, możesz pominąć +1 do każdego rzutu, zaczynając od liczby rzutów w swojej odpowiedzi i nie musząc pisać a = 0, i = 1 << 20 oszczędzasz dwa bajty, i kolejne 2, ponieważ nie dodajesz +1 do każdego rzutu. Funkcja parseInt działa tak samo jak Math.floor, ale ma 2 znaki krótsze.

Ralph Marshall
źródło
Zauważ, że ta odpowiedź jest zupełnie inna niż ta pierwotnie skomentowana przez SuperJedi224 i @Andrew
Ralph Marshall
Możesz usunąć zarówno nawiasy, jak i ostatni średnik (i tylko ostatni), aby wyciąć kilka kolejnych znaków. Obecna wersja ma tylko 50 znaków, a nie 52.
SuperJedi224
SuperJedi - dzięki za sugestie. Myślałem, że wypróbowałem to bez nawiasów, ale wpadłem na problemy, ale być może miałem inny problem. W każdym razie myślę, że jest to tak dobre, jak to możliwe.
Ralph Marshall
a+=parseInt(Math.random()*4)może zostać skrócony do a+=1+Math.random()*4&7. Jest 1+tak tylko wtedy, gdy zależy Ci na tym, czy wyrzuci 0, czy nie.
Ismael Miguel
Możesz zagrać w golfa do tego: for(a=i=1<<20;i--;)a+=(Math.random()*4)|0to tylko 41 bajtów
SuperJedi224
2

Klip 10 , 12 bajtów

r+`m[)r4}#WT

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

Uruchomienie mojego komputera zajmuje około 0,6 sekundy.

Ypnypn
źródło
2

Idź, 78 bajtów

Grał w golfa

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

Nadal nad tym pracuję

Uruchom online tutaj http://play.golang.org/p/pCliUpu9Eq

Kristoffer Sall-Storgaard
źródło
Niestety, boisko golang.org nie implementuje poprawnie operacji czasu, a repl.it nie chce się teraz ładować. Zobaczę, co mogę z tym zrobić dziś po południu.
SuperJedi224,
2

Idź, 87 bajtów

Naiwne rozwiązanie

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

Uruchom online tutaj: http://play.golang.org/p/gwP5Os7_Sq

Ze względu na sposób działania placu zabaw Go musisz ręcznie zmienić ziarno (czas jest zawsze taki sam)

Kristoffer Sall-Storgaard
źródło
2

Commodore Basic, 37 bajtów

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

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

Szacowany czas działania na podstawie przebiegów z mniejszą liczbą kości: 4,25 godziny.

Kusząca jest próba odłożenia dwóch bajtów w golfa, tworząc Cliczbę całkowitą i domyślnie zaokrąglając liczby losowe. Jednak zakres liczb całkowitych w Commodore Basic wynosi od -32678 do 32767 - to za mało, gdy mediana odpowiedzi wynosi 2621440.

znak
źródło
2

PowerShell, 41 37 bytes

1..1mb|%{(get-random)%4+1}|measure -s

Took my machine 2 minutes 40 seconds

Nacht - Reinstate Monica
źródło
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.

clap
źródło
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)
GoatInTheMachine
źródło
2

Java (Java 8) - 52

int f(){return new Random().ints(1<<20,1,5).sum();}
RobAu
źródło