Une propriété intéressante d'un langage complet de Turing est qu'il peut être utilisé pour écrire n'importe quel programme, y compris la simulation de l'univers entier.
Votre travail consiste à faire exactement cela: écrire un programme simulant l’Univers .
Remarque: bien que je ne doute pas que vous serez en mesure d'accomplir cette tâche, je ne dispose plus de suffisamment de temps pour vérifier si les 10 90 particules de votre simulation font exactement ce qu'elles devraient faire. Par conséquent, pour simplifier les tests et l'évaluation, il suffit que votre simulateur d'univers ne fonctionne qu'avec une seule particule de départ. Pour garder les choses intéressantes, supposons que cette particule est le boson de Higgs récemment découvert.
Votre univers ne commence qu'avec un seul boson de Higgs d'environ 120 GeV au milieu de celui-ci. Pour que la sortie ne soit pas trop longue, faisons en sorte que cet univers ne tique que de 10 à 25 secondes au lieu de sa "fréquence d'horloge habituelle" de 5,4 × 10 −44 secondes.
Ce boson de Higgs se désintégrera tôt ou tard car il a une demi-vie de 1,6 × 10 −22 secondes. Il a donc une probabilité de décroissance de 0,0433% à chaque tick de la simulation. Vous pouvez vérifier ici en quoi il va se décomposer . Pour avoir une exigence centrale et simplifiée, je liste les ratios de branchement que vous devriez utiliser:
Lancer la simulation
À chaque tick de la simulation, le boson de Higgs a une chance de se décomposer de 0,0433%. Si cela se produit, il se décomposera en particules suivantes, avec les probabilités répertoriées (vous devez utiliser ces noms dans le résultat):
- quark inférieur + antiquark inférieur (64,8%)
- 2 bosons W (14,1%)
- 2 gluons (8,82%)
- tpton lepton + antitau lepton (7,04%)
- charme quark + charme antiquark (3.27%)
- 2 bosons Z (1,59%)
- 2 photons (0,223%)
- 1 boson Z + 1 photon (0,111%)
- muon + antimuon (0,0244%)
- Top quark + Top antiquark (0,0216%)
Pour un total de 100%.
Certaines de ces particules vont se décomposer davantage.
W boson : demi-vie de 10-25 secondes, cela signifie 50% de chance de décroître à chaque cran dans l'une des options suivantes, avec des probabilités égales:
- positron + neutrino
- antimuon + neutrino
- antitau lepton + neutrino
Boson Z : demi-vie de 10-25 secondes, cela signifie 50% de chance de décroissance à chaque tick en une des choses suivantes:
- neutrino + antineutrino (20,6%)
- électron + positron (3.4%)
- muon + antimuon (3,4%)
- tpton lepton + antitau lepton (3,4%)
- quark bas + antiquark bas (15,2%)
- quark étrange + antiquark étrange (15,2%)
- quark inférieur + antiquark inférieur (15,2%)
- up quark + up antiquark (11,8%)
- charme quark + charme antiquark (11,8%)
quark top : demi-vie de 5 × 10 -25 secondes, cela signifie 12,95% de chance de décroissance à chaque cran dans les conditions suivantes, avec des probabilités égales:
- W boson + quark bas
- W boson + quark étrange
- W boson + quark inférieur
Bien sûr, le boson W va bientôt se désintégrer aussi ...
L' antiquark supérieur se comporte de la même manière que le quark top: il se décompose en un boson W et un antiquark ad / s / b.
Toutes les autres particules (donc toutes sauf les bosons Z et W et les quarks supérieurs) ont une demi-vie plus longue de plusieurs ordres de grandeur. Par conséquent, pour ne pas encombrer la sortie, elles sont toutes considérées comme stables pour notre simulation .
Comme l'univers est en grande partie vide, toutes les particules auront assez d'espace pour elles-mêmes et n'interagiront pas les unes avec les autres. Par conséquent, toutes les particules individuelles sont indépendantes les unes des autres à tous égards, y compris les probabilités de division.
Sortie:
Chaque tick de la simulation, vous devez imprimer le contenu de l'univers simulé dans une nouvelle ligne. Par exemple:
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.
L'ordre des particules dans la ligne n'est pas important. La mise en forme doit cependant être identique à celle de l'exemple ci - dessus , y compris la ponctuation et la pluralisation. Si vous simulez un (mini) univers entier, il devrait être joli (Et je voulais éliminer l'abus d'une exigence de sortie pas assez stricte)
Chaque ligne correspond à 0,1 yoctoseconds, mais vous serez pardonné s'il faut plus de temps que votre programme pour imprimer le résultat.
La simulation se termine lorsqu'il ne reste que des particules "stables".
Notation
Les règles de golf standard sont appliquées.
Le générateur de nombres aléatoires peut être pseudo-aléatoire, mais vous devez l'ensemencer si la langue ne l'ensemence pas par défaut. La distribution de probabilité de votre RNG doit être uniforme.
- Vous obtiendrez un bonus de -10% à la taille du code si le programme prend un entier comme entrée et commence avec autant de bosons de Higgs.
Exception pour les amateurs de machines de Turing.
Pour ceux qui osent tenter leur chance avec une machine de Turing réelle ou un langage similaire (comme Brainfuck), leur tâche est facilitée par les modifications de règles suivantes (applicable uniquement si le langage est un dérivé de Brainfuck ou autrement un langage de Turing très simplifié) machine, incapable d’assignation, sans ALU et les valeurs sur la bande ne peuvent être incrémentées et décrémentées que d’une unité) :
- Les noms des particules sont simplifiés en d, s, b, t, u, c pour les quarks, v pour le neutrino, T pour le lepton tau, m pour le muon, g pour le gluon, p pour le photon, Z, W et H pour le bosons, - pour l'électron et + pour le positron. A chaque tick, une entrée avec la valeur 0 ou 1 est fournie à partir de l'entrée standard, elle indique si la première particule instable de la liste se désintègre ou non.
L'exemple de sortie deviendra donc
H
H
H
H
W W
W W
W + n
+ !T n n
SimulateUniverse
fonction intégrée?Réponses:
Pyth , 572 * 0.9 = 514.8 octets
Qualifie pour le bonus de -10%. Essayez-le en ligne ici ou essayez-le avec la demi-vie du boson de Higgs réduite à 1 s ici ( pour réduire le nombre de répétitions dans la sortie et créer un univers plus excitant!).
Je suis convaincu que ceci est loin d'être optimal, en particulier la compression du dictionnaire, mais j'ai déjà perdu plus de temps que prévu, les suggestions d'amélioration sont donc les bienvenues.
Le programme est divisé en trois parties: préparation du dictionnaire, définition de la fonction de sortie et exécution de la simulation.
Préparation du dictionnaire
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"\_
Il s'agit de la plus grande section du code fini, occupant 381 octets. Le dictionnaire est construit en utilisant la chaîne suivante:
La chaîne est une liste de particules séparées par un tiret bas et, si la particule est instable, son comportement - une liste séparée par des espaces, comprenant sa demi-vie en ticks de simulation, suivie de ce en quoi elle se désintègre, avec les probabilités distinctes de chacune. Chaque particule est associée à un code d'une seule lettre, indiquée par sa position dans la liste indexée dans l'alphabet des minuscules - le boson de Higgs est donc
a
, le boson Wb
, jusqu'à l'êtrey
.Plutôt que de stocker les probabilités de décroissance, la demi-vie est stockée et la probabilité calculée lors du traitement du dictionnaire. La formule utilisée est
P=1-(1/2)^(1/h)
oùP
est la probabilité de décroissance par tique eth
la demi-vie de la particule mesurée en tiques.Les particules instables sont les quatre premiers de la liste. Comme le nombre de ces particules détermine la fin de la simulation, il est facile de les vérifier ultérieurement au début de la liste.
Le problème est que cette chaîne est énorme - 436 octets! - et l'utilisation de la compression de chaîne intégrée à Pyth augmente réellement le nombre d'octets, car elle utilise beaucoup de caractères multi-octets. J'ai opté pour un schéma de compression de dictionnaire itératif relativement simple. L'extrait le
u:GhHtHc"xxx"\!"yyy"
décompresse comme suit:Les entrées de dictionnaire que j'ai choisies sont basées uniquement sur mon intuition et sur quelques essais et erreurs. Je suis donc sûr qu'il reste encore beaucoup à faire.
La chaîne de dictionnaire décompressée est ensuite interprétée et stockée comme décrit ci-dessous:
Le résultat est
J
une liste ordonnée des noms de particules. Si elles décroissent, le nom est associé à sa probabilité de décroissance et à un ensemble de particules dans lesquelles il pourrait se décomposer, pondérées par leurs probabilités relatives.Définition de la fonction de sortie
Ceci définit une fonction
y(b)
qui accepte l'état actuel de l'univers en tant qu'entrée. Il s’agit simplement d’une liste des numéros des particules, classés par type, comme défini dans la chaîne de dictionnaire décrite dans la section précédente.Exécution de la simulation
K+Q*]Z24Ws<K4yK=+Z1Vs.em?>O1.0he@JkY,kOee@Jkb<K4IN XhNK_1 XRK1xLGeN;yK%"Simulation ended after %s yoctoseconds."cZT
Avec la préparation terminée, la simulation peut maintenant être exécutée. Cela se compose de quelques étapes:
Initialisation de l'univers
Comme la particule d'indice 0 dans l'état de l'univers est le boson de Higgs, l'état initial de l'univers est un tableau de nombres en entrée suivi de 24 zéros.
Boucle de simulation
A chaque tick de la simulation, l'état actuel de l'univers doit être affiché, un compteur incrémenté, et chaque particule volatile doit vérifier si elle doit se désintégrer, en appliquant les résultats à l'état de l'univers une fois que chaque particule a été évaluée.
Sortie finale
La simulation se termine lorsqu'il ne reste plus de particules instables. Il ne reste plus qu'à afficher l'état final de l'univers et la durée (combien de ticks) de la simulation.
la source
C ++ (
2420,2243,2353,1860, 1822 * 0,9 = 1639,8)Ok, donc c’est probablement la pire soumission jamais soumise à un code de golf, mais c’est ma première et je me suis amusée. Je pense que ça marche même. :)
Version rapide
Celui-ci n'est pas aussi court (9 octets supplémentaires), mais il est beaucoup plus rapide pour tester des nombres énormes. Comme ce n'est pas assez court pour faire face à la concurrence, j'ai également ajouté un peu de code pour chronométrer le temps d'exécution dans le monde réel et l'imprimer juste après le temps simulé. Ma version originale faisait n = 100k en 8 minutes environ. La version ci-dessus le fait en 2 minutes environ. Cette version rapide peut le faire en 9 secondes. n = 1 million a pris 53 secondes.
Exemple de sortie (sans argument)
Exemple de sortie (universe.exe 10):
Exemple de sortie (universe.exe 1000000)
(pas tout à fait 10 ^ 90, mais nous y arrivons)
Plus grandes sorties
Si vous utilisez la sortie de la console à partir d'une ligne de commande, je suggérerais quelque chose comme
universe.exe 100 > temp.txt
ça pour que ça aille beaucoup plus vite. Avec Notepad ++, vous pouvez ensuite ouvrir temp.txt, cliquer surctrl+H
, entrer^(.*?)$\s+?^(?=.*^\1$)
dans le champ Rechercher , ne rien entrer dans le champ Remplacer par , activer le mode de recherche surRegular Expression
, activer la sélection et . correspond à la nouvelle ligneOFF
, puis appuyez surReplace All
. Vous voyez maintenant où les changements ont eu lieu au lieu de 8 000 lignes de sortie (il semble cependant que des bogues surviennent plus de 2 000 à 3 000 lignes à la fois).Corrections / ajustements
la source
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'
àchar t[]="dDuUbBlLcCsSnNmMgGpeETtZWH"
? Devrait fonctionner dans c , pas sûr de c ++Python 3, 1 247 * 0,9 = 1 122,3
Eh bien, c’est ma plus longue entrée de loin, mais au moins, je suis plus courte que C ++.
Maintenant avec bonus ajouté! Il doit être appelé avec un nombre comme premier argument.
Mon univers ne fonctionnait pas avec des particules en décomposition autres que le boson de Higgs, mais maintenant, ça marche. De plus, je n'ai pas pluralisation ou la ponctuation, mais je fait faire maintenant.
Je me rapproche tellement de sous 1k!
la source
import random
. Voilà pour le déterminisme.Perl 6 , (707 bytes -10%) Score 636.3
Avec des sauts de ligne inutiles pour un peu plus de lisibilité:
Essayez-le en ligne!
Quelques explications: Dieu et l'homme
Il y a 2 structures de données contenant la physique
%p
et la désignation%h
; dieu et homme pour ainsi dire. Le hachage physique donne un ensemble de chaînes indexées par la lettre de particule instable d'origine, qui peuvent être scindées, hachées et converties en un mélange:Chaque particule reçoit une lettre et chacun de ces mélanges spécifie donc une collection de désintégrations de particules. H décroît en WW, avec pondération de probabilité 14.1. Les paires particule-antiparticule sont codées avec des lettres minuscules et majuscules, comme
c
etC
pour le charme quark et antiquark.Et l'homme réfléchit un peu, et le nomma antitau lepton
La dénomination est entièrement définie dans
%h
, ce qui mappe chaque lettre à un nom de particule. Il joue au golf dans une certaine mesure, mais je suppose que des améliorations sont possibles étant donné le nombre de répétitions.Chaîne originale
Avec ces deux structures en place, l'univers est simulé, bien sûr, par manipulation de cordes. Il en
"H"
va de même pour un univers avec un seul boson de Higgs. La structure du générateur_,_..._
sert à créer une boucle et sépare l’évolution de l’état de la chaîne de l’univers (retenue$_
) de son impression. L’impression se fait en ensachant les lettres dans l’univers et en cartographiant les nombres obtenus (avec des pluriels!).Éternuer des particules en être
Les particules en évolution impliquent de les mapper à une valeur choisie dans le mélange pour cette particule; donc
t
, le quark top, évolue commePerl6 nous permet de choisir au hasard une de ces clés avec les pondérations données par le biais du plus simple
.roll
. Donc, noust
obtenons et obtenons, disonsWb
et substituons-le dans notre univers "HtT" -> "HWbT". Chaque particule instable a elle-même un rôle possible, ce qui nous permet de simplifier la structure plutôt que de vérifier si elle a pourri ou non; la plupart du temps, vous obtenez "H", vous obtenez à nouveau "H".Théorie expérimentale des cordes
Vous pouvez regarder la chaîne de l'univers évoluer via cette version modifiée .
Performance
Je suis allé aussi loin que 100 H sur TIO; inévitablement, si vous vouliez aller beaucoup plus loin, il serait préférable de faire quelques changements, c'est la Grande théorie unifiée des cordes après tout.
la source
Groovy,
15061454 - 10% = 1309 octetsSuppose que le nombre de particules de boson de Higgs de départ est donné comme premier argument de la ligne de commande:
la source
PHP, 989 - 10% = 890,1 octets
Sous 1K bébé! Merci vsz, c'était un défi vraiment amusant. Tant de façons de s'y prendre et très difficile de vérifier votre sortie est correcte.
Le programme peut utiliser un argument de ligne de commande pour spécifier le nombre de départ des bosons de Higgs, par exemple:
php universe_simulator.php 5
Voici la même chose avec les sauts de ligne pour, euh ... "lisibilité" ...
Quelques sorties:
la source
QBasic
2161 * .9 = 19452028 * .9 = 18251854 * .9 = 1669 octetsMaintenant que QBasic est le LOTM, je pensais réviser ma toute première réponse sur PPCG. Réussi à supprimer 140 octets, pas mal!
Sur la base des commentaires de @TaylorScott et de @DLosc, j'ai procédé à une refonte complète:
Le code
Échantillon de sortie
la source
For i=0To 28
x$=Mid$("H00433099979405H004330999550m4H004330998440ZpH004330996210ppH004330980310ZZH004330947610c3H004330877210T2H004330789010ggH004330648010WWH004330000000b12012950666670W12012950333340W82012950000000W70012950666670Wb0012950333340Ws0012950000000WdW0500006666702nW0500003333404nW050000000000+nZ050000882010c3Z050000764010u9Z050000612010b1Z050000460010s8Z050000308010d7Z050000274010T2Z050000240010m4Z050000206010-+Z050000000000n6",15*i+1,15)
...Next
dans une fonctionf$()
sur un tableaue$()
s$()
,Next:Next
peut êtreNext j,i
, et vous devriez vérifier pour voir si les?
déclarations ont besoin de tous ces;
s. Mais il semble également que votre sortie ne respecte pas les spécifications pour le momentC # 6,
3619361736113586 - 10% = 3227,4 octetsLe programme prend deux arguments optionnels pour le nombre de bosons de Higgs de départ et la graine à utiliser pour la classe Random.
Je n'aurais pas dû utiliser d'objets pour cela. J'essaierai probablement de faire une deuxième solution en utilisant des tableaux, mais ce sera probablement similaire à la solution C ++ déjà affichée. Le nombre de bosons de Higgs que je peux manipuler est également très limité, je pense au moins une heure pour H = 1 000 000. Les petits nombres fonctionnent assez bien cependant.
Exemple de sortie:
Je posterai les deux dernières lignes pour la course h = 1000000 quand elle se terminera, probablement plus tard aujourd'hui.Comme promis:la source
else {U(new T(0>1))
et multiplen < 2 / 3.0
et unn <2/3.0
.if (a.Length
et un autre àif (N[x]!=1
troisièmeo+= $
. En outre, vous analyseza[0]
un entier deux fois, lorsque le résultat peut être enregistré dans un entier. Je pense que celaY==1.0
peut êtreY==1.
, mais je ne suis pas certain à ce sujet.i!=0
pourrait êtrei
. Je ne sais pas si vos variables peuvent réellement annuler, mais sinon, vous pouvez remplacer==0
s par<1
. Le titre devrait dire C # 6, puisque vous utilisez une interpolation de chaîne.Mathematica, 950 octets-10% = 855 octets
Utilisation de la compression d'expression:
Code non compressé (1168 octets-10% = 1051.2 octets):
Le paramètre de démarrage peut être choisi en modifiant la valeur pour a.
J'ai remarqué que j'avais utilisé la mauvaise probabilité pour le boson de Higgs mais je ne peux pas le changer pour le moment (dans quelques heures à peu près). Ajoutez donc 3 ou 4 octets à la solution actuelle. (C'était une valeur de test)
la source
Perl,
973986959944 octets -10% = 849,6 pointsL'indentation et les nouvelles lignes ne font pas partie du code et sont fournies uniquement pour que vous ne fassiez pas défiler pendant 30 ans pour tout lire.
Il y a quelques optimisations à 0 octet que je n'ai jamais pris la peine de défaire.
De toute évidence, le gros du code crée les hachages initiaux.
%p
contient les noms de toutes les particules, exploitant la fonctionnalité de mot clé de Perl.%r
détermine les taux de décomposition. Si ce n'est pas décrit ici, alors il ne se décompose pas du tout.%d
contient les particules de décomposition.Étant donné que l'ordre des particules dans la sortie n'a pas d'importance, je ne me soucie pas de le modifier de manière aléatoire. Perl accède aux clés dans le hachage, ce qui conduit aux éléments suivants:
Cela a vraiment été une aventure exaltante. Merveilleux casse-tête, honnêtement, je me suis beaucoup amusé! :)
la source
Python 3.6.1,
11831157...905889 * 0,9 = 800,1 octetsLa première fois que nous en avons soumis un, mais ce défi était plutôt amusant, alors allons-y ...
Presque certainement pas aussi golfé que cela pourrait être, mais je suis assez inexpérimenté à ce sujet, donc tous les conseils sont les bienvenus.
Essayez-le en ligne!
Edit: Par souci de brièveté, une liste abrégée des modifications que j'ai apportées (merci aux commentateurs de l'aide!):
random.choices()
probabilités pondérées, et non les pourcentages, sont réalisées . Je pourrais donc économiser quelques octets pour ne pas décaler de quelques puissances de 10 à 28 octets! La probabilité de désintégration de Higgs était erronée - je lisais 0,43% au lieu de 0,043%, ce qui coûtait deux octets.any()
,+=
au lieu delist.extend()
et uneimport
instruction différente .choices(*p[x][1:])
pour sauver etx and y or z
éviter un coupleif...else...or
.enumerate()
par la copie de l'univers et l'utilisationlist.remove()
de l'original (laenumerate
méthode a tout de même été interrompue).print()
déclaration etif
déclarations fusionnées . Suppression de certains supports inutiles.Version plus lisible:
Exemple de sortie avec 5000 bosons de Higgs - peut-être une plus grande analyse plus tard pour voir si une désintégration du quark top réussit:
Si j'ai fait quelque chose de mal, merci de me le faire savoir et j'essaierai de le réparer!
la source
Ruby,
997995 octets -10% = 895,5 pointsedit: ajouté 'et' en tant que dernier séparateur remarqué par breadbox
Première publication sur PPCG, c’est un vieux défi, mais j’ai eu beaucoup de plaisir à le faire. Voici le code
Les chaînes sont compressées en factorisant les mots récurrents (vars
s
ett
) Les produits de decay sont stockés de manière compacte en tant que chaîne (varr
), chaque lettre est une particule. Une fonctionf
imprime l’état de l’univers en mappant le tableau de particules en chaînes. J'ai l'impression qu'il y a des octets à couper dans la ligne de mise à jour de l'état, mais je ne trouve rien de mieux.Exemple de sortie
Performance
Ce n'est pas si grave! Il a calculé 100 000 bosons de Higgs en 25 secondes
la source
>
de votrewhile
? Cela fait longtemps que je n'ai rien fait dans Ruby.D,
11721101 octets - 10% = 990,9 octetsUngolfed
la source
Kotlin : 1330 - 10% = 1197 octets
Ma toute première soumission de golf de code; très inefficace car les listes sont plus golfeuses que les cartes, mais apparemment correctes! Fonctionne sur les implémentations JVM ou JS et prend un argument (facultatif).
Version moins golfée
la source
Assez longue soumission.
Pas beaucoup joué au golf mais toujours plus court que l'autre python.
Prendre la quantité initiale de Higgs en entrée.
Python 3 ,
11341120 octets - 10% =1020.61008 pointsEssayez-le en ligne!
la source
F #,
19931908 octets - 10% = 1718 octetsEssayez-le en ligne!
Ungolfed cela ressemble à ceci:
la source