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
...
Respostas:
Ruby, Rev B
171161 bytesA correção da saída para z = 1 custa 10 bytes. É um caso especial: a hélice tem na verdade 3 caracteres de largura se você a observar a 90 graus, mas quando a vemos em 0 graus, ela tem apenas 1 caractere.zero espaços à esquerda em z = 1 não é mais necessárioAlgumas economias eliminando colchetes e multiplicando y.abs por 2 antes do truncamento ao calcular o número de caracteres necessários.
Finalmente, evitei o
include Math
(necessário parasin
ePI
) usando aritmética complexa de números com potências do númeroi
. A parte imaginária do número complexo é equivalente ao pecado x, exceto que ele se repete no período 4 em vez do período 2 * PI. A gravação dessa alteração foi de 1 ou 0 bytes.Ruby, Rev A 165 bytes
Isso é muito mais longo do que o esperado. Existem algumas oportunidades potenciais de golfe a serem exploradas.
Comentado no programa de teste
fonte
I=gets.to_i
deve estarI=gets.to_f
.C,
294289285283281270265237218 bytesOu a versão mais longa que analisa a entrada da main:
É uma implementação geral bastante burra, com alguns truques de impressão. Há algumas inclusões ausentes, usa a sintaxe K&R para a função e depende dos inicializadores de intervalo do GCC, portanto isso não é muito padrão. Além disso, a versão da função ainda usa globais, por isso só pode ser chamada uma vez!
A versão da função usa 2 parâmetros; aguarde (em segundos) e zoom. Aqui está um chamador para ele:
Correr como:
Demolir:
fonte
strtod
eatof
.C,
569402361 bytesPreparou isso muito rápido, então tenho certeza de que há outras coisas que eu poderia fazer para diminuir minha pontuação, mas estou feliz por ter esse programa para compilar e executar corretamente na primeira tentativa.
Versão de golfe:
UPDATE: Ajustei o loop para imprimir tudo em uma instrução de impressão e usei o fato de que variáveis são definidas como int por padrão para raspar alguns bytes. UPDATE2: Alguns renomeadores de var e alguns encurtamentos lógicos para economizar mais alguns bytes.
fonte
JavaScript (ES6)
241244227222231 bytesIsso parecia interessante - eu amo arte ASCII!
Apenas começou, ainda no processo de jogar golfe ...
--- EDIT: Acontece que eu realmente não posso colocá-lo em eval () - caso contrário, ele não pode acessar os vars I e Z (adiciona 9 bytes)
- economizou 6 bytes graças a user81655
- economizou 5 bytes graças a Dave
Explicação
fonte
c^=!e
vez dec+=a==b
(permite remover a%2
verificação posteriormente). Também-m+2
poderia ser2-m
!c=c^(e==0)
; aplica um XOR da mesma maneira que você adicionou anteriormente. Se você não estiver familiarizado com XOR, é uma operação bit a bit: OU exclusivo (wikipedia pode explicar-lo corretamente)