En el webcomic Darths & Droids , Pete, que interpreta a R2-D2 en la campaña ficticia de rol en la que se basa el cómic, una vez afirma (advertencia: posibles spoilers en el cómic vinculado) que, con el Orbe Perdido de Phanastacoria armado hasta su sonda de choque, ahora puede repartir una friolera de 1048576d4de daños (El GM no ha confirmado ni negado esto). Dado que debería ser razonablemente obvio que casi nadie tendrá la paciencia para tirar tantos dados, escriba un programa de computadora para que lo haga por él, generando el valor total obtenido de manera razonable formato. Las entradas se clasificarán según el tamaño del programa (programa más corto, por número de bytes, victorias), en general y por idioma, con lazos de tiempo de ejecución. La respuesta puede ser un programa completo o una definición de función.
Puntuaciones por idioma
Pyth
Maltysen - 8 bytes *
Jakube - 10 bytes
APL
Alex A - 10 bytes
CJam
Optimizador - 11 bytes
J
--ıʇǝɥʇuʎs - 12 bytes **
Clip10
Ypnypn - 12 bytes **
K
JohnE - 13 bytes
Ti-84 BÁSICO
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
Rubí
Haegin - 32 bytes **
ConfusedMr_C - 51 bytes **
Commodore Basic
Marca - 37 bytes **
PHP
Ismael Miguel - 38 bytes
VBA
Sean Cheshire - 40 bytes **
Potencia Shell
Nacht - 41 bytes **
Javascript
Ralph Marshall - 41 bytes
edc65 - 54 bytes (Requiere la funcionalidad ES6 no disponible en todos los navegadores).
Lua
críptico - 51 bytes
Java
RobAu - 52 bytes **
Geobits - 65 bytes
C
Functino - 57 bytes
Pitón
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
VAMOS
Kristoffer Sall-Storgaard - 78 bytes
C#
Brandon - 91 bytes **
Andrew - 105 bytes
Ewan - 148 bytes
Rasguño
SuperJedi224 - 102 bytes
C ++
Michelfrancis Bustillos - 154 bytes
Políglotas
Ismael Miguel (Javascript / ActionScript2) - 67 bytes
Top 10 en general
Maltysen Alex A Jakube Optimizador ɐɔıʇǝɥʇuʎs / Ypnypn (orden incierta) JohnE SuperJedi224 MickyT Oebele
Advertencia: las entradas marcadas con un * son MUY LENTAS.
Programado marcado ** Todavía no he podido probar correctamente
1048576d4
puede ser confusa para algunos usuarios. Sería útil proporcionar una descripción precisa de lo que se debe calcular y las pautas que se deben seguir.Respuestas:
Pyth -
98 bytesUtiliza un método simple y obvio de suma de randint. Me tomó un minuto darme cuenta de que
1048576
era2^20
, ahora me siento realmente estúpido. Gracias a @Jakube por salvarme un byte al señalar2^20 = 4^10
.El tiempo de ejecución es horrible, aún no ha terminado en mi computadora, por lo que no tiene sentido ejecutarlo en línea, así que aquí está el
2^10
: Pruébelo en línea aquí .fuente
2^20 = 4^10
1024d4
.Perl -
4844373934 bytesImprime la suma sin una nueva línea final.
Ahorró 4 bytes sustituyendo
2**20
(gracias Maltysen) y eliminando comillas alrededor de la impresión.Ahorré otros 7 bytes al reorganizar el código (¡gracias Thaylon!)
Perdí 2 bytes porque mi código anterior generó 0-4 (debería ser 1-4).
Una vez más, ahorré 5 bytes gracias a Caek y nutki.
Código no escrito, correctamente escrito:
fuente
int(rand(5))
devuelve el rango de 0 a 4, mientras que d4 debe ser de 1 a 4.$s+=int rand(4)+1for(1..2**20);print$s
Eliminar el paréntesis para int también funciona para mí, para guardar un trazo.APL,
1110 bytesEsto solo toma la suma de una matriz de 2 20 = 1048576 enteros aleatorios entre 1 y 4.
Puede comparar esto en TryAPL imprimiendo la marca de tiempo antes y después. Tarda unos 0.02 segundos.
¡Ahorré un byte gracias a marinus y FUZxxl!
fuente
+/?4⍴⍨2*20
+/?4⍴⍨2*20
en su lugar.Ti-84 Basic, 17 bytes
Huella total: tamaño del encabezado del programa = 17 bytes
Tiempo de ejecución: Desconocido, estimado en 5-6 horas en función del rendimiento para un número menor de rollos (así que, básicamente, no es muy bueno)
fuente
R,
32242321 bytesEditar: se deshizo de la
as.integer
división entera y la usó%/%
. Acelera un poco.Gracias a Alex A por la sugerencia de muestra ... y Giuseppe por eliminar el
r=
Probado con
Salidas
Para velocidad pura, lo siguiente se completa en microsegundos. Sin embargo, no estoy seguro de tener mi lógica correcta. Los resultados parecen consistentes con el método aleatorio. Es una pena que sea más larga.
Aquí hay una carrera de tiempo que hice en mi máquina
fuente
sample()
en lugar derunif()
, es decirsum(sample(4,2^20,r=T))
.sample()
realidad también es más rápido!r=T
, soloT
está bien para el reemplazo.Python 2, 58 bytes
Obtenemos 1048576 caracteres aleatorios del sistema operativo, tomamos 2 bits de cada uno y los sumamos. El uso de la
os
biblioteca parece ahorrar algunos caracteres sobre el uso de larandom
biblioteca.Esto toma alrededor de 0.2 segundos en mi PC.
fuente
CJam,
1211 bytesEsto es bastante directo:
¡Pero la belleza de esto es que también es realmente rápido! En mi máquina (y usando el compilador de Java ) toma un promedio de 70 milisegundos.
La versión en línea tarda alrededor de 1.7 segundos en mi máquina.
Actualización : 1 byte guardado gracias a DocMax
fuente
YK#_{4mr+}*
4A#
lugar deYK#
), pero me ganaste. :)JavaScript (ES6), 54 bytes
Tiempo promedio <100 mseg. Ejecute el fragmento para probar (en Firefox)
Explicación
Sin un paquete estadístico incorporado, en Javascript la forma más corta de obtener la suma de 1 millón de números aleatorios es llamar al azar () por un millón de veces. Tan simplemente
Ahora, agregar 1 por un millón de veces es exactamente lo mismo que agregar 1 millón, o incluso mejor, comenzar la suma con 1 millón y luego agregar el resto:
Luego golf, suelte la variable temporal r y suelte la declaración de variables locales.
t
es un parámetro, ya que se necesita uno para acortar la declaración def
.i
es global (cosa mala)Luego, encuentre una manera de evitar el 'retorno' utilizando una función interna sin nombre. Como efecto secundario, obtenemos otro parámetro para que no se usen globales
fuente
Perl, 29
Genera una tabla de la longitud requerida.
fuente
~~
no es una coincidencia inteligente, solo una inversión de doble bit para forzar el contexto escalar. Una forma más larga de un personaje seríaprint$x=map...
. Tal vez en versiones más recientes advierte debido a la ambigüedad con smartmatch, pero parece funcionar sin advertencias en mi sistema y aquí: ideone.com/LAIWzqJ (12 bytes, aproximadamente 9.8 milisegundos)
Sospecho que esto es en su mayoría limitado por el ancho de banda de la memoria: ni siquiera puedo lograr que maximice un solo núcleo ...
Puede probar esto con el siguiente código:
Esto lo ejecuta en 4 grupos de 20 pistas, y devuelve el número de milisegundos del tiempo promedio en el grupo más rápido. Un intérprete se puede encontrar aquí .
fuente
Pyth, 10 bytes
Esto tiene un poco más de bytes que la solución Pyth de @ Maltysen. Pero se ejecuta en 8,5 segundos en mi computadora portátil, mientras que la solución de @ Maltysen no produjo ninguna solución en 20 minutos de tiempo de ejecución.
Pero todavía es un poco lento para el compilador en línea.
Explicación
fuente
Java, 65
Como tenemos puntajes listados por idioma, ¿por qué no incluir Java en la mezcla? Aquí no hay mucho para jugar al golf, solo un simple bucle, pero pude exprimir un par de mi intento inicial:
fuente
s
(la suma total) comienza en1<<20
(el número de rollos). Esto es equivalente a agregar uno a cada rollo. Cuando el aleatorizador arroja 0, se lanza un 1, etc.Matlab, 24
¡Primera presentación!
Tenía la esperanza de hacer uso de randi ([1,4], 1024), que proporciona una matriz de 1048576 elementos, pero luego necesitaba una suma doble, que requiere más caracteres que este.
Con respecto a la velocidad de carrera mencionada en la pregunta,
timeit
me dice que el tiempo de ejecución es de aproximadamente 0.031 segundos. Entonces, casi al instante.fuente
Haskell, 73 bytes
Uso:
fuente
C #: 105 bytes
fuente
The *exclusive* upper bound of the range
que debería ser 5a
y moviendo elnew System.Random()
interior delSum
. Claro, creará una nuevaRandom
cada vez, pero ¿a quién le importa siempre que dé un resultado?PHP
3837 bytesEsto utiliza una idea muy simple: sumarlos todos.
Además, he notado que
1048576
está10000000000000000000
en binario, equivalente a1<<20
.Aquí está el código:
Prueba en tu navegador (con MUY PEQUEÑOS cambios):
Mostrar fragmento de código
Todos los cambios en el código se explican en los comentarios.
fuente
;
afterecho$v
Mathematica,
3027 bytesMathematica tiene nombres de funciones bastante largos ...
fuente
C, 57 bytes
Este código funciona ... una vez. Si alguna vez necesita tirar esos dados nuevamente, deberá colocarlos
srand(time(0))
allí, agregando 14 bytes.fuente
srand(time(0))
? (Lo siento, no uso C.)rand
siembran al mismo valor en cada ejecución.srand
siembra el RNG ytime(0)
obtiene el tiempo actual en segundos desde 1970.a=b=1<<20
, puede omitir1+
, esto ahorra 4 bytes.int
antesmain
no es necesario.t=0
, luegot=t (...) +1
por 1048576 veces: ¡piense de nuevo! (vea mi respuesta, eventualmente)PostgreSQL, 59 bytes
Admitiré el ligero problema que
random()
podría, en teoría, producir exactamente cero, en cuyo caso la tirada del dado sería cero.fuente
;
terminar la consulta, ya que es la únicaRuby, 32 bytes
En una forma más legible:
Crea un rango de 1 a 1048576 y luego itera sobre el bloque muchas veces. Cada vez que se ejecuta el bloque, el valor de la iteración anterior se pasa como
x
(inicialmente 0, el valor predeterminado parainject
). Cada iteración calcula un número aleatorio entre 0 y 3 (inclusive), agrega uno, por lo que simula tirar un d4 y lo agrega al total.En mi máquina es bastante rápido ejecutar (
0.25 real, 0.22 user, 0.02 sys
).Si tiene instalado Ruby, puede ejecutarlo
ruby -e 'p (1..2**20).inject{|x|x+rand(4)+1}'
(p
es necesario para ver el resultado cuando se ejecuta de esta manera, omítalo si no le importa o simplemente ejecútelo dentro de IRB donde el resultado se imprime en la pantalla para ti). Lo he probado en Ruby 2.1.6.Gracias a histocrat por el truco poco retorcido que reemplaza
x + rand(4) + 1
conx-~rand(4)
.fuente
x-~rand(4)
es equivalente ax+rand(4)+1
.2**20
con4e10
.PARI / GP, 25 bytes
Realmente, no hay necesidad de jugar golf aquí: esta es la forma directa de hacer el cálculo en GP. Se ejecuta en 90 milisegundos en mi máquina. Alzando el
+1
ahorra unos 20 milisegundos.Solo por diversión: si uno estuviera optimizando el rendimiento en PARI,
tiene un recuento total de operaciones muy pequeño: si xorgens necesita ~ 27 ciclos por palabra de 64 bits (¿alguien puede verificar esto?), entonces un procesador con POPCNT debería tomar solo alrededor de 0.5 ciclos / bit, o unos pocos cientos de microsegundos para el final número.
Esto debería tener un rendimiento cercano al óptimo en el peor de los casos entre los métodos que usan números aleatorios de calidad similar o superior. Debería ser posible aumentar considerablemente la velocidad promedio combinando casos, tal vez un millón de rollos a la vez, y seleccionando (esencialmente) codificación aritmética .
fuente
Javascript,
5553504741 bytesNo me di cuenta de que los números no aleatorios eran un irritante conocido, por lo que creo que debería publicar una solución real. No significaba falta de respeto.
Comentario: como lo señalaron otros arriba, puede omitir el +1 en cada rollo comenzando con el número de rollos en su respuesta, y al no tener que escribir a = 0, i = 1 << 20 ahorra dos bytes, y otros 2 porque no agregas +1 a cada rollo. La función parseInt hace lo mismo que Math.floor pero es 2 caracteres más corta.
fuente
a+=parseInt(Math.random()*4)
puede ser acortado aa+=1+Math.random()*4&7
. El1+
es solo si te importa si sale 0 o no.for(a=i=1<<20;i--;)a+=(Math.random()*4)|0
Clip 10 , 12 bytes
Se tarda aproximadamente 0,6 segundos en ejecutarse en mi máquina.
fuente
Go, 78 bytes
Golfed
Sigo trabajando en eso
Ejecute en línea aquí http://play.golang.org/p/pCliUpu9Eq
fuente
Go, 87 bytes
Solución ingenua
Corre en línea aquí: http://play.golang.org/p/gwP5Os7_Sq
Debido a la forma en que funciona el área de juegos Go, debe cambiar manualmente la semilla (el tiempo siempre es el mismo)
fuente
Commodore Basic, 37 bytes
Sustituciones de PETSCII:
─
=SHIFT+E
,/
=SHIFT+N
,┌
=SHIFT+O
Tiempo de ejecución estimado basado en carreras con recuentos de dados más bajos: 4.25 horas.
Es tentador intentar jugar golf de dos bytes haciendo
C
un número entero, obteniendo redondeo implícito de los números aleatorios. Sin embargo, el rango de enteros en Commodore Basic es -32678 a 32767 - no es suficiente, cuando la respuesta mediana es 2621440.fuente
PowerShell,
4137 bytesTomó mi máquina 2 minutos 40 segundos
fuente
Ruby,
5147 caracteresMiré todas las respuestas antes de hacer esto, y la
sum(2**20 times {randInt(4)})
estrategia realmente sobresalió, así que usé eso.> <>, 76 caracteres
No estoy seguro de si funciona, porque mi navegador falló cuando intenté probarlo, pero aquí está el intérprete en línea.
fuente
Rápido, 64 bytes
Nada inteligente, jugar al golf en Swift es difícil ...
Versión 2 (demasiado tarde)
fuente
Java (Java 8) - 52
fuente