Su código va a generar una representación muy simple del ADN en el arte ASCII, para siempre. Tomará dos números como entrada en cualquier formato que desee: como una lista, como argumentos para una función, en stdin, etc.
- Un intervalo de punto flotante
I
en segundos entre 0.0 y 1.0 (inclusive) - Un nivel de zoom
Z
como entero de 1 a 64 (inclusive)
Su código imprimirá una línea en stdout o su equivalente cada I
segundo, produciendo una salida infinita que se parece a esto (para el nivel de zoom 4):
A
T-----a
G-------c
G-----c
g
t-----A
a-------T
c-----G
T
A-----t
C-------g
...
Específicamente, nuestra representación de ADN es un par de ondas sinusoidales conectados por guiones, uno que consiste en los caracteres a
, c
, g
, y t
, el otro de los personajes A
, C
, G
, y T
. Si x
es el número indexado en 0 de la línea que estamos imprimiendo actualmente, la posición basada en 0 del carácter en la onda minúscula viene dada por (sin(πx / Z) + 1) * Z
, y en la onda mayúscula está dada por (-sin(πx / Z) + 1) * Z
, ambos redondeados (sin piso) al más cercano entero. Más detalles:
- En los casos en que las dos ondas se superponen, debe alternar qué onda está en el frente, comenzando con la onda en mayúscula. (¡Comenzar con la onda en minúscula nos daría una doble hélice que no existe !)
- Ignorando el caso, A siempre se empareja con T y C siempre se empareja con G, como en el ADN real. Los pares mismos deben elegirse al azar con una distribución uniforme sobre las cuatro posibilidades. No importa si la elección de los pares es igual o diferente en ejecuciones sucesivas de su código. La calidad estadística de sus elecciones aleatorias no es un problema siempre que el resultado no tenga un patrón obvio y un período de al menos miles de millones (los PRNG defectuosos como RANDU están bien).
- No debe tener espacios finales o rellenar cada línea hasta la posición máxima de las ondas en ese nivel de zoom (en el ejemplo anterior, nueve caracteres). El nivel de zoom 1 puede tener un espacio adicional adicional opcional por razones matemáticas.
Debido a que el ADN es pequeño, su código deberá ser lo más corto posible.
Más ejemplos:
Nivel 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
...
Nivel de zoom 2:
A
T---a
c
g---C
G
A---t
c
a---T
...
Nivel de zoom 1 (tenga en cuenta el espacio inicial):
G
a
C
t
...
Respuestas:
Ruby, Rev B
171161 bytesLa fijación de la salida para z = 1 cuesta 10 bytes. Es un caso especial: la hélice tiene realmente 3 caracteres de ancho si la miras a 90 grados, pero si la observamos a 0 grados, solo tiene 1 carácter de ancho.cero espacios iniciales en z = 1 ya no son necesariosAlgunos ahorros al eliminar los corchetes y al multiplicar y.abs por 2 antes del truncamiento al calcular la cantidad de caracteres necesarios.
Finalmente, evité el
include Math
(requerido parasin
yPI
) usando aritmética de números complejos con potencias del númeroi
. La parte imaginaria del número complejo es equivalente a sen x, excepto que se repite con el período 4 en lugar del período 2 * PI. El ahorro para este cambio fue de 1 o 0 bytes.Ruby, Rev A 165 bytes
Esto es mucho más largo de lo esperado. Hay algunas oportunidades potenciales de golf para explorar.
Comentó en el programa de prueba
fuente
I=gets.to_i
debería serI=gets.to_f
.C,
294289285283281270265237218 bytesO la versión más larga que analiza la entrada de main:
Es una implementación general bastante tonta, con algunos trucos de printf. Le faltan algunas funciones, utiliza la sintaxis K&R para la función y se basa en los inicializadores de rango de GCC, por lo que esto no es muy estándar. Además, la versión de la función todavía usa globales, por lo que solo se puede llamar una vez.
La versión de la función toma 2 parámetros; esperar (en segundos) y hacer zoom. Aquí hay una llamada para ello:
Correr como:
Descompostura:
fuente
strtod
yatof
.C,
569402361 bytesAgité esto bastante rápido, así que estoy seguro de que hay otras cosas que podría hacer para disminuir mi puntaje, pero estoy feliz de que este programa se compile y se ejecute correctamente en el primer intento.
Versión de golf:
ACTUALIZACIÓN: Ajusté el bucle para imprimir todo en una declaración de impresión y usé el hecho de que las variables se definen como int por defecto para eliminar algunos bytes. ACTUALIZACIÓN2: algunos cambios de nombre de var y algunos acortamiento lógico para reducir algunos bytes más.
fuente
JavaScript (ES6)
241244227222231 bytesEsto parecía interesante: ¡me encanta el arte ASCII!
Acabo de empezar, todavía en el proceso de jugar al golf ...
--- EDITAR: resulta que en realidad no puedo ponerlo en eval (); de lo contrario, no puede acceder a los valores I y Z (por lo que agrega 9 bytes)
- guardado 6 bytes gracias a user81655
- guardado 5 bytes gracias a Dave
Explicación
fuente
c^=!e
lugar dec+=a==b
(le permite eliminar la%2
verificación más adelante). También-m+2
podría ser2-m
!c=c^(e==0)
; aplica un XOR de la misma manera que anteriormente tenía una adición. Si no está familiarizado con XOR, es una operación bit a bit: eXclusive OR (wikipedia puede explicarlo correctamente)