Seu código irá gerar uma representação muito simples do DNA, em arte ASCII, para sempre. Serão necessários dois números como entrada em qualquer formato que você desejar: como uma lista, como argumentos para uma função, no stdin, etc.
- Um intervalo de ponto flutuante
I
em segundos entre 0,0 e 1,0 (inclusive) - Um nível de zoom
Z
como um número inteiro de 1 a 64 (inclusive)
Seu código imprimirá uma linha para stdout ou seu equivalente a cada I
segundo, produzindo uma saída infinita parecida com esta (para o nível de zoom 4):
A
T-----a
G-------c
G-----c
g
t-----A
a-------T
c-----G
T
A-----t
C-------g
...
Especificamente, a representação de ADN é um par de ondas sinusoidais ligados por hífens, uma que consiste nos caracteres a
, c
, g
, e t
, o outro dos caracteres A
, C
, G
, e T
. Se x
é o número indexado 0 da linha que estamos imprimindo atualmente, a posição baseada em 0 do caractere na onda minúscula é dada por (sin(πx / Z) + 1) * Z
, e na onda maiúscula é dada por (-sin(πx / Z) + 1) * Z
, ambas arredondadas (sem piso) para a mais próxima inteiro. Detalhes adicionais:
- Nos casos em que as duas ondas se sobrepõem, você precisa alternar qual onda está na frente, começando pela onda maiúscula. (Começar com a onda minúscula nos daria uma hélice dupla que não existe !)
- Ignorando o caso, A sempre emparelha com T e C sempre emparelha com G, como no DNA real. Os pares devem ser escolhidos aleatoriamente com uma distribuição uniforme nas quatro possibilidades. Não importa se a escolha dos pares é igual ou diferente em execuções sucessivas do seu código. A qualidade estatística de suas escolhas aleatórias não é um problema, desde que a saída não tenha um padrão óbvio e um período de pelo menos bilhões (os PRNGs defeituosos como RANDU estão bons).
- Você não deve ter espaços à direita ou colocar todas as linhas na posição máxima das ondas nesse nível de zoom (no exemplo acima, nove caracteres.) O nível de zoom 1 pode ter um espaço à direita adicional por razões matemáticas.
Como o DNA é pequeno, seu código precisará ser o mais curto possível.
Mais exemplos:
Nível de zoom 8:
T
C-----g
A-----------t
C-------------g
G---------------c
T-------------a
T-----------a
T-----a
c
g-----C
t-----------A
g-------------C
a---------------T
...
Nível de zoom 2:
A
T---a
c
g---C
G
A---t
c
a---T
...
Nível de zoom 1 (observe o espaço à esquerda):
G
a
C
t
...