Dalam webcomic Darths & Droids , Pete, yang memerankan R2-D2 dalam kampanye roleplaying fiktif yang menjadi dasar komiknya, pernah mengklaim (peringatan: spoiler potensial dalam komik terkait) yang, dengan Lost Orb of Phanastacoria yang disesuaikan dengan bukunya Probe shock, ia sekarang bisa mengeluarkan 1048576d4 kekalahankerusakan. (GM tidak membenarkan atau menyangkal hal ini.) Karena seharusnya cukup jelas bahwa hampir tidak ada yang benar-benar akan memiliki kesabaran untuk melempar dadu sebanyak itu, tulis sebuah program komputer untuk melakukannya untuknya, mengeluarkan total nilai yang digulirkan dalam beberapa hal yang masuk akal format. Entri akan diberi peringkat berdasarkan ukuran program (program terpendek, dengan jumlah byte, menang), baik keseluruhan maupun per-bahasa, dengan run time breaking ties. Jawaban dapat berupa program lengkap atau definisi fungsi.
Skor Per-Bahasa
Pyth
Maltysen - 8 byte *
Jakube - 10 byte
APL
Alex A - 10 byte
CJam
Pengoptimal - 11 byte
J
ɐɔıʇǝɥʇuʎs - 12 byte **
Klip10
Ypnypn - 12 byte **
K
JohnE - 13 byte
Ti-84 BASIC
SuperJedi224 - 17 byte *
R
MickyT - 23 byte
OCTAVE / MATLAB
Oebele - 24 byte
PARI / GP
Charles - 25 byte **
Wolfram / Mathematica
LegionMammal978 - 27 byte
Perl
Nutki - 29 byte
AsciiThenAnsii - 34 byte
Rubi
Haegin - 32 byte **
ConfusedMr_C - 51 byte **
Commodore Basic
Tandai - 37 byte **
PHP
Ismael Miguel - 38 byte
VBA
Sean Cheshire - 40 byte **
PowerShell
Nacht - 41 byte **
Javascript
Ralph Marshall - 41 byte
edc65 - 54 bytes (Membutuhkan fungsionalitas ES6 tidak tersedia di semua browser.)
Lua
cryptych - 51 byte
Jawa
RobAu - 52 byte **
Geobits - 65 byte
C
Functino - 57 byte
Python
CarpetPython - 58 byte
Postgre / SQL
Andrew - 59 byte **
Cepat
Skrundz - 69 byte
GoatInTheMachine - 81 byte
Haskell
Zeta - 73 byte **
ActionScript
Brian - 75 byte **
> <>
ConfusedMr_C - 76 byte
PERGI
Kristoffer Sall-Storgaard - 78 byte
C #
Brandon - 91 byte **
Andrew - 105 byte
Ewan - 148 byte
Menggaruk
SuperJedi224 - 102 byte
C ++
Michelfrancis Bustillos - 154 byte
Poliglot
Ismael Miguel (Javascript / ActionScript2) - 67 byte
10 Besar Keseluruhan
Maltysen Alex A Jakube Pengoptimal ɐɔıʇǝɥʇuʎs / Ypnypn (pesanan tidak pasti) JohnE SuperJedi224 MickyT Oebele
Peringatan- entri yang ditandai dengan * SANGAT LAMBAT.
Diprogram bertanda ** Saya belum dapat menguji dengan benar
1048576d4
mungkin tidak jelas untuk beberapa pengguna. Akan sangat membantu untuk memberikan deskripsi tentang apa yang harus dihitung, dan pedoman apa saja yang harus diikuti.Jawaban:
Pyth -
98 byteMenggunakan metode penjumlahan randint yang jelas dan sederhana. Butuh waktu beberapa menit untuk saya sadari
1048576
adalah2^20
, sekarang saya merasa benar-benar bodoh. Terima kasih kepada @Jakube karena telah menyelamatkan saya satu byte dengan menunjukkan2^20 = 4^10
.Runtime itu mengerikan, belum selesai di komputer saya, jadi tidak ada gunanya menjalankannya secara online, jadi inilah masalahnya
2^10
: Coba online di sini .sumber
2^20 = 4^10
1024d4
.Perl -
4844373934 byteMencetak jumlah tanpa baris baru.
Disimpan 4 byte dengan menggantikan
2**20
(terima kasih Maltysen) dan menghapus tanda kutip di cetak.Menyimpan 7 byte lainnya dengan mengatur ulang kode (terima kasih Thaylon!)
Kehilangan 2 byte karena kode lama saya menghasilkan 0-4 (seharusnya 1-4).
Sekali lagi, disimpan 5 byte berkat Caek dan nutki.
Kode tidak tertulis, ditulis dengan benar:
sumber
int(rand(5))
mengembalikan kisaran 0 hingga 4 sementara d4 harus 1 hingga 4.$s+=int rand(4)+1for(1..2**20);print$s
Menghapus tanda kurung untuk int juga bekerja untuk saya, untuk menghemat stroke.APL,
1110 byteIni hanya mengambil jumlah array 2 20 = 1048576 bilangan bulat acak antara 1 dan 4.
Anda dapat membandingkan ini di TryAPL dengan mencetak stempel waktu sebelum dan sesudah. Dibutuhkan sekitar 0,02 detik.
Menyimpan satu byte berkat marinus dan FUZxxl!
sumber
+/?4⍴⍨2*20
+/?4⍴⍨2*20
saja.Ti-84 Basic, 17 byte
Total jejak - Ukuran tajuk program = 17 byte
Durasi: Tidak diketahui, diperkirakan 5-6 jam berdasarkan kinerja untuk jumlah gulungan yang lebih kecil (jadi, pada dasarnya, tidak terlalu baik)
sumber
R,
32242321 byteSunting: Singkirkan
as.integer
divisi integer yang digunakan dan%/%
. Percepat sedikit.Terima kasih kepada Alex A untuk tip sampel ... dan Giuseppe untuk menghapus
r=
Diuji dengan
Keluaran
Untuk kecepatan murni berikut ini selesai dalam mikrodetik. Namun saya tidak yakin logika saya benar untuk itu. Hasilnya tampak konsisten dengan metode acak. Malu itu lebih panjang.
Inilah waktu yang saya lakukan pada mesin saya
sumber
sample()
menggantikanrunif()
, yaitusum(sample(4,2^20,r=T))
.sample()
sebenarnya lebih cepat juga!r=T
,T
baik-baik saja untuk penggantian.Python 2, 58 byte
Kami mendapatkan 1048576 karakter acak dari sistem operasi, ambil masing-masing 2 bit, dan tambahkan. Menggunakan
os
perpustakaan tampaknya menyimpan beberapa karakter daripada menggunakanrandom
perpustakaan.Ini memakan waktu sekitar 0,2 detik pada PC saya.
sumber
CJam,
1211 byteIni foward cukup lurus:
Tetapi keindahan dari ini adalah sangat cepat juga! Di mesin saya (dan menggunakan kompiler Java ) dibutuhkan rata-rata 70 milidetik.
Versi online membutuhkan sekitar 1,7 detik di mesin saya.
Pembaruan : 1 byte disimpan berkat DocMax
sumber
YK#_{4mr+}*
4A#
bukannyaYK#
), tetapi Anda mengalahkan saya untuk itu. :)JavaScript (ES6), 54 byte
Waktu rata-rata <100 msec. Jalankan cuplikan untuk menguji (di Firefox)
Penjelasan
Tanpa paket statistik bawaan, dalam Javascript cara terpendek untuk mendapatkan jumlah 1 juta nomor acak adalah dengan memanggil acak () sebanyak sejuta kali. Sangat sederhana
Sekarang, menambahkan 1 untuk satu juta kali sama persis dengan menambahkan 1 juta, atau bahkan lebih baik, mulai jumlah dengan 1 juta dan kemudian tambahkan sisanya:
Kemudian golf, drop variabel temp r dan drop deklarasi variabel lokal.
t
adalah parameter, karena diperlukan untuk mempersingkat deklarasif
.i
bersifat global (hal buruk)Kemudian temukan cara untuk menghindari 'kembali' menggunakan fungsi batin tanpa nama. Sebagai efek samping, kami mendapatkan parameter lain sehingga tidak ada global yang digunakan
sumber
Perl, 29
Menghasilkan tabel dengan panjang yang dibutuhkan.
sumber
~~
bukan smartmatch, hanya inversi bit ganda untuk memaksa konteks skalar. Cara satu karakter lebih lamaprint$x=map...
. Mungkin pada versi yang lebih baru itu memperingatkan karena ambiguitas dengan smartmatch, tapi tampaknya untuk bekerja tanpa peringatan pada sistem saya dan di sini: ideone.com/LAIWzqJ (12 byte, sekitar 9,8 milidetik)
Saya curiga ini sebagian besar terbatas pada memory bandwith: Saya bahkan tidak bisa memaksimalkannya dengan single core ...
Anda dapat menguji ini dengan kode berikut:
Ini dijalankan dalam 4 grup dengan 20 jalur, dan mengembalikan jumlah milidetik dari waktu rata-rata dalam grup tercepat. Seorang juru bahasa dapat ditemukan di sini .
sumber
Pyth, 10 byte
Ini memiliki sedikit lebih banyak byte daripada solusi Pyth @ Maltysen. Tapi itu berjalan dalam 8,5 detik pada laptop saya, sedangkan solusi @ Maltysen tidak menghasilkan solusi dalam 20 menit waktu berjalan.
Tetapi masih sedikit terlalu lambat untuk kompiler online.
Penjelasan
sumber
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:
sumber
s
(the total sum) starts at1<<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.Matlab, 24
First submission ever!
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.sumber
Haskell, 73 bytes
Usage:
sumber
C#: 105 bytes
sumber
The *exclusive* upper bound of the range
so it should be 5a
and moving thenew System.Random()
inside of theSum
. Sure, it will create a newRandom
every time, but who cares as long as it gives a result?PHP,
3837 bytesThis uses a very simple idea: sum them all!
Also, I've noticed that
1048576
is10000000000000000000
in binary, equivalent to1<<20
.Here's the code:
Test in your browser (with VERY LITTLE changes):
Show code snippet
All the changes in the code are explained in comments.
sumber
;
afterecho$v
Mathematica,
3027 bytesMathematica has quite long function names...
sumber
C, 57 bytes
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.sumber
srand(time(0))
? (Sorry, I don't use C.)rand
seed it to the same value every run.srand
seeds the RNG, andtime(0)
gets the current time in seconds since 1970.a=b=1<<20
then you can skip1+
, this saves 4 bytes.int
beforemain
is not required.t=0
, thent=t (...) +1
for 1048576 times: think again! (see my answer, eventually)PostgreSQL, 59 bytes
I'll admit to the slight problem that
random()
could, in theory, produce exactly zero, in which case the die roll would be zero.sumber
;
to terminate the query since it is the only oneRuby, 32 bytes
In a more readable form:
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 forinject
). 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}'
(thep
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
withx-~rand(4)
.sumber
x-~rand(4)
is equivalent tox+rand(4)+1
.2**20
with4e10
.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.Just for fun: if one were optimizing for performance in PARI,
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.
sumber
Javascript,
5553504741 bytesI 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.
sumber
a+=parseInt(Math.random()*4)
may be shortened toa+=1+Math.random()*4&7
. The1+
is only if you care if it rolls 0 or not.for(a=i=1<<20;i--;)a+=(Math.random()*4)|0
, that's only 41 bytesClip 10, 12 bytes
It takes approximately 0.6 seconds to run on my machine.
sumber
Go, 78 bytes
Golfed
Still working on it
Run online here http://play.golang.org/p/pCliUpu9Eq
sumber
Go, 87 bytes
Naive solution
Run online here: http://play.golang.org/p/gwP5Os7_Sq
Due to the way the Go playground works you have to manually change the seed (time is always the same)
sumber
Commodore Basic, 37 bytes
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.sumber
PowerShell,
4137 bytesTook my machine 2 minutes 40 seconds
sumber
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.
sumber
Swift, 64 bytes
Nothing clever, golfing in Swift is hard...
Version 2 (too late)
sumber
Java (Java 8) - 52
sumber