В веб-комиксе Darths & Droids Пит, который играет R2-D2 в вымышленной ролевой кампании, на которой основан комикс, однажды заявляет (предупреждение: потенциальные спойлеры в связанном комиксе), что с Потерянным Сферой Фанастакории, подключенной к его ударный зонд, он теперь может выложить колоссальный 1048576d4ущерба. (ГМ не подтвердил и не опроверг это.) Поскольку должно быть достаточно очевидно, что на самом деле почти ни у кого не хватит терпения бросить столько костей, напишите компьютерную программу, которая сделает это для него, и выведите общее значение, выброшенное в разумных пределах. формат. Записи будут ранжироваться по размеру программы (самая короткая программа, по количеству байтов, выигрышам), как по общему, так и по языку, с разрывом связей во время выполнения. Ответом может быть либо полная программа, либо определение функции.
Баллы за язык
Pyth
Maltysen - 8 байт *
Якубе - 10 байт
APL
Алекс А - 10 байт
CJam
Оптимизатор - 11 байт
J
ɐɔıʇǝɥʇuʎs - 12 байт **
Clip10
Ypnypn - 12 байт **
К
JohnE - 13 байт
Ti-84 BASIC
SuperJedi224 - 17 байт *
р
MickyT - 23 байта
OCTAVE / MATLAB
Oebele - 24 байта
PARI / GP
Чарльз - 25 байт **
Вольфрам / Mathematica
LegionMammal978 - 27 байт
Perl
Нутки - 29 байт
AsciiThenAnsii - 34 байта
Рубин
Хаегин - 32 байта **
ConfusedMr_C - 51 байт **
Коммодор Базовый
Марк - 37 байт **
PHP
Исмаэль Мигель - 38 байт
VBA
Шон Чешир - 40 байт **
PowerShell
Nacht - 41 байт **
Javascript
Ральф Маршалл - 41 байт
edc65 - 54 байта (требуется функция ES6, доступная не во всех браузерах.)
Lua
криптих - 51 байт
Джава
RobAu - 52 байта **
Geobits - 65 байт
С
Functino - 57 байт
питон
CarpetPython - 58 байт
Postgre / SQL
Андрей - 59 байт **
стриж
Скрундз - 69 байт
GoatInTheMachine - 81 байт
Haskell
Зета - 73 байта **
ActionScript
Брайан - 75 байт **
> <>
ConfusedMr_C - 76 байт
ИДТИ
Кристоффер Салл-Сторгард - 78 байтов
C #
Брэндон - 91 байт **
Андрей - 105 байт
Эван - 148 байт
царапать
SuperJedi224 - 102 байта
C ++
Мишельфрансис Бустильос - 154 байта
полиглотов
Исмаэль Мигель (Javascript / ActionScript2) - 67 байт
Топ 10 в целом
Maltysen Алекс А Jakube оптимизатор /ıʇǝɥʇuʎs / Ypnypn (порядок неопределен) Johne SuperJedi224 MickyT Oebele
Предупреждения - записи, отмеченные *, ОЧЕНЬ МЕДЛЕННЫЕ.
Запрограммирован отмечен ** Я еще не смог правильно проверить
1048576d4
может быть неясным для некоторых пользователей. Было бы полезно дать описание того, что именно должно быть рассчитано, и любые руководящие принципы, которые должны соблюдаться.Ответы:
Pyth -
98 байтИспользует очевидный простой метод суммирования рандов. Взял меня минуту , чтобы понять
1048576
было2^20
, теперь я чувствую себя очень глупо. Спасибо @Jakube за то, что он спас мне байт2^20 = 4^10
.Время выполнения ужасное, оно еще не закончилось на моем компьютере, поэтому запускать его онлайн не имеет смысла, так что вот
2^10
один: попробуйте онлайн здесь .источник
2^20 = 4^10
1024d4
.Perl -
4844373934 байтаПечатает сумму без завершающего перевода строки.
Сохранено 4 байта путем замены
2**20
(спасибо Maltysen) и удаления кавычек вокруг печати.Сэкономили еще 7 байтов, переставив код (спасибо Thaylon!).
Потеряли 2 байта, потому что мой старый код генерировал 0-4 (это должно быть 1-4).
Еще раз, сэкономили 5 байтов благодаря Caek и Nutki.
Правильно написанный код:
источник
int(rand(5))
возвращает диапазон от 0 до 4, в то время как d4 должен быть от 1 до 4.$s+=int rand(4)+1for(1..2**20);print$s
Удаление скобок для int также работает для меня, чтобы сохранить удар.APL,
1110 байтЭто просто берет сумму массива 2 20 = 1048576 случайных целых чисел от 1 до 4.
Вы можете сравнить это на TryAPL , напечатав метку времени до и после. Это займет около 0,02 секунды.
Сохраненный байт благодаря Marinus и FUZxxl!
источник
+/?4⍴⍨2*20
+/?4⍴⍨2*20
вместо этого.Ti-84 Basic, 17 байтов
Общая площадь - размер заголовка программы = 17 байт
Время выполнения: неизвестно, оценивается в 5-6 часов на основе производительности при меньшем количестве бросков (поэтому, в основном, не очень хорошо)
источник
R,
32242321 байтРедактировать: Избавился от
as.integer
и использовал целочисленное деление%/%
. Ускорьте это немного.Спасибо Алексу А за образец подсказки ... и Джузеппе за удаление
r=
Протестировано с
Выходы
Для чистой скорости следующее завершается в микросекундах. Однако я не уверен, что правильно понял мою логику. Результаты отображаются в соответствии со случайным методом. Позор, это длиннее.
Вот время запуска я сделал на моей машине
источник
sample()
вместоrunif()
, то естьsum(sample(4,2^20,r=T))
.sample()
на самом деле быстрее!r=T
, простоT
хорошо для замены.Python 2, 58 байт
Мы получаем 1048576 случайных символов из операционной системы, берем 2 бита каждого и складываем их. Использование
os
библиотеки позволяет сэкономить несколько символов при использованииrandom
библиотеки.На моем компьютере это занимает около 0,2 секунды.
источник
CJam,
1211 байтовЭто довольно прямо вперед:
Но красота этого в том, что это действительно быстро! На моей машине (и с помощью компилятора Java ) это занимает в среднем 70 миллисекунд.
Онлайн версия занимает около 1,7 секунды на моей машине.
Обновление : 1 байт сохранен благодаря DocMax
источник
YK#_{4mr+}*
4A#
вместоYK#
), но вы меня опередили. :)JavaScript (ES6), 54 байта
Среднее время <100 мсек. Запустите сниппет для проверки (в Firefox)
объяснение
Без встроенного статистического пакета в Javascript самый короткий способ получить сумму в 1 миллион случайных чисел - это вызвать random () миллион раз. Так просто
Теперь, добавление 1 к миллиону раз точно так же, как добавление 1 миллиона, или даже лучше, начните сумму с 1 миллиона, а затем добавьте остальные:
Затем гольф, отбросьте временную переменную r и отбросьте объявление локальных переменных.
t
является параметром, так как он необходим для сокращения объявленияf
.i
глобально (плохо)Затем найдите способ избежать «возврата», используя безымянную внутреннюю функцию. В качестве побочного эффекта мы получаем другой параметр, поэтому глобальные переменные не используются
источник
Perl, 29
Создает таблицу необходимой длины.
источник
~~
это не smartmatch, просто двухбитовая инверсия для форсирования скалярного контекста. На один символ длиннее будет путьprint$x=map...
. Может быть, на более новых версиях он предупреждает из-за неоднозначности с smartmatch, но, похоже, он работает без предупреждений в моей системе и здесь: ideone.com/LAIWzqJ (12 байт, около 9,8 миллисекунд)
Я подозреваю, что это в основном ограниченная пропускная способность памяти: я даже не могу получить максимальную отдачу от одного ядра ...
Вы можете проверить это с помощью следующего кода:
Это запускает его в 4 группах по 20 трасс и возвращает количество миллисекунд среднего времени в самой быстрой группе. Переводчик можно найти здесь .
источник
Pyth, 10 байт
Это имеет немного больше байтов, чем решение Pyth @ Maltysen. Но он работает на моем ноутбуке за 8,5 секунд, а решение @ Maltysen не дало решения за 20 минут работы.
Но все еще слишком медленно для онлайн-компилятора.
объяснение
источник
Ява, 65
Поскольку у нас есть оценки, перечисленные по языку, почему бы не добавить Java в микс? Здесь не так много для гольфа, просто простая петля, но я смог выжать пару из моей первоначальной попытки:
источник
s
(общая сумма) начинается с1<<20
(количество рулонов). Это эквивалентно добавлению одного к каждому броску. Когда рандомизатор выбрасывает 0, он бросает 1 и т. Д.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.источник
Haskell, 73 bytes
Usage:
источник
C#: 105 bytes
источник
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.
источник
;
afterecho$v
Mathematica,
3027 bytesMathematica has quite long function names...
источник
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.источник
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.источник
;
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)
.источник
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.
источник
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.
источник
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.
источник
Go, 78 bytes
Golfed
Still working on it
Run online here http://play.golang.org/p/pCliUpu9Eq
источник
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)
источник
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.источник
PowerShell,
4137 bytesTook my machine 2 minutes 40 seconds
источник
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.
источник
Swift, 64 bytes
Nothing clever, golfing in Swift is hard...
Version 2 (too late)
источник
Java (Java 8) - 52
источник