No webcomic Darths & Droids , Pete, que interpreta R2-D2 na campanha de roleplay ficcional em torno da qual o gibi se baseia, uma vez afirma (aviso: possíveis spoilers no gibi vinculado) que, com o Lost Orb de Phanastacoria, equipado com seu sonda de choque, ele agora pode distribuir uma enorme quantidade de 1048576d4de dano. (O GM não confirmou nem negou isso.) Como deve ser razoavelmente óbvio que quase ninguém terá paciência para jogar tantos dados, escreva um programa de computador para fazer isso por ele, produzindo o valor total acumulado de alguma maneira razoável. formato. As inscrições serão classificadas por tamanho do programa (programa mais curto, por contagem de bytes, vitórias), tanto no geral quanto no idioma, com o tempo de execução interrompendo os vínculos. A resposta pode ser um programa completo ou uma definição de função.
Pontuações por idioma
Pyth
Maltysen - 8 bytes *
Jakube - 10 bytes
APL
Alex A - 10 bytes
CJam
Otimizador - 11 bytes
J
--ıʇǝɥʇuʎs - 12 bytes **
Clip10
Ypnypn - 12 bytes **
K
JohnE - 13 bytes
Ti-84 BASIC
SuperJedi224 - 17 bytes *
R
MickyT - 23 bytes
OCTAVE / MATLAB
Oebele - 24 bytes
PARI / GP
Charles - 25 bytes **
Wolfram / Mathematica
LegionMammal978 - 27 bytes
Perl
Nutki - 29 bytes
AsciiThenAnsii - 34 bytes
Rubi
Haegin - 32 bytes **
ConfusedMr_C - 51 bytes **
Commodore Basic
Marca - 37 bytes **
PHP
Ismael Miguel - 38 bytes
VBA
Sean Cheshire - 40 bytes **
PowerShell
Nacht - 41 bytes **
Javascript
Ralph Marshall - 41 bytes
edc65 - 54 bytes (requer a funcionalidade ES6 não disponível em todos os navegadores.)
Lua
criptyty - 51 bytes
Java
RobAu - 52 bytes **
Geobits - 65 bytes
C
Functino - 57 bytes
Python
CarpetPython - 58 bytes
Postgre / SQL
Andrew - 59 bytes **
Rápido
Skrundz - 69 bytes
GoatInTheMachine - 81 bytes
Haskell
Zeta - 73 bytes **
ActionScript
Brian - 75 bytes **
> <>
ConfusedMr_C - 76 bytes
VAI
Kristoffer Sall-Storgaard - 78 bytes
C #
Brandon - 91 bytes **
Andrew - 105 bytes
Ewan - 148 bytes
coçar, arranhão
SuperJedi224 - 102 bytes
C ++
Michelfrancis Bustillos - 154 bytes
Poliglotas
Ismael Miguel (Javascript / ActionScript2) - 67 bytes
Top 10 no geral
Maltysen Alex A Jakube Optimizer ɐɔıʇǝɥʇuʎs / Ypnypn (ordem incerta) JohnE SuperJedi224 MickyT Oebele
As entradas de aviso marcadas com * são MUITO Lentas.
Programado marcado ** Ainda não consegui testar corretamente
1048576d4
pode não ser clara para alguns usuários. Seria útil fornecer uma descrição exata do que deveria ser calculado e de todas as diretrizes que devem ser seguidas.Respostas:
Pitão -
98 bytesUsa método simples óbvio de somatório de randint. Levei minuto para perceber
1048576
era2^20
, agora eu me sinto realmente estúpido. Obrigado a @Jakube por me salvar um byte, apontando2^20 = 4^10
.O tempo de execução é horrível, ainda não foi concluído no meu computador; portanto, não faz sentido executá-lo on-line; então, esse é o seguinte
2^10
: Experimente on-line aqui .fonte
2^20 = 4^10
1024d4
.Perl -
4844373934 bytesImprime a soma sem uma nova linha à direita.
Economizou 4 bytes substituindo
2**20
(obrigado Maltysen) e removendo aspas na impressão.Salvei mais 7 bytes reorganizando o código (obrigado Thaylon!)
Perdi 2 bytes porque meu código antigo gerou 0-4 (deve ser 1-4).
Mais uma vez, salvou 5 bytes graças a Caek e nutki.
Código não-jogado e escrito corretamente:
fonte
int(rand(5))
retornos intervalo de 0 a 4, enquanto d4 deve ser de 1 a 4.$s+=int rand(4)+1for(1..2**20);print$s
Remover os parênteses para int também funciona para mim, para salvar um acidente vascular cerebral.APL,
1110 bytesIsso leva a soma de uma matriz de 2 20 = 1048576 números aleatórios entre 1 e 4.
Você pode avaliar isso no TryAPL imprimindo o carimbo de data e hora antes e depois. Demora cerca de 0,02 segundos.
Guardou um byte graças a marinus e FUZxxl!
fonte
+/?4⍴⍨2*20
+/?4⍴⍨2*20
vez disso.Ti-84 Básico, 17 bytes
Área total - Tamanho do cabeçalho do programa = 17 bytes
Tempo de execução: desconhecido, estimado em 5-6 horas, com base no desempenho para números menores de rolos (portanto, basicamente, não é muito bom)
fonte
R,
32242321 bytesEdit: Livre-se da
as.integer
divisão inteira e usada%/%
. Acelere um pouco.Agradecimentos a Alex A pela dica de amostra ... e Giuseppe por remover o
r=
Testado com
Saídas
Para velocidade pura, o seguinte é concluído em microssegundos. No entanto, não tenho certeza se minha lógica está correta. Os resultados parecem consistentes com o método aleatório. Pena que é um comprimento maior.
Aqui está uma corrida de tempo que fiz na minha máquina
fonte
sample()
no lugar derunif()
, iesum(sample(4,2^20,r=T))
.sample()
é mais rápido!r=T
,T
é bom para a substituição.Python 2, 58 bytes
Obtemos 1048576 caracteres aleatórios do sistema operacional, pegamos 2 bits de cada e os somamos. O uso da
os
biblioteca parece salvar alguns caracteres sobre o uso darandom
biblioteca.Isso leva cerca de 0,2 segundos no meu PC.
fonte
CJam,
1211 bytesIsso é bem direto:
Mas a beleza disso é que também é muito rápido! Na minha máquina (e usando o compilador Java ), leva em média 70 milissegundos.
A versão online leva cerca de 1,7 segundos na minha máquina.
Atualização : 1 byte salvo graças ao DocMax
fonte
YK#_{4mr+}*
4A#
vez deYK#
), mas você me venceu. :)JavaScript (ES6), 54 bytes
Tempo médio <100 ms. Execute o snippet para testar (no Firefox)
Explicação
Sem pacote estatístico incorporado, em Javascript, a maneira mais curta de obter a soma de 1 milhão de números aleatórios é chamar random () por um milhão de vezes. Tão simplesmente
Agora, adicionar 1 por um milhão de vezes é exatamente o mesmo que adicionar 1 milhão, ou melhor ainda, iniciar a soma com 1 milhão e depois adicionar o restante:
Em seguida, golf, solte a variável temp r e solte a declaração das variáveis locais.
t
é um parâmetro, pois é necessário reduzir a declaração def
.i
é global (coisa ruim)Em seguida, encontre uma maneira de evitar o 'retorno' usando uma função interna sem nome. Como efeito colateral, obtemos outro parâmetro para que não sejam usados globais
fonte
Perl, 29
Gera uma tabela do comprimento necessário.
fonte
~~
não é uma combinação inteligente, apenas uma inversão de dois bits para forçar o contexto escalar. Um personagem mais longo seriaprint$x=map...
. Talvez nas versões mais recentes ele avise por causa da ambiguidade com o smartmatch, mas parece funcionar sem avisos no meu sistema e aqui: ideone.com/LAIWzqJ (12 bytes, cerca de 9,8 milissegundos)
Eu suspeito que isso seja principalmente limitado à largura de banda de memória: eu não consigo fazer isso no máximo com um único núcleo ...
Você pode testar isso com o seguinte código:
Isso o executa em 4 grupos de 20 trilhas e retorna o número de milissegundos do tempo médio no grupo mais rápido. Um intérprete pode ser encontrado aqui .
fonte
Pitão, 10 bytes
Isso tem um pouco mais de bytes do que a solução Pyth da @ Maltysen. Mas ele roda em 8,5 segundos no meu laptop, enquanto a solução da @ Maltysen não produziu solução em 20 minutos.
Mas ainda é um pouco lento demais para o compilador online.
Explicação
fonte
Java, 65
Como temos pontuações listadas por idioma, por que não jogar Java na mistura? Não há muito para jogar aqui, apenas um loop simples, mas consegui extrair alguns da minha tentativa inicial:
fonte
s
(a soma total) começa em1<<20
(o número de rolos). Isso equivale a adicionar um a cada rolo. Quando o randomizador lança 0, é 1, etc.Matlab, 24
Primeira submissão de todos os tempos!
Eu esperava usar randi ([1,4], 1024), que fornece uma matriz de 1048576 elementos, mas então eu precisava de uma soma dupla, que requer mais caracteres que isso.
Em relação à velocidade de execução mencionada na pergunta,
timeit
o tempo de execução é de cerca de 0,031 segundos. Então, praticamente instantâneo.fonte
Haskell, 73 bytes
Uso:
fonte
C #: 105 bytes
fonte
The *exclusive* upper bound of the range
que deve ser 5a
e movendo onew System.Random()
interior doSum
. Claro, ele criará um novoRandom
sempre, mas quem se importa, desde que dê um resultado?PHP,
38.37 bytesIsso usa uma idéia muito simples: soma todos eles!
Além disso, notei que isso
1048576
é10000000000000000000
binário, equivalente a1<<20
.Aqui está o código:
Teste no seu navegador (com alterações MUITO PEQUENAS ):
Mostrar snippet de código
Todas as alterações no código são explicadas nos comentários.
fonte
;
afterecho$v
Mathematica,
3027 bytesMathematica has quite long function names...
fonte
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.fonte
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.fonte
;
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)
.fonte
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.
fonte
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.
fonte
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.
fonte
Go, 78 bytes
Golfed
Still working on it
Run online here http://play.golang.org/p/pCliUpu9Eq
fonte
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)
fonte
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.fonte
PowerShell,
4137 bytesTook my machine 2 minutes 40 seconds
fonte
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.
fonte
Swift, 64 bytes
Nothing clever, golfing in Swift is hard...
Version 2 (too late)
fonte
Java (Java 8) - 52
fonte