fundo
O Random Domino Automaton é um modelo de brinquedo para terremotos, inspirado em autômatos celulares. Nesse desafio, sua tarefa é simular uma versão simplificada desse modelo e coletar dados dele.
O autômato é definido em uma matriz A
de k
bits, representando uma linha de falha na qual terremotos podem ocorrer. A matriz envolve suas bordas. A condição A[i] = 0
significa que a posição i
está relaxada e A[i] = 1
significa que está excitada ou contém energia armazenada. Em cada etapa do tempo, uma posição da matriz é escolhida uniformemente aleatoriamente. Se essa posição estiver relaxada, ela ficará excitada (energia potencial é adicionada ao sistema). Se essa posição já estiver excitada, desencadeia um terremoto, e a posição escolhida e todas as posições excitadas conectadas a ela são relaxadas novamente. O número de posições excitadas que ficam relaxadas é a magnitude do terremoto.
Exemplo
Considere a matriz
100101110111
12. Se o processo aleatório escolher o segundo bit da esquerda, a matriz será atualizada para
110101110111
^
desde que o bit escolhido (marcado com ^
) foi 0
. Se, em seguida, escolhermos o quarto bit da esquerda, que é um isolado 1
, um terremoto de magnitude 1 é acionado e o bit é definido 0
novamente:
110001110111
^
Em seguida, podemos escolher o segundo bit da direita, o que desencadeia um terremoto de magnitude 5:
000001110000
^
Observe que todos os 1
s no mesmo "aglomerado" que o escolhido foram parte do terremoto, e a matriz se envolve na borda.
A tarefa
Você deve tomar como entrada dois números inteiros positivos k
e t
, e sua tarefa é simular o autômato aleatório do dominó para t
intervalos de tempo, iniciando a partir de uma k
matriz de comprimento inicial de todos os 0
s. Sua saída deve ser uma lista L
de k
números inteiros, onde L[i]
(com indexação baseada em 1) contém o número de terremotos de magnitude i
que ocorreram durante a simulação. Você tem permissão para eliminar zeros à direita da saída.
Para as entradas k = 15
e t = 1000
, algumas saídas representativas são
[117, 97, 45, 26, 10, 5, 3, 1, 3, 0, 0, 0, 0, 0, 0]
[135, 91, 58, 21, 8, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0]
[142, 63, 51, 31, 17, 4, 2, 1, 1, 0, 0, 0, 0, 0, 0]
[106, 75, 45, 30, 16, 8, 5, 2, 2, 0, 0, 0, 0, 0, 0]
[111, 96, 61, 22, 3, 8, 3, 2, 0, 0, 0, 1, 0, 0, 0]
Regras
Programas e funções completos são permitidos. A menor contagem de bytes vence e as brechas padrão não são permitidas.
Observe que você não precisa simular o autômato usando uma implementação específica, apenas a saída é importante.
Respostas:
Pitão, 48 bytes
Fiquei um pouco inspirado pela explicação de @ Dennis. Teve alguns pensamentos semelhantes ontem, mas realmente não os seguiu.
Experimente online: Demonstração
Explicação:
fonte
CJam,
5755 bytesEssa é uma função anônima que exibe k e t da pilha ( k em cima de t ) e deixa a matriz desejada em troca.
Experimente online no intérprete CJam .
Como funciona
fonte
Python 2, 153 bytes
Acontece que eu tinha quase a mesma solução que a de Fry , mas com um pouco mais de brincadeira.
fonte
randrange
, mas não sabia que funcionava com apenas um argumento. Bom trabalho!Java,
278272 bytesJava não é a melhor linguagem de golfe, e eu não sou o melhor jogador de golfe, mas foi muito divertido escrever, então aqui está! Deixe-me saber sobre bugs e melhorias! (Decidi reenviar como apenas uma função.)
E o arquivo com espaços e comentários:
fonte
Alt+09
, ou guia-lo no bloco de notas ++)d[q]+=1;
isso pode se tornard[q]++;
você pode incrementar diretamente nas matrizes em vez de usar + = em qualquer lugar. Isso deve salvar um monte de personagens.for(;t>0;t--){
pode ser alterado parafor(;t-->0;){
: DPython 2,
174170Obrigado @Vioz por encontrar uma maneira mais curta de fazer
D
e provar novamente quenot
geralmente é jogável. E também para escrever a explicação.Eu tentei criar um programa semelhante em Pyth, mas parece haver um problema de escopo no que eu estava tentando fazer. Isso implementa de forma bastante ingênua os dominós e a função
U
propaga terremotos. A direção da subtraçãoU
não precisa de um mod, porque será envolvida naturalmente. O último elemento deE
conta o número de vezes que um zero é transformado em um, portanto, não é impresso no final.Ungolfed + Explicação:
fonte
D[r]=not e
aD[r]=e<1
salva 2 bytes, eE=[0]*-~k
paraE=D+[0]
salva outro 2, para levá-lo para baixo para 170.ES6,
224196189179172O material mais fácil já foi jogado, mas ainda há trabalho a fazer. Vou digitar uma explicação mais tarde. Além disso, se alguém puder me dizer por que a
new Date%k
coisa curta não funciona mais tão bem, isso seria ótimo.O uso é
fonte
new
. Você não precisa quet
no loop for, Não há necessidade de que dois últimos;
a[r]^=1
vai DEFS trabalho se o valor inicial é tanto1
ou0
Perl, 212
A versão anterior que eu havia apresentado não estava encapsulando corretamente, e a implementação levou algum trabalho.
Provavelmente este não é o algoritmo certo para isso, mas não consigo pensar agora. A versão ungolfed está abaixo.
Ungolfed:
fonte
CJam, 76 bytes
Bem, isso não é muito competitivo. Mas como demorei bastante, pensei em publicá-lo de qualquer maneira.
Experimente online
fonte