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ć
1048576d4
moż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ć.Odpowiedzi:
Pyth -
98 bajtówWykorzystuje oczywistą prostą metodę sumowania randinta. Uświadomienie sobie , że zajęło mi chwilę,
1048576
było2^20
naprawdę głupie. Dzięki @Jakube za uratowanie mi bajtu przez wskazanie2^20 = 4^10
.Ś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^10
jeden: wypróbuj go tutaj .źródło
2^20 = 4^10
1024d4
.Perl -
4844373934 bajtówDrukuje 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:
źródło
int(rand(5))
zwraca zakres od 0 do 4, podczas gdy d4 powinno wynosić od 1 do 4.$s+=int rand(4)+1for(1..2**20);print$s
Usunięcie nawiasu dla int również działa dla mnie, aby zapisać skok.APL,
1110 bajtówTo po prostu bierze sumę tablicy 2 20 = 1048576 losowych liczb całkowitych od 1 do 4.
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!
źródło
+/?4⍴⍨2*20
+/?4⍴⍨2*20
zamiast tego użyj .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)
źródło
R,
32242321 bajtówEdycja: Pozbyłem się
as.integer
i 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=
Testowane z
Wyjścia
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ść.
Oto przebieg pomiaru czasu na moim komputerze
źródło
sample()
zamiastrunif()
, tjsum(sample(4,2^20,r=T))
.sample()
faktycznie jest też szybszy!r=T
, po prostuT
jest w porządku do wymiany.Python 2, 58 bajtów
Otrzymujemy 1048576 losowych znaków z systemu operacyjnego, pobieramy po 2 bity i dodajemy. Korzystanie z
os
biblioteki pozwala zaoszczędzić kilka znaków przed użyciemrandom
biblioteki.To zajmuje około 0,2 sekundy na moim komputerze.
źródło
CJam,
1211 bajtówTo jest całkiem proste:
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
źródło
YK#_{4mr+}*
4A#
zamiast zamiastYK#
), ale pobiłaś mnie. :)JavaScript (ES6), 54 bajty
Średni czas <100 ms Uruchom fragment kodu, aby przetestować (w przeglądarce Firefox)
Wyjaśnienie
Bez wbudowanego pakietu statystycznego, w Javascripcie najkrótszym sposobem uzyskania sumy 1 miliona liczb losowych jest milionowe wywołanie random (). Po prostu
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ę:
Następnie golf, upuść zmienną temp r i upuść deklarację zmiennych lokalnych.
t
jest parametrem, ponieważ potrzebny jest do skrócenia deklaracjif
.i
jest globalny (zła rzecz)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
źródło
Perl, 29
Generuje tabelę o wymaganej długości.
źródło
~~
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/LAIWzqJ (12 bajtów, około 9,8 milisekund)
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:
Prowadzi to do 4 grup po 20 tras i zwraca liczbę milisekund średniego czasu w najszybszej grupie. Tłumacz można znaleźć tutaj .
źródło
Pyth, 10 bajtów
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
źródło
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:
źródło
s
(łączna suma) zaczyna się od1<<20
(liczba rolek). Jest to równoważne z dodaniem jednego do każdego rzutu. Kiedy randomizator rzuca 0, rzuca 1, itd.Matlab, 24
Pierwsze zgłoszenie w historii!
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,
timeit
mówi mi, że czas działania wynosi około 0,031 sekundy. Tak więc prawie natychmiast.źródło
Haskell, 73 bajty
Stosowanie:
źródło
C #: 105 bajtów
źródło
The *exclusive* upper bound of the range
więc 5a
i przesuwającnew System.Random()
wnętrzeSum
. Jasne, zaRandom
każdym razem stworzy nowy , ale kogo to obchodzi, o ile daje to wynik?PHP,
3837 bajtówWykorzystuje to bardzo prosty pomysł: zsumuj je wszystkie!
Zauważyłem też, że
1048576
jest to10000000000000000000
binarny odpowiednik1<<20
.Oto kod:
Przetestuj w przeglądarce (z bardzo małymi zmianami):
Pokaż fragment kodu
Wszystkie zmiany w kodzie są wyjaśnione w komentarzach.
źródło
;
poecho$v
Mathematica,
3027 bajtówMathematica ma dość długie nazwy funkcji ...
źródło
C, 57 bajtów
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.źródło
srand(time(0))
? (Przepraszam, nie używam C.)rand
seed za każdym razem ma tę samą wartość.srand
time(0)
a=b=1<<20
, możesz pominąć1+
, to oszczędza 4 bajty.int
wcześniejmain
nie jest wymagane.t=0
, kto robi , a następniet=t (...) +1
1048576 razy: pomyśl jeszcze raz! (ostatecznie zobacz moją odpowiedź)PostgreSQL, 59 bajtów
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.źródło
;
aby zakończyć zapytanie, ponieważ jest to jedyneRubinowy, 32 bajty
W bardziej czytelnej formie:
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) + 1
zx-~rand(4)
.źródło
x-~rand(4)
jest równoważny zx+rand(4)+1
.2**20
z4e10
.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
+1
oszczędza około 20 milisekund.Dla zabawy: jeśli ktoś optymalizuje wydajność w PARI,
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 .
źródło
JavaScript,
5553504741 bajtówNie 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.
źródło
a+=parseInt(Math.random()*4)
może zostać skrócony doa+=1+Math.random()*4&7
. Jest1+
tak tylko wtedy, gdy zależy Ci na tym, czy wyrzuci 0, czy nie.for(a=i=1<<20;i--;)a+=(Math.random()*4)|0
to tylko 41 bajtówKlip 10 , 12 bajtów
Uruchomienie mojego komputera zajmuje około 0,6 sekundy.
źródło
Idź, 78 bajtów
Grał w golfa
Nadal nad tym pracuję
Uruchom online tutaj http://play.golang.org/p/pCliUpu9Eq
źródło
Idź, 87 bajtów
Naiwne rozwiązanie
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)
źródło
Commodore Basic, 37 bajtów
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
C
liczbę 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.źródło
PowerShell,
4137 bytesTook my machine 2 minutes 40 seconds
źródło
Ruby,
5147 charsI 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
I'm not sure if this one works, because my browser crashed when I tried to test it, but here's the online interpreter.
źródło
Swift, 64 bytes
Nothing clever, golfing in Swift is hard...
Version 2 (too late)
źródło
Java (Java 8) - 52
źródło