Introdução
Neste desafio, simularemos um certo autômato celular probabilístico usando números pseudo-aleatórios muito ruins. O autômato celular é definido em cadeias binárias pela seguinte regra local. Suponha que o vizinho esquerdo de uma célula e a própria célula tenham estados a
e b
.
- Se
min(a,b) == 0
, então o novo estado deb
émax(a,b)
. - Se
min(a,b) == 1
, então o novo estado deb
é escolhido aleatoriamente{0,1}
.
A figura a seguir mostra uma possível evolução em 10 etapas de uma única 1
.
1
11
101
1111
11001
101011
1111111
10001001
110011011
1010111101
Observe como dois 1
s adjacentes às vezes evoluem para 1
, e algumas vezes para 0
, e os bits mais próximos da borda são sempre 1
s. Sua tarefa é produzir uma evolução de autômato celular dessa forma.
Entradas
Suas entradas são um número inteiro positivo n
, denotando o número de linhas a serem exibidas e uma lista não vazia de bits L
, que usamos como fonte de aleatoriedade.
Resultado
Sua saída é uma lista de listas ou matriz 2D de bits, representando a evolução de um único 1
para n
passos de tempo, como na figura acima. Você pode preencher a saída com 0
s para obter linhas de comprimentos iguais, se desejado, mas não deve haver 0
s iniciais .
As escolhas aleatórias no autômato celular devem ser retiradas da lista L
, voltando ao início quando estiver esgotado. Mais explicitamente, se a saída for percorrida uma linha de cada vez, de cima para baixo, da esquerda para a direita, as sucessivas escolhas aleatórias formarão a lista L
repetida quantas vezes forem necessárias.
Exemplo
Suponha que as entradas sejam n = 7
e L = [0,1,0]
. Em seguida, o autômato celular evolui da seguinte maneira durante as 7 etapas, onde colocamos um v
direito acima de cada escolha aleatória:
[1]
[1,1]
v
[1,0,1]
[1,1,1,1]
v v v
[1,1,0,0,1]
v
[1,1,1,0,1,1]
v v v
[1,0,0,1,1,1,1]
Se lermos todos os bits marcados com a v
, obtemos 01001001
, que é L
repetido 2,66 vezes. O próximo bit aleatório seria 0
.
Regras e Pontuação
Você pode escrever um programa completo ou uma função. A contagem de bytes mais baixa vence e as brechas padrão não são permitidas. O formato exato das entradas e saídas não é importante (dentro do motivo).
Casos de teste
Versão determinística, todo bit aleatório é 0
:
Inputs: 10 [0]
Output:
1
11
101
1111
10001
110011
1010101
11111111
100000001
1100000011
Todo bit aleatório é 1
:
Inputs: 6 [1,1]
Output:
1
11
111
1111
11111
111111
Versões pseudo-aleatórias:
Inputs: 10 [0,0,1]
Output:
1
11
101
1111
10101
111111
1010011
11110101
101011111
1111101001
Inputs: 10 [1,0,0,1]
Output:
1
11
111
1001
11011
111111
1001101
11010111
111111101
1011001111
Inputs: 15 [1,1,1,0,0,0]
Output:
1
11
111
1111
10001
110011
1110111
11011001
111111011
1100011111
11100100011
111101100101
1001111101111
11011000111111
101101001011101
fonte
min(a,b)
pora+b>1
emax(a,b)
coma+b
? Sei que você provavelmente teria que fazer algo para lidar com o primeiro caso de1
->11
(acho que você poderia fazerL=[1]+f()...
, ou encontrar uma maneira de inserir 1 na frenteL
porque isso sempre apareceria 1 para a segunda linha)r[x-1]&r[x] else
:)MATLAB,
146143138(Também funciona no Octave online, mas você precisa fazer login para salvar a função em um arquivo).
A função recebe uma entrada
n
eL
, e retorna uma matrizo
que contém a saída.Para os valores de entrada,
n
é um escalar eL
é um vetor de coluna, que pode ser especificado no formato[;;;]
. Não é exatamente o que você mostra, mas você diz que é flexível dentro da razão e isso parece ser.A saída é formatada como um
n x n
matriz contendo 0 e 1.E uma explicação:
Atualização: Eu consegui otimizar a instrução if-else para economizar alguns bytes. O formato de entrada voltou a mudar para o vetor da coluna.
fonte
Haskell,
153149 bytes%
retorna uma lista de listas de bits. Exemplo de uso:Oh céus! Carregar a lista aleatória
L
é pura dor. Vamos ver se isso pode ser mais curto.fonte
C #, 152 bytes
Não há nada de especial aqui. A função retorna uma matriz 2D onde a primeira classificação é a linha e a segunda é a coluna.
Linhas recuadas e novas para maior clareza:
fonte
TI-BASIC,
10694878687 bytesO TI-BASIC não tem um operador de incremento, certo? Bem, mais ou menos. A variável de equação
u
, normalmente usada com sequências, tem um recurso obscuro: quandou
é chamada com um argumento, a variável𝑛
é definida como uma maior que o argumento. O incremento condicional depende disso. (Estou esperando para usá-lo há muito tempo.)Para que a indexação de lista funcione corretamente,
𝑛
o valor padrão deve ser 0 e𝑛Min
o valor padrão 1; limpe a RAM da calculadora ou defina esses valores manualmente antes de executar isso.augment({0},Ans)+augment(Ans,{0
calcula uma lista de somas de dois elementos adjacentes, para que retorne uma lista de 0s, 1s e 2s. Então a mágica está nesta linha:O resultado dessa linha será que os elementos da lista serão 0 se forem 0 ou 2 e o bit lido for 0.
Caso de teste:
fonte