Una buena propiedad de un lenguaje completo de Turing es que puede usarse para escribir cualquier programa, hasta e incluyendo la simulación de todo el Universo.
Tu trabajo es hacer exactamente eso: escribir un programa que simule el Universo .
Nota: aunque no dudo que pueda realizar esta tarea, hoy en día no tengo suficiente tiempo libre para verificar si las 10 90 de las partículas en su simulación hacen lo que realmente deberían hacer. Por lo tanto, solo para simplificar las pruebas y la evaluación, es suficiente si su simulador de universo solo funciona con una sola partícula inicial. Para mantener las cosas interesantes, supongamos que esta partícula es el Bosón de Higgs recientemente descubierto.
Su universo comienza con nada más que un solo Bosón de Higgs de aproximadamente 120 GeV en el medio. Para no hacer que la salida sea demasiado larga, hagamos que este universo funcione en solo 10-25 segundos en lugar de su "frecuencia de reloj habitual" de 5.4 × 10 −44 segundos.
Este bosón de Higgs se descompondrá tarde o temprano, ya que tiene una vida media de 1.6 × 10 −22 segundos, por lo que en cada tic de la simulación, tiene un 0.0433% de probabilidad de descomposición. Puede verificar aquí en qué se descompondrá . Para tener un requisito central y simplificado, enumero las relaciones de ramificación que debe usar:
Ejecutando la simulación
En cada tic de la simulación, el bosón de Higgs tiene una probabilidad de descomposición del 0.0433%. Si eso sucede, se descompondrá en las siguientes partículas, con las probabilidades enumeradas (debe usar estos nombres en la salida):
- quark bottom + antiquark bottom (64.8%)
- 2 bosones W (14.1%)
- 2 gluones (8.82%)
- tau lepton + antitau lepton (7.04%)
- quark encanto + antiquark encanto (3.27%)
- 2 bosones Z (1.59%)
- 2 fotones (0.223%)
- 1 bosón Z + 1 fotón (0.111%)
- muón + antimuón (0.0244%)
- top quark + top antiquark (0.0216%)
Para un total de 100%.
Algunas de estas partículas se deteriorarán aún más.
Bosón W : vida media de 10-25 segundos, esto significa una probabilidad del 50% de decaer en cada tic en uno de los siguientes, con las mismas probabilidades:
- positrón + neutrino
- antimuon + neutrino
- antitau lepton + neutrino
Bosón Z : vida media de 10-25 segundos, esto significa una probabilidad del 50% de descomponerse en cada tic en uno de los siguientes:
- neutrino + antineutrino (20,6%)
- electrón + positrón (3.4%)
- muón + antimuón (3.4%)
- tau lepton + antitau lepton (3.4%)
- abajo quark + abajo antiquark (15.2%)
- extraño quark + extraño antiquark (15.2%)
- quark bottom + antiquark bottom (15.2%)
- up quark + up antiquark (11.8%)
- quark encanto + antiquark encanto (11.8%)
quark top : vida media de 5 × 10-25 segundos, esto significa una probabilidad del 12.95% de decaer en cada tic en lo siguiente, con las mismas probabilidades:
- W boson + quark down
- W bosón + quark extraño
- W bosón + quark bottom
Por supuesto, el bosón W también decaerá pronto ...
El antiquark superior se comporta de manera similar al quark top: se descompone en un bosón W y un antiquark ad / s / b.
Todas las demás partículas (por lo que todas, excepto los bosones Z y W y los quarks superiores) tienen una vida media de muchos órdenes de magnitud más larga, por lo que para no saturar la salida, todas se consideran estables para nuestra simulación .
Como el universo está en gran parte vacío, todas las partículas tendrán suficiente espacio para sí mismas y no interactuarán entre sí. Por lo tanto, todas las partículas individuales son independientes entre sí en todos los aspectos, incluidas las probabilidades de división.
Salida:
Cada paso de la simulación, debe imprimir el contenido del universo simulado en una nueva línea. Por ejemplo:
The universe contains 1 Higgs boson.
The universe contains 1 Higgs boson.
The universe contains 1 Higgs boson.
The universe contains 1 Higgs boson.
The universe contains 2 W bosons.
The universe contains 2 W bosons.
The universe contains 1 W boson, 1 positron and 1 neutrino.
The universe contains 1 positron, 1 antitau lepton and 2 neutrinos.
Simulation ended after 0.8 yoctoseconds.
El orden de las partículas en la línea no es importante. Sin embargo, el formato debe ser exactamente como en el ejemplo anterior , incluida la puntuación y la pluralización. Si simula un universo (mini-) completo, debería verse bien (y quería eliminar el abuso de un requisito de salida no lo suficientemente estricto)
Cada línea corresponde a 0.1 yoctosegundos, pero se le perdonará si su programa tarda más que eso en imprimir la salida.
La simulación finaliza cuando solo quedan partículas "estables".
Puntuación
Se aplican reglas estándar de golf de código.
El generador de números aleatorios puede ser pseudoaleatorio, pero debe sembrarlo si el idioma no lo hace de manera predeterminada. La distribución de probabilidad de su RNG debe ser uniforme.
- Obtendrá una bonificación del -10% al tamaño del código si el programa toma un número entero como entrada y comienza con esa cantidad de bosones de Higgs.
Excepción para entusiastas de las máquinas de Turing.
Para aquellos que se atreven a probar suerte con una máquina de Turing real o un idioma similar (como Brainfuck), su tarea se hace más fácil por los siguientes cambios de reglas (solo aplicable si el idioma es un derivado de Brainfuck o de otra manera un Turing muy simplificado) máquina, incapaz de asignación, que carece de una ALU, y los valores en la cinta solo pueden incrementarse y disminuirse en uno) :
- Los nombres de las partículas se simplifican a d, s, b, t, u, c para los quarks, v para el neutrino, T para tau lepton, m para muón, g para gluón, p para fotón, Z, W y H para el bosones, - para el electrón y + para el positrón. En cada marca, se proporciona una entrada con el valor de 0 o 1 de la entrada estándar, indicando si la primera partícula inestable en la lista decae o no.
Por lo tanto, la salida de ejemplo se convertirá
H
H
H
H
W W
W W
W + n
+ !T n n
SimulateUniverse
función incorporada?Respuestas:
Pyth , 572 * 0.9 = 514.8 bytes
Califica para el bono de -10%. Pruébelo en línea aquí , o pruébelo con la vida media del bosón de Higgs reducida a 1 año aquí (lo que hace que haya menos repeticiones en la salida y un universo más emocionante).
Estoy convencido de que esto está lejos de ser óptimo, especialmente la compresión del diccionario, pero ya he perdido más que suficiente en esto, por lo que las sugerencias de mejora son bienvenidas.
El programa se divide en tres partes: preparación del diccionario, definición de la función de salida y ejecución de la simulación.
Preparación del diccionario
Jm?tld,hd,-1^.5c1shced\ sm*]<k2s>k2tced\ dcR\,cu:GhHtHc"A76 !B17 !C1 v!D_top !E00 !F bosR!GmuR_!Ineutrino_!Jtau leptR_!KQ_charm !LQ_strange !MQ_down !NQ_up !OQ_bottom !Panti!Qquark!Ron"\!"HiggsF,16Efg3240Ebb705Epp441Eqr352ER16350 cc7950 ss1115 cs555 tu122 de108_WF,CxCuCr1_ZF,Cw103 yxBtuBqrBjkAlmAfgAhi59 R59DQ,5 bj1 bl1 bf1DPOOPNNPMMPLLPKKPQ_gluR_JPJphotR_GPGIPIpositrR_electrR"\_
Esta es la sección más grande del código terminado, ocupando 381 bytes. El diccionario se construye usando la siguiente cadena:
La cadena es una lista separada por subrayado de las partículas y, si la partícula es inestable, su comportamiento: una lista separada por espacios que consiste en su semivida en tics de simulación seguidos de en qué se descompone, junto con las distintas probabilidades de cada uno. Cada partícula tiene un código de una sola letra asociado, dado por su posición en la lista indexada en minúsculas, por lo que el bosón de Higgs es
a
, el bosón Wb
, hasta el electróny
.En lugar de almacenar las probabilidades de descomposición, la vida media se almacena y la probabilidad se calcula cuando se procesa el diccionario. La fórmula utilizada es
P=1-(1/2)^(1/h)
dóndeP
está la probabilidad de descomposición por garrapata, yh
es la vida media de la partícula medida en garrapatas.Las partículas inestables son las primeras cuatro de la lista. Como el número de estas partículas es lo que determina cuándo termina la simulación, tenerlas al comienzo de la lista hace que sea más fácil verificarlas más adelante.
El problema es que esta cadena es enorme: ¡436 bytes! - y el uso de la compresión de cadena incorporada de Pyth en realidad aumenta el recuento de bytes, ya que utiliza tantos caracteres de varios bytes. Me decidí por un esquema de compresión de diccionario iterativo relativamente simple. El fragmento lo
u:GhHtHc"xxx"\!"yyy"
descomprime de la siguiente manera:Las entradas del diccionario que he elegido se basan solo en mi intuición y en algunas pruebas y errores, por lo que estoy seguro de que hay mucho margen de mejora.
La cadena de diccionario descomprimida se interpreta y almacena como se describe a continuación:
El resultado es que
J
contiene una lista ordenada de los nombres de las partículas. Si se descomponen, el nombre se combina con su probabilidad de descomposición y un conjunto de partículas en las que podría descomponerse, ponderadas por sus probabilidades relativas.Definición de función de salida
Esto define una función
y(b)
, que acepta el estado actual del universo como su entrada. Esto es simplemente una lista de los números de las partículas, ordenadas por su tipo como se define en la cadena del diccionario descrita en la sección anterior.Ejecución de la simulación
K+Q*]Z24Ws<K4yK=+Z1Vs.em?>O1.0he@JkY,kOee@Jkb<K4IN XhNK_1 XRK1xLGeN;yK%"Simulation ended after %s yoctoseconds."cZT
Con la preparación hecha, la simulación ahora se puede ejecutar. Esto consta de unos pocos pasos:
Inicialización del universo
Como la partícula en el índice 0 en el estado del universo es el bosón de Higgs, el estado inicial del universo es una matriz de número de entrada seguido de 24 ceros.
Bucle de simulación
En cada tic en la simulación, se debe mostrar el estado actual del universo, se debe incrementar un contador y cada partícula volátil debe verificar si debe descomponerse, aplicando los resultados al estado del universo una vez que cada partícula ha sido evaluada.
Salida final
La simulación finaliza cuando no quedan partículas inestables. Todo lo que queda es generar el estado final del universo y cuánto tiempo (cuántos ticks) tomó la simulación.
fuente
C ++ (
2420,2243,2353,1860, 1822 * .9 = 1639.8)Ok, este es probablemente el peor envío de código de golf, pero es el primero y me divertí. Creo que incluso funciona. :)
Versión rápida
Este no es tan corto (9 bytes adicionales), pero funciona mucho más rápido para probar grandes cantidades. Como no es lo suficientemente corto para competir, también agregué un pequeño código para registrar el tiempo de ejecución en el mundo real e imprimirlo justo después del tiempo simulado. Mi versión original hizo n = 100k en aproximadamente 8 minutos. La versión anterior lo hace en unos 2 minutos. Esta versión rápida puede hacerlo en 9 segundos. n = 1 millón tomó 53 segundos.
Salida de muestra (sin argumentos)
Salida de muestra (universe.exe 10):
Salida de muestra (universe.exe 1000000)
(no del todo 10 ^ 90, pero estamos llegando allí)
Salidas más grandes
Si está utilizando la salida de la consola desde una línea de comando, sugeriría algo así
universe.exe 100 > temp.txt
para que vaya mucho más rápido. Con Notepad ++, a continuación, puede temp.txt abierta, golpearctrl+H
, entrará^(.*?)$\s+?^(?=.*^\1$)
en el buscar qué campo, introduzca nada en el Reemplazar campo, a su vez del modo de búsqueda aRegular Expression
girar en la selección y . coincide con la nueva líneaOFF
, luego presionaReplace All
. Ahora solo ve dónde se produjeron los cambios en lugar de 8000 líneas de salida (aunque parece que tengo errores haciendo más de 2000-3000 líneas a la vez).Correcciones / Ajustes
fuente
char t[N]={'d','D','u','U','b','B','l','L','c','C','s','S','n','N','m','M','g','G','p','e','E','T','t','Z','W','H'
achar t[]="dDuUbBlLcCsSnNmMgGpeETtZWH"
? Debería funcionar en c , no estoy seguro acerca de c ++Python 3, 1,247 * 0.9 = 1,122.3
Bueno, esta es mi entrada más larga por asomo, pero al menos soy más bajo que C ++.
¡Ahora con bonificación adicional! Tiene que ser llamado con un número como primer argumento.
Mi universo no funcionaba con partículas en descomposición que no fueran Higgs Boson, pero ahora sí. Además, yo no tenía pluralización o puntuacion correcta, pero en realidad hago ahora.
¡Me estoy acercando tanto al sub 1k!
fuente
import random
. Demasiado para el determinismo.Perl 6 , (707 bytes -10%) Puntuación 636.3
Con algunos saltos de línea innecesarios para un poco más de legibilidad:
Pruébalo en línea!
Alguna explicación: Dios y el hombre
Hay 2 estructuras de datos que contienen la física
%p
y los nombres%h
; Dios y el hombre por así decirlo. El hash de física proporciona un conjunto de cadenas indexadas por una letra de partícula inestable original, que se puede dividir, trocear y convertir en una mezcla:Cada partícula recibe una letra y, por lo tanto, cada una de estas mezclas especifica una colección de descomposición de partículas. H decae a WW, con ponderación de probabilidad 14.1. Los pares partícula-antipartícula están codificados con letras mayúsculas y minúsculas, como
c
yC
para quark encanto y antiquark encanto.Y el hombre pensó un poco y lo llamó antitau lepton
Todos los nombres están configurados
%h
, lo que solo asigna cada letra a un nombre de partícula. Se juega al golf hasta cierto punto, pero sospecho que hay margen de mejora dada la cantidad de repetición allí.Cuerda original
Con esas dos estructuras en su lugar, el universo se simula, por supuesto, mediante la manipulación de cadenas. Entonces,
"H"
es un universo con un solo bosón de Higgs. La estructura del generador_,_..._
se utiliza para crear un bucle y separa la evolución del estado de la cadena del universo (retenida$_
) de la impresión. La impresión se realiza empaquetando las letras en el universo y mapeando los recuentos resultantes (¡con plurales!).Estornudando partículas para ser
La evolución de las partículas implica asignarlas a un valor seleccionado de la Mezcla para esa partícula; entonces
t
, el quark top, evoluciona comoPerl6 nos permite elegir aleatoriamente una de esas teclas con las ponderaciones dadas a través del suelo simple
.roll
. Así que rodamost
y recibimos, digamosWb
y lo sustituimos en nuestro universo "HtT" -> "HWbT". Cada partícula inestable se tiene como un posible rollo, lo que nos permite simplificar la estructura frente a tener que verificar si se descompuso o no; la mayoría de las veces sacas "H", solo obtienes "H" nuevamente.Teoría experimental de cuerdas
Puede ver evolucionar la cadena del universo a través de esta versión modificada .
Actuación
Lo llevé hasta 100 H en TIO, inevitablemente, si querías ir mucho más lejos, sería mejor hacer algunos cambios, después de todo, esta es la Gran Teoría de la Cuerda Unificada.
fuente
Groovy,
15061454 - 10% = 1309 bytesAsume que el número de partículas de bosones de Higgs iniciales se da como el primer argumento en la línea de comando:
fuente
PHP, 989 - 10% = 890.1 bytes
Sub 1K bebé! Gracias vsz, este fue un desafío muy divertido. Hay muchas maneras de hacerlo y es muy difícil verificar que su salida sea correcta.
El programa puede tomar un argumento de línea de comando para especificar el número inicial de bosones de Higgs, p. Ej.
php universe_simulator.php 5
Esto es lo mismo con los saltos de línea para, eh ... "legibilidad" ...
Alguna salida:
fuente
QBasic
2161 * .9 = 19452028 * .9 = 18251854 * .9 = 1669 bytesAhora que QBasic es el LOTM, pensé en revisar mi primera respuesta en PPCG. Se las arregló para eliminar 140 bytes, ¡no está mal!
Según los comentarios de @TaylorScott y @DLosc, he realizado un rediseño completo:
El código
Salida de muestra
fuente
For i=0To 28
x$=Mid$("H00433099979405H004330999550m4H004330998440ZpH004330996210ppH004330980310ZZH004330947610c3H004330877210T2H004330789010ggH004330648010WWH004330000000b12012950666670W12012950333340W82012950000000W70012950666670Wb0012950333340Ws0012950000000WdW0500006666702nW0500003333404nW050000000000+nZ050000882010c3Z050000764010u9Z050000612010b1Z050000460010s8Z050000308010d7Z050000274010T2Z050000240010m4Z050000206010-+Z050000000000n6",15*i+1,15)
...Next
en funciónf$()
sobre matrize$()
s$()
,Next:Next
puede serNext j,i
, y debe verificar para ver si las?
declaraciones necesitan todos esos;
s. Pero también parece que su producción no cumple con las especificaciones en este momentoC # 6,
3619361736113586 - 10% = 3227.4 bytesEl programa toma dos argumentos opcionales para el número de Bosones de Higgs iniciales y la semilla para usar en la clase Aleatoria.
No debería haber usado objetos para esto, probablemente intentaré hacer una segunda solución utilizando matrices, pero probablemente sería similar a la solución C ++ publicada ya. El número de bosones de Higgs que puedo manejar también está muy limitado, creo que al menos una hora para H = 1,000,000. Sin embargo, los números más pequeños funcionan razonablemente bien.
Salida de muestra:
Publicaré las dos últimas líneas para la ejecución h = 1000000 cuando finalice, probablemente más tarde hoy.Como fue prometido:fuente
else {U(new T(0>1))
y múltiples enn < 2 / 3.0
, y uno enn <2/3.0
.if (a.Length
, y otro enif (N[x]!=1
, tercero eno+= $
. Además, está analizandoa[0]
un número entero dos veces, cuando el resultado podría guardarse en un número entero. Creo queY==1.0
puede serY==1.
, pero no estoy seguro de eso.i!=0
podría seri
. No sé si sus variables realmente pueden negarse, pero si no, puede reemplazar==0
s con<1
. El título debería decir C # 6, ya que está utilizando la interpolación de cadenas.Mathematica, 950bytes-10% = 855 bytes
Usando compresión de expresión:
Código sin comprimir (1168 bytes-10% = 1051.2bytes):
El parámetro de inicio puede elegirse alterando el valor de a.
Me di cuenta de que he usado la probabilidad incorrecta para el bosón de Higgs pero actualmente no puedo cambiarlo (en unas horas más o menos). Entonces agregue 3 o 4 bytes a la solución actual. (Fue un valor de prueba)
fuente
Perl,
973986959944 bytes -10% = 849.6 puntosLa sangría y las nuevas líneas no son parte del código, y se proporcionan únicamente para que no se desplace durante 30 años para leerlo todo.
Hay un par de optimizaciones de 0 bytes que nunca me molesté en deshacer.
Obviamente, la mayor parte del código está creando los hashes iniciales.
%p
contiene los nombres de todas las partículas, explotando la característica de la palabra desnuda de Perl.%r
determina las tasas de descomposición. Si no aparece aquí, entonces no se descompone en absoluto.%d
contiene las partículas de descomposición.Dado que el orden de las partículas en la salida no importa, no me molesto en cambiarlo de la manera aleatoria en que Perl accede a las claves en el hash, lo que lleva a cosas como las siguientes:
Esta ha sido realmente una aventura emocionante. Rompecabezas maravilloso, honestamente, ¡me divertí mucho! :)
fuente
Python 3.6.1,
11831157...905889 * 0.9 = 800.1 bytesLa primera vez que envié uno de estos, pero este desafío parecía bastante divertido, así que aquí vamos ...
Ciertamente no es tan golfista como podría ser, pero soy bastante inexperto en esto, por lo que cualquier consejo es bienvenido.
Pruébalo en línea!
Editar: En aras de la brevedad, una lista resumida de las ediciones que hice (¡gracias a los comentaristas por la ayuda!):
random.choices()
cuenta de las probabilidades ponderadas, no de los porcentajes, por lo que podría ahorrar unos pocos bytes al cambiar las cosas con unas potencias de diez a 28 bytes. La probabilidad de caída de Higgs estaba mal: leí 0.43% en lugar de 0.043%, por lo que costó dos bytes.any()
, en+=
lugar delist.extend()
y unaimport
declaración diferente .choices(*p[x][1:])
para salvar a un par yx and y or z
evitarif...else...or
.enumerate()
copiando el universo y usandolist.remove()
el original (elenumerate
método se rompió de todos modos, como sucede).print()
declaración yif
declaraciones combinadas . Se eliminaron algunos corchetes innecesarios.Versión más legible:
Salida de muestra con 5000 bosones de Higgs: podría hacer una corrida más grande más adelante para ver si la decadencia del quark top lo hace posible:
Si he hecho algo mal, ¡házmelo saber y trataré de arreglarlo!
fuente
Rubí,
997995 bytes -10% = 895.5 puntosedit: agregado 'y' como el último delimitador como lo notó breadbox
Publicar por primera vez en PPCG, este es un viejo desafío, pero me divertí mucho haciéndolo. Aqui esta el codigo
Las cadenas se comprimen factorizando palabras recurrentes (vars
s
yt
) Los productos de descomposición se almacenan de forma compacta como una cadena (varr
), cada letra es una partícula. Una funciónf
imprime el estado del universo asignando la matriz de partículas a cadenas. Siento que hay algunos bytes para cortar en la línea de actualización de estado, pero no puedo encontrar nada mejor.Salida de muestra
Actuación
¡No es tan malo! Calculaba 100000 bosones de Higgs en 25 segundos
fuente
>
en tuwhile
? Ha pasado un tiempo desde que hice algo en Ruby.D,
11721101 bytes - 10% = 990.9 bytesSin golf
fuente
Kotlin : 1330 - 10% = 1197 bytes
Mi primera presentación de código de golf; muy ineficiente debido a que las listas son más elegantes que los mapas, ¡pero aparentemente correctas! Funciona en la implementación JVM o JS, y toma un argumento (opcional).
Versión menos golfizada
fuente
Una presentación bastante larga.
No tanto golf, pero aún más corto que el otro pitón.
Tome la cantidad inicial de Higgs como entrada.
Python 3 ,
11341120 bytes - 10% =1020.61008 puntosPruébalo en línea!
fuente
F #,
19931908 bytes - 10% = 1718 bytesPruébalo en línea!
Ungolfed se ve así:
fuente