fundo
Sim, a física da cadeia de bits é uma coisa real . A idéia é construir uma nova teoria da física usando apenas cadeias de bits que evoluem sob uma regra probabilística ... ou algo assim. Apesar de ler alguns artigos sobre isso, ainda estou bastante confusa. No entanto, o universo bitstring contribui para um bom código de golfe.
Program Universe
A física da cadeia de bits ocorre no chamado universo do programa . Em cada etapa da evolução do universo, há uma lista finita L
de cadeias de bits de algum comprimento k
, começando pela lista de dois elementos em [10,11]
que k = 2
. Um timestep é processado da seguinte maneira (no pseudocódigo do tipo Python).
A := random element of L
B := random element of L
if A == B:
for each C in L:
append a random bit to C
else:
append the bitwise XOR of A and B to L
Todas as escolhas aleatórias são uniformemente aleatórias e independentes uma da outra.
Exemplo
Um exemplo de evolução de 4 etapas pode parecer com o seguinte. Comece com a lista inicial L
:
10
11
Escolhemos aleatoriamente A := 10
e B := 10
, que são a mesma linha, o que significa que precisamos estender cada sequência L
com um bit aleatório:
101
110
Em seguida, escolhemos A := 101
e B := 110
, como eles não são iguais, adicionamos seu XOR a L
:
101
110
011
Em seguida, escolhemos A := 011
e B := 110
, novamente, anexamos seu XOR:
101
110
011
101
Finalmente, escolhemos A := 101
(última linha) e B := 101
(primeira linha), que são iguais, portanto, estendemos com bits aleatórios:
1010
1100
0111
1010
A tarefa
Sua tarefa é pegar um número inteiro não negativo t
como entrada, simular o universo do programa para t
timesteps e retornar ou imprimir a lista resultante L
. Observe que t = 0
resulta na lista inicial [10,11]
. Você pode imprimir L
como uma lista de listas de números inteiros, lista de listas de valores booleanos ou uma lista de strings; se a saída for STDOUT, você também poderá imprimir as cadeias de bits uma por linha em algum formato razoável. A ordem das seqüências de bits é significativa; em particular, a lista inicial não pode ser [11,10]
, [01,11]
ou algo assim. Ambas as funções e programas completos são aceitáveis, brechas padrão não são permitidas e a menor contagem de bytes vence.
Respostas:
Pitão,
2726 bytesExperimente online: Demonstração
Explicação:
fonte
xVFK
é equivalente axMK
.xVFK
é equivalente àxMCK
mesma contagem de bytes.CJam,
42403837 bytes1 byte salvo pelo Sp3000.
Explicação
Crie o estado inicial como um número de base 2:
E, em seguida, execute o loop principal e imprima o resultado no final:
Teste aqui.
fonte
Julia,
141129 bytesNada inteligente. Cria uma função sem nome que aceita um número inteiro como entrada e retorna uma matriz de matrizes. Para chamá-lo, dê um nome, por exemplo
f=t->...
.Ungolfed + explicação:
Exemplos:
Economizou 12 bytes graças ao ML!
fonte
A=something;B=something else to A,B=something,something else
:t->(L=Any[[1,0],[1,1]];for i=1:t r=1:length(L);A,B=L[rand(r)],L[rand(r)];A==B?(for j=r L[j]=[L[j],rand(0:1)]end):(push!(L,A$B))end;L)
A
eB
separadamente é na verdade o mesmo comprimento que atribuí-los juntos, então deixei essa parte como está. Obrigado novamente por sua sugestão!Python 2, 141
Tentei alguns métodos diferentes, mas o melhor que pude obter foi relativamente simples. Agradeço ao @ Sp3000 por 15 caracteres ou mais (e por me ensinar sobre a existência de
int.__xor__
).fonte
Python 2,
127122Supondo que cadeias de bits python do formulário
'0b1'
etc. estejam OK:Apenas uma nuance leve aqui é o uso de XOR (A, B) = 0 se A = B.
Agradecimentos ao @ Sp300 por diminuir o
for
loop fechadofonte
Pyth, 34
Usa reduzir para aplicar cada iteração. Vou explicar quando terminar o golfe.
Experimente aqui
fonte
K,
465346 bytesUma boa parte do tamanho (cerca de 7 bytes) disso se deve ao fato de K não ter
xor
operador, então eu mesmo tive que implementar um. Originalmente, eu usei uma lista de strings, seguida por perceber que era insanamente estúpido. Então agora eu cortei os 7 bytes novamente!Antes:
@JohnE apontou nos comentários que o estado inicial deveria ser codificado, o que custou 7 bytes extras. : /
fonte
(1 0;1 1)
- seu programa aceita isso como entrada.JavaScript ( ES6 ) 152
Uma função que usa strings (com números deve ser menor, mas nas operações de javascript bit são limitadas a números inteiros de 32 bits).
Teste no Firefox usando o trecho de código abaixo.
fonte
K,
454138 bytesA estrutura da minha resposta é bastante semelhante à do @ kirbyfan64sos, mas em vez de strings eu usei vetores 1/0 e evito a necessidade de um condicional (
:[ ; ; ]
) indexando em uma lista.Algumas execuções:
Editar:
Salva quatro bytes com uma maneira mais compacta de construir o universo inicial:
Edit2:
Esqueci que "escolher" pode ter uma lista como argumento correto:
Para que eu possa simplificar parte disso. Crédito onde é devido, Kirby pegou esse truque antes de mim.
fonte
Javascript,
241233 bytesIsso é longo.
fonte
for(b=prompt(a=[[1,0],[1,1]]),R=Math.random;b--;){c=a.length;d=a[c*R()|0];e=a[c*R()|0];if(d+""==e+"")for(f=0;f<c;f++)a[f].push(2*R()|0);else{for(h=0,g=[];h<d.length;)g.push(d[h]^e[h++]);a.push(g)}}alert(a.join("\n"))
produz a saída desejada 3/5 do tempo.for(b=prompt(a=[[1,0],[1,1]]),R=Math.random;b--;){c=a.length;d=a[c*R()|0];e=a[c*R()|0];if(d+""==e+"")for(f=0;f<c;f++)a[f].push(2*R()|0);else{g=[];for(h=0;h<d.length;h++)g.push(d[h]^e[h]);a.push(g)}}alert(a.join("\n"))
funciona 90% do tempo.T-SQL (2012+), 1019
Lamento muito que isso não seja nem um pouco competitivo, mas, para ser sincero, não achei que conseguisse fazer isso funcionar e tive que publicá-lo uma vez. Eu tentei jogar um pouco de golfe :)
Para lidar com as conversões binárias / inteiras, tive que criar algumas funções escalares (513 dos bytes).
A
passa de inteiro para uma sequência de bits.B
faz o contrário.Depois, há o procedimento.
@C
é o número de etapasDez mil iterações levaram cerca de 2 minutos e retornaram 9991 linhas
fonte
Pitão - 37 bytes
Óbvio, apenas segue psuedocode. Provavelmente pode jogar muito golfe.
Experimente aqui online .
fonte
O2
vez deO1
.O1
fornece um número aleatório do intervaloU1 = [0]
.0
.Mathematica, 106 bytes
fonte
Perl, 102
Experimente- me .
fonte
R, 186
Nada de mágico aqui. Digite o valor para
t
no console R e execute o script. É difícil "jogar golfe" no código R, mas aqui está uma versão mais legível:fonte
sample
a uma variável. por exemplos=sample
, use s em vez de amostra. Infelizmente, acho que seu método de anexar um bit aleatório nolapply
final terminará com uma amostra aleatória sendo adicionada a todos os itens da lista.lapply(L,function(x)append(x,sample(0:1,1)))
parece funcionar, mas a um custo. Você pode substituí-loas.numeric
pelo1*
que deve receber de volta.Ruby, 82
Praticamente direto. Comparado com outras línguas que não praticam golfe, o ruby parece se dar bem com sua grande biblioteca padrão.
Saída de amostra para t = 101010:
fonte