CCC 2016: Círculo de Vida

8

Antes de começar, esse desafio não era meu originalmente

Créditos à Universidade de Waterloo. Isto veio da Competição de Computação Canadense 2016, Problema Sênior 5. Aqui está um link clicável para o PDF do concurso:

http://cemc.uwaterloo.ca/contests/computing/2016/stage%201/seniorEn.pdf

Aqui está um link para o site:

http://cemc.uwaterloo.ca/contests/past_contests.html

Desafio

Dada uma matriz de agrupamento de dois valores constantes, determine a configuração após nevoluções para entrada inteira positiva n. Esses dois valores representam uma célula viva e uma célula morta. As evoluções funcionam assim:

Evolução!

Após cada iteração, uma célula estará ativa se tiver exatamente um vizinho vivo na iteração anterior. Menos ainda e morre de solidão; mais e morre de superlotação. O bairro é exclusivo: ou seja, cada célula tem dois vizinhos, não três.

Por exemplo, vamos ver como 1001011010evoluiria, onde 1é uma célula viva e 0é uma célula morta.

(0) 1 0 0 1 0 1 1 0 1 0 (1)
    *   $         %

A célula da célula *tem uma célula morta em ambos os lados e, portanto, morre de solidão.
A célula da célula $possui uma célula viva de um lado e uma célula morta do outro. Torna-se vivo.
O cel no %tem uma célula viva em ambos os lados, para que fique morto por superlotação.

Critérios Vencedores

O menor código vence.

I / O

Entrada será uma lista dos estados da célula como dois valores consistentes e um número inteiro representando o número de entradas, em algum formato razoável. A saída deve ser uma lista dos estados da célula após o número especificado de iterações.

Casos de teste

start, iterations -> end
1001011010, 1000 -> 1100001100
100101011010000, 100 -> 000110101001010
0000000101011000010000010010001111110100110100000100011111111100111101011010100010110000100111111010, 1000 -> 1001111111100010010100000100100100111010010110001011001101010111011011011100110110100000100011011001

Caso de
teste Este caso de teste congelou a haste e excedeu o limite de tamanho na pasta

HyperNeutrino
fonte
2
Eu não acho que isso deve ser marcado como código de golfe se a contagem de bytes for apenas um desempatador. Também não tenho certeza se é um bom desempate, pois o concurso degenerará em uma competição de código de golfe se você puder simplesmente portar respostas para um idioma mais conciso para vencer.
Dennis
@ Dennis Certo, vou remover a tag. O que você sugere para o desempate; o envio mais cedo é outra das minhas idéias.
HyperNeutrino
2
Estou votando como pouco claro no momento, já que não se sabe o que se entende por complexidade quando há vários parâmetros.
feersum
1
@feersum, há um pouquinho de jogo no algoritmo mais rápido . O algoritmo ingênuo leva Theta(nt)onde nestá o comprimento da matriz e té o número de evoluções; um algoritmo mais rápido leva Theta(n lg t).
Peter Taylor
1
@ Notts90 Espero que minha edição mais recente esclareça mais.
HyperNeutrino

Respostas:

6

APL (Dyalog) , 14 bytes

Solicita o estado inicial como lista booleana e, em seguida, o número de iterações

(1∘⌽≠¯1∘⌽)⍣⎕⊢⎕

Experimente online!

 prompt numérico (para lista booleana do estado inicial)

 nisso, aplique

(… A )⍣⎕ seguinte função tácita, tempos de prompt numérico

¯1∘⌽ o argumento girou um passo à direita

 diferente de (XOR)

1∘⌽ o argumento girou um passo à esquerda

Adão
fonte
3

Geléia , 7 bytes

ṙ2^ṙ-µ¡

Experimente online!

Caso de teste extra (rodapé para formatação) .

Explicação

ṙ2^ṙ-µ¡
     µ¡  - repeat a number of times equal to input 2:
ṙ2         - previous iteration rotated 2 to the left
  ^        - XOR-ed with:
           - (implicit) previous iteration
   ṙ-      - rotate back (by negative 1 to the left)
fireflame241
fonte
1

05AB1E , 6 bytes

FDÀÀ^Á

Experimente online!

Explicação

F        # input_1 times do
 D       # duplicate last iteration (input_2 the first iteration)
  ÀÀ     # rotate left twice
    ^    # XOR
     Á   # rotate right
Emigna
fonte