Uma boa propriedade de uma linguagem completa de Turing é que ela pode ser usada para escrever qualquer programa, incluindo a simulação de todo o universo.
Seu trabalho é fazer exatamente isso: escreva um programa que simule o universo .
Nota: embora não duvide que você consiga realizar essa tarefa, hoje em dia não tenho tempo livre suficiente para verificar se todas as 10 90 partículas da sua simulação fazem o que realmente deveriam. Portanto, apenas para simplificar o teste e a avaliação, basta que o seu simulador de universo funcione apenas com uma única partícula inicial. Para manter as coisas interessantes, vamos assumir que esta partícula é o recém descoberto Higgs Boson.
Seu universo começa com nada além de um único Boson de Higgs de aproximadamente 120 GeV no meio dele. Para não tornar a saída muito longa, vamos fazer esse universo funcionar em apenas 10 a 25 segundos, em vez de sua "freqüência normal" de 5,4 × 10 a 44 segundos.
Esse bóson de Higgs decai mais cedo ou mais tarde, pois possui meia-vida de 1,6 × 10 a 22 segundos; portanto, a cada toque da simulação, há 0,0433% de chance de decaimento. Você pode conferir aqui o que ela irá deteriorar . Para ter um requisito central e simplificado, listo as taxas de ramificação que você deve usar:
Executando a simulação
A cada marca da simulação, o bóson de Higgs tem 0,0433% de chance de decair. Se isso acontecer, ele se decomporá nas seguintes partículas, com as probabilidades listadas (você deve usar esses nomes na saída):
- quark inferior + antiquark inferior (64,8%)
- 2 W bósons (14,1%)
- 2 glúons (8,82%)
- tau lepton + antitau lepton (7,04%)
- charme quark + charme antiquark (3,27%)
- 2 bósons Z (1,59%)
- 2 fótons (0,223%)
- 1 bóson Z + 1 fóton (0,111%)
- múon + antimônio (0,0244%)
- quark superior + antiquark superior (0,0216%)
Para um total de 100%.
Algumas dessas partículas decaem ainda mais.
W boson : meia-vida de 10 a 25 segundos, isso significa 50% de chance de decair a cada tick em um dos seguintes, com probabilidades iguais:
- pósitron + neutrino
- antimuão + neutrino
- antitau lepton + neutrino
Z boson : meia-vida de 10 a 25 segundos, isso significa 50% de chance de se deteriorar a cada tick em um dos seguintes itens:
- neutrino + antineutrino (20,6%)
- elétron + pósitron (3,4%)
- múon + antimônio (3,4%)
- tau lepton + antitau lepton (3,4%)
- down quark + down antiquark (15,2%)
- quark estranho + antiquark estranho (15,2%)
- quark inferior + antiquark inferior (15,2%)
- up quark + up antiquark (11,8%)
- charme quark + charme antiquark (11,8%)
quark superior : meia-vida de 5 × 10 -25 segundos, isso significa 12,95% de chance de se deteriorar a cada tick para o seguinte, com probabilidades iguais:
- W boson + down quark
- W boson + quark estranho
- W boson + quark inferior
Claro, o bosão W também decairá em breve ...
O antiquark superior comporta-se de maneira semelhante ao quark superior: decai em um boson W e antiquark ad / s / b.
Todas as outras partículas (então todas, exceto os bósons Z e W e os quarks superiores) têm uma meia-vida muitas ordens de magnitude a mais, para não confundir a saída, elas são consideradas estáveis para a nossa simulação .
Como o universo está em grande parte vazio, todas as partículas terão espaço suficiente para si mesmas e não interagirão umas com as outras. Portanto, todas as partículas individuais são independentes uma da outra em todos os aspectos, incluindo as probabilidades de se dividir.
Resultado:
A cada escala da simulação, você deve imprimir o conteúdo do universo simulado em uma nova linha. Por exemplo:
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.
A ordem das partículas na linha não é importante. A formatação, no entanto, deve ser exatamente como no exemplo acima , incluindo pontuação e pluralização. Se você simular um universo (mini-) inteiro, ele deve ficar bonito (e eu queria eliminar o abuso de um requisito de saída não suficientemente estrito)
Cada linha corresponde a 0,1 yoctosegundos, mas você será perdoado se demorar mais do que isso para o seu programa imprimir a saída.
A simulação termina quando apenas partículas "estáveis" permanecem.
Pontuação
Aplicam-se regras de código padrão de golfe.
O gerador de números aleatórios pode ser pseudo-aleatório, mas você deve propagá-lo se o idioma não o difundir por padrão. A distribuição de probabilidade do seu RNG deve ser uniforme.
- Você receberá um bônus de -10% no tamanho do código se o programa usar um número inteiro como entrada e começar com tantos bósons de Higgs.
Exceção para os entusiastas da máquina de Turing.
Para aqueles que ousam tentar a sorte com uma máquina de Turing real ou com um idioma semelhante (como o Brainfuck), sua tarefa é facilitada pelas seguintes alterações nas regras (aplicáveis apenas se o idioma for um derivado do Brainfuck ou um método de Turing muito simplificado máquina, incapaz de atribuir, sem ALU e os valores na fita só podem ser incrementados e decrementados por um) :
- Os nomes das partículas são simplificados para d, s, b, t, u, c para os quarks, v para o neutrino, T para tau lepton, m para múon, g para gluon, p para fóton, Z, W e H para o bósons, - para o elétron e + para o pósitron. A cada marca, uma entrada com o valor 0 ou 1 é fornecida a partir da entrada padrão, indicando se a primeira partícula instável da lista se deteriora ou não.
O exemplo de saída se tornará, portanto,
H
H
H
H
W W
W W
W + n
+ !T n n
SimulateUniverse
função interna?Respostas:
Pitão , 572 * 0,9 = 514,8 bytes
Qualifica-se para o bônus de -10%. Experimente on-line aqui ou com a meia-vida do bóson de Higgs reduzida a 1ys aqui (contribui para menos repetições na produção e um universo mais emocionante!).
Estou convencido de que isso está longe de ser o ideal, especialmente a compactação do dicionário, mas já perdi tempo mais do que suficiente nisso, então sugestões de melhoria são bem-vindas.
O programa é dividido em três partes - preparação do dicionário, definição da função de saída e execução da simulação.
Preparação de dicionário
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 é a maior seção do código final, ocupando 381 bytes. O dicionário é criado usando a seguinte string:
A string é uma lista separada por sublinhado das partículas e, se a partícula é instável, seu comportamento - uma lista separada por espaços, que consiste em sua meia-vida em tiques de simulação seguidos pelo que ela decai, juntamente com as probabilidades distintas de cada uma. Cada partícula possui um código de uma letra associado a ela, dado por sua posição na lista indexada no alfabeto minúsculo - de modo que o bóson de Higgs é
a
, o bóson W éb
todo o caminho até o elétrony
.Em vez de armazenar as probabilidades de decaimento, a meia-vida é armazenada e a probabilidade calculada quando o dicionário é processado. A fórmula utilizada é
P=1-(1/2)^(1/h)
ondeP
está a probabilidade de decomposição por carrapato eh
é a meia vida da partícula medida em carrapatos.As partículas instáveis são as quatro primeiras da lista. Como o número dessas partículas é o que determina quando a simulação termina, tê-las no início da lista facilita a verificação mais tarde.
O problema é que essa string é enorme - 436 bytes! - e o uso da compactação de strings incorporada do Pyth na verdade aumenta a contagem de bytes, pois usa tantos caracteres de vários bytes. Eu decidi por um esquema de compactação de dicionário iterativo relativamente simples. O trecho
u:GhHtHc"xxx"\!"yyy"
descompacta, da seguinte maneira:As entradas do dicionário que escolhi são baseadas apenas na minha intuição e em algumas tentativas e erros, por isso tenho certeza de que há muito espaço para melhorias.
A sequência de dicionário descompactada é então interpretada e armazenada como descrito abaixo:
O resultado é que
J
contém uma lista ordenada dos nomes das partículas. Se eles decaem, o nome é emparelhado com sua probabilidade de decaimento e um conjunto de partículas nas quais ele poderia decair, ponderado por suas probabilidades relativas.Definição da função de saída
Isso define uma função
y(b)
que aceita o estado atual do universo como sua entrada. Esta é simplesmente uma lista dos números das partículas, ordenadas por seu tipo, conforme definido na string de dicionário descrita na seção anterior.Execução de simulação
K+Q*]Z24Ws<K4yK=+Z1Vs.em?>O1.0he@JkY,kOee@Jkb<K4IN XhNK_1 XRK1xLGeN;yK%"Simulation ended after %s yoctoseconds."cZT
Com a preparação feita, a simulação agora pode ser executada. Isso consiste em algumas etapas:
Inicialização do universo
Como a partícula no índice 0 no estado do universo é o bóson de Higgs, o estado inicial do universo é uma matriz de número de entrada seguida por 24 zeros.
Loop de simulação
A cada escala na simulação, o estado atual do universo precisa ser exibido, um contador incrementado e cada partícula volátil precisa verificar se deve decair, aplicando os resultados ao estado do universo depois que cada partícula for avaliada.
Saída final
A simulação termina quando não há partículas instáveis. Tudo o que resta é produzir o estado final do universo e quanto tempo (quantos ticks) a simulação levou.
fonte
C ++ (
2420,2243,2353,1860, 1822 * 0,9 = 1639,8)Ok, então esta é provavelmente a pior submissão de golfe de todos os tempos, mas é a minha primeira e me diverti. Eu acho que até funciona. :)
Versão Rápida
Este não é tão curto (9 bytes extras), mas corre muito mais rápido para testar grandes números. Como não é curto o suficiente para competir, também adicionei um pequeno código para registrar o tempo de execução no mundo real e imprimi-lo logo após o tempo simulado. Minha versão original fez n = 100k em cerca de 8 minutos. A versão acima faz isso em cerca de 2 minutos. Esta versão rápida pode fazer isso em 9 segundos. n = 1 milhão levou 53 segundos.
Saída de amostra (sem argumentos)
Saída de exemplo (universe.exe 10):
Saída de exemplo (universe.exe 1000000)
(não exatamente 10 ^ 90, mas estamos chegando lá)
Saídas maiores
Se você estiver usando a saída do console a partir de uma linha de comando, sugiro algo como
universe.exe 100 > temp.txt
isso, para que seja muito mais rápido. Com Notepad ++, você pode então temp.txt aberta, bateuctrl+H
, entrar^(.*?)$\s+?^(?=.*^\1$)
no Encontre o campo, insira nada no Substituir campo, vire Modo de Busca paraRegular Expression
, vire Na selecção e . corresponde à nova linhaOFF
e pressioneReplace All
. Agora você apenas vê onde as alterações ocorreram, em vez de 8000 linhas de saída (parece que há bugs fazendo mais de 2000-3000 linhas por vez).Correções / Ajustes
fonte
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'
parachar t[]="dDuUbBlLcCsSnNmMgGpeETtZWH"
? Devem trabalhar em c , não tenho certeza sobre c ++Python 3, 1.247 * 0,9 = 1.122,3
Bem, esta é a minha entrada mais longa, mas pelo menos sou mais baixa que C ++.
Agora com bônus adicional! Ele deve ser chamado com um número como o primeiro argumento.
Meu universo não trabalhava com partículas em decomposição que não fossem Higgs Boson, mas agora funciona. Além disso, eu não tinha a pluralização ou pontuação correta, mas na verdade tenho agora.
Estou chegando tão perto do sub 1k!
fonte
import random
. Tanta coisa para o determinismo.Perl 6 , (707 bytes -10%) Pontuação 636.3
Com algumas quebras de linha desnecessárias para um pouco mais de legibilidade:
Experimente online!
Alguma explicação: Deus e o Homem
Existem 2 estruturas de dados contendo a física
%p
e a nomeação%h
; Deus e homem, por assim dizer. O hash da física fornece um conjunto de strings indexados pela letra de partícula instável original, que pode ser dividida, dividida em hash e convertida em um Mix:Cada partícula recebe uma letra e, portanto, cada uma dessas misturas especifica uma coleção de decaimentos de partículas. H decai para WW, com probabilidade ponderada 14.1. Os pares partícula-antipartícula são codificados com letras maiúsculas e minúsculas, como
c
eC
para o quark de charme e o antiquark de charme.E o homem pensou um pouco, e chamou de antitau lepton
A nomeação é toda configurada
%h
, o que apenas mapeia cada letra para um nome de partícula. É um golfe até certo ponto, mas suspeito que há espaço para melhorias, dada a quantidade de repetições.String original
Com essas duas estruturas, o universo é simulado, é claro, pela manipulação de cordas. O mesmo
"H"
acontece com um universo com um único bóson de Higgs. A estrutura do gerador_,_..._
é usada para criar um loop e separa a evolução do estado da cadeia do universo (retida$_
) da impressão. A impressão é feita ensacando as letras no universo e mapeando as contagens resultantes (com plurais!).Espirros de partículas em existência
O desenvolvimento de partículas envolve o mapeamento para um valor escolhido no Mix para essa partícula; então
t
, o quark superior, evolui comoO Perl6 nos permite escolher aleatoriamente uma daquelas chaves com aquelas ponderações dadas através do simples andarilho
.roll
. Então, rolamost
e obtemos, dizemosWb
e substituímos em nosso universo "HtT" -> "HWbT". Cada partícula instável tem a si mesma como um possível rolo, o que nos permite simplificar a estrutura versus ter que verificar se ela se deteriorou ou não; na maioria das vezes você rola para "H", você apenas obtém "H" novamente.Teoria experimental das cordas
Você pode assistir a seqüência do universo evoluir através desta versão modificada .
atuação
Eu levei até 100 H no TIO, inevitavelmente, se você quisesse ir muito além, seria melhor fazer algumas alterações, afinal é a Grand Unified String Theory.
fonte
Groovy,
15061454 - 10% = 1309 bytesAssume que o número de partículas do bóson de Higgs inicial é dado como o primeiro argumento na linha de comando:
fonte
PHP, 989 - 10% = 890,1 bytes
Sub 1K bebê! Obrigado vsz, este foi um desafio muito divertido. Tantas maneiras de fazer isso e muito difícil verificar se sua saída está correta.
O programa pode usar um argumento de linha de comando para especificar o número inicial de bósons de Higgs, por exemplo
php universe_simulator.php 5
Aqui está a mesma coisa com quebras de linha para ... "legibilidade" ...
Alguma saída:
fonte
QBasic
2161 * .9 = 19452028 * .9 = 18251854 * .9 = 1669 bytesAgora que QBasic é o LOTM, pensei em revisar minha primeira resposta sobre o PPCG de todos os tempos. Conseguiu derrubar 140 bytes, nada mal!
Com base nos comentários de @TaylorScott e @DLosc, eu fiz uma reformulação completa:
O código
Saída de amostra
fonte
For i=0To 28
x$=Mid$("H00433099979405H004330999550m4H004330998440ZpH004330996210ppH004330980310ZZH004330947610c3H004330877210T2H004330789010ggH004330648010WWH004330000000b12012950666670W12012950333340W82012950000000W70012950666670Wb0012950333340Ws0012950000000WdW0500006666702nW0500003333404nW050000000000+nZ050000882010c3Z050000764010u9Z050000612010b1Z050000460010s8Z050000308010d7Z050000274010T2Z050000240010m4Z050000206010-+Z050000000000n6",15*i+1,15)
...Next
em função def$()
mais variedadee$()
s$()
,Next:Next
pode serNext j,i
, e você deve verificar se as?
instruções precisam de todos esses;
s. Mas também parece que sua saída não atende a especificação no momentoC # 6,
3619361736113586 - 10% = 3227,4 bytesO programa utiliza dois argumentos opcionais para o número de Bósons de Higgs iniciais e a semente a ser usada na classe Random.
Eu não deveria ter usado objetos para isso, provavelmente tentarei fazer uma segunda solução usando matrizes, mas provavelmente seria semelhante à solução C ++ já publicada. O número de bósons de Higgs com quem posso lidar também é severamente limitado, acho que pelo menos uma hora para H = 1.000.000. Números menores funcionam razoavelmente bem.
Saída de amostra:
Vou postar as duas últimas linhas para a execução h = 1000000 quando terminar, provavelmente mais tarde hoje.Como prometido:fonte
else {U(new T(0>1))
e múltiplo emn < 2 / 3.0
e um emn <2/3.0
.if (a.Length
, e outro emif (N[x]!=1
, terceiro emo+= $
. Além disso, você está analisandoa[0]
um número inteiro duas vezes, quando o resultado pode ser salvo em um número inteiro. Eu acho queY==1.0
pode serY==1.
, mas não tenho certeza disso.i!=0
poderia seri
. Não sei se suas variáveis podem realmente negar, mas se não, você pode substituir==0
s por<1
. O título deve dizer C # 6, já que você está usando interpolação de string.Mathematica, 950 bytes-10% = 855 bytes
Usando a compressão de expressão:
Código não compactado (1168 bytes-10% = 1051,2 bytes):
O parâmetro inicial pode ser escolhido alterando o valor de a.
Percebi que usei a probabilidade errada para o bóson de Higgs, mas atualmente não posso alterá-la (em algumas horas). Portanto, adicione 3 ou 4 bytes à solução atual. (Foi um valor de teste)
fonte
Perl,
973986959944 bytes -10% = 849,6 pontosO recuo e as novas linhas não fazem parte do código e são fornecidos apenas para que você não fique rolando por 30 anos para ler tudo.
Existem algumas otimizações de 0 byte que eu nunca me preocupei em desfazer.
Obviamente, a maior parte do código está criando os hashes iniciais.
%p
contém os nomes de todas as partículas, explorando o recurso de palavra de barra do Perl.%r
determina as taxas de decaimento. Se não estiver em destaque aqui, não decairá.%d
contém as partículas de decomposição.Como a ordem das partículas na saída não importa, não me importo de alterá-la da maneira aleatória em que Perl acessa as chaves no hash, o que leva a coisas como as seguintes:
Esta foi realmente uma aventura emocionante. Quebra-cabeça maravilhoso, honestamente, eu me diverti muito! :)
fonte
Python 3.6.1,
11831157...905889 * 0,9 = 800,1 bytesA primeira vez que você enviou um desses, mas esse desafio parecia bem divertido, então vamos lá ...
Quase certamente não é tão golfe quanto poderia ser, mas eu sou bastante inexperiente nisso, então qualquer dica é bem-vinda.
Experimente online!
Edit: Por uma questão de brevidade, uma lista resumida das edições que fiz (obrigado comentaristas pela ajuda!):
random.choices()
se probabilidades ponderadas, não porcentagens, para que eu pudesse economizar alguns bytes ao mudar algumas coisas de dez a 28 bytes salvos! A probabilidade de decaimento de Higgs estava errada - eu li 0,43% em vez de 0,043%, o que custou dois bytes.any()
,+=
em vez delist.extend()
e uma diferenteimport
afirmação.choices(*p[x][1:])
para salvar um casal ex and y or z
evitarif...else...or
.enumerate()
por copiar o universo e usá-lolist.remove()
no original (oenumerate
método foi quebrado de qualquer maneira).print()
declaração eif
declarações mescladas . Removidos alguns suportes desnecessários.Versão mais legível:
Amostra de saída com bósons de Higgs 5000 - pode executar uma execução maior mais tarde para ver se existe algum decaimento do quark superior:
Se eu fiz algo errado, entre em contato e tentarei consertar!
fonte
Ruby,
997995 bytes -10% = 895.5 pontosedit: adicionado 'e' como o último delimitador, conforme observado pela breadbox
Publicando pela primeira vez no PPCG, esse é um desafio antigo, mas eu me diverti muito fazendo isso. Aqui está o código
As strings são compactadas fatorando palavras recorrentes (vars
s
et
). Os produtos de decomposição são armazenados compactamente como string (varr
), cada letra é uma partícula. Uma funçãof
imprime o estado do universo mapeando a matriz de partículas em seqüências de caracteres. Sinto que existem alguns bytes para cortar na linha de atualização de estado, mas não consigo encontrar nada melhor.Saída de amostra
atuação
Não é tão ruim! Ele calculou 100000 bóson de Higgs em 25seg
fonte
>
seu redorwhile
? Faz um tempo desde que eu fiz alguma coisa em Ruby.D,
11721101 bytes - 10% = 990,9 bytesUngolfed
fonte
Kotlin : 1330 - 10% = 1197 bytes
Minha primeira submissão de código de golfe; muito ineficiente devido às listas serem mais golfistas que os mapas, mas aparentemente corretas! Funciona na implementação de JVM ou JS e utiliza um argumento (opcional).
Versão menos golfe
fonte
Uma apresentação bastante longa.
Não tanto assim, mas ainda mais curto que o outro python.
Tome a quantidade inicial de Higgs como entrada.
Python 3 ,
11341120 bytes - 10% =1020,61008 pontosExperimente online!
fonte
F #,
19931908 bytes - 10% = 1718 bytesExperimente online!
Ungolfed, fica assim:
fonte