Votre code va générer pour toujours une représentation très simple de l'ADN ASCII de l'ADN. Il prendra deux nombres en entrée dans n'importe quel format que vous souhaitez: comme une liste, comme arguments d'une fonction, sur stdin, etc.
- Un intervalle
I
à virgule flottante en secondes compris entre 0,0 et 1,0 (inclus) - Un niveau de zoom
Z
sous forme d'entier de 1 à 64 (inclus)
Votre code imprimera une ligne sur stdout ou son équivalent toutes les I
secondes, produisant une sortie infinie qui ressemble à ceci (pour le niveau de zoom 4):
A
T-----a
G-------c
G-----c
g
t-----A
a-------T
c-----G
T
A-----t
C-------g
...
En particulier, notre représentation de l' ADN est une paire d'ondes sinusoïdales reliés par des traits d' union, une constituée des caractères a
, c
, g
, et t
, à l'autre des caractères A
, C
, G
, et T
. Si x
le numéro 0-indexé de la ligne que nous imprimons actuellement, la position de base 0 du caractère dans la vague minuscule est donnée par (sin(πx / Z) + 1) * Z
, et dans la vague majuscule est donnée par (-sin(πx / Z) + 1) * Z
, à la fois arrondie (non parqueté) au plus proche entier. Plus de détails:
- Dans les cas où les deux ondes se chevauchent, vous devez alterner celle qui se trouve à l'avant, en commençant par l'onde en majuscule. (Commencer par l'onde minuscule nous donnerait une double hélice qui n'existe pas !)
- En ignorant la casse, A s'associe toujours à T et C s'associe toujours à G, comme dans l'ADN réel. Les paires elles-mêmes doivent être choisies au hasard avec une distribution uniforme sur les quatre possibilités. Peu importe si le choix des paires est le même ou différent lors des exécutions successives de votre code. La qualité statistique de vos choix aléatoires n'est pas un problème tant que la sortie n'a pas de modèle évident et une période au moins dans les milliards (les PRNG défectueux comme RANDU sont très bien.)
- Vous devez avoir aucun espace de fin ou remplir chaque ligne à la position maximale des vagues à ce niveau de zoom (dans l'exemple ci-dessus, neuf caractères.) Le niveau de zoom 1 peut avoir un espace de fin supplémentaire facultatif pour des raisons mathématiques.
Parce que l'ADN est petit, votre code devra être aussi court que possible.
Plus d'exemples:
Niveau 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
...
Niveau de zoom 2:
A
T---a
c
g---C
G
A---t
c
a---T
...
Niveau de zoom 1 (notez l'espace de tête):
G
a
C
t
...
Réponses:
Ruby, Rev B
171161 octetsLa correction de la sortie pour z = 1 coûte 10 octets. C'est un cas particulier: l'hélice fait vraiment 3 caractères de large si vous la regardez à 90 degrés, mais comme nous la regardons à 0 degré, elle ne fait que 1 caractère de large.aucun espace de tête sur z = 1 n'est plus nécessaireQuelques économies en éliminant les crochets et en multipliant y.abs par 2 avant la troncature lors du calcul du nombre de caractères nécessaires.
Enfin, j'ai évité le
include Math
(requis poursin
etPI
) en utilisant l'arithmétique des nombres complexes avec des puissances du nombrei
. La partie imaginaire du nombre complexe est équivalente à sin x, sauf qu'elle se répète avec la période 4 au lieu de la période 2 * PI. L'enregistrement pour cette modification était de 1 ou 0 octet.Ruby, Rev A 165 octets
C'est bien plus long que prévu. Il y a quelques opportunités potentielles de golf à explorer.
Commenté dans le programme de test
la source
I=gets.to_i
devrait êtreI=gets.to_f
.C,
294289285283281270265237218 octetsOu la version plus longue qui analyse les entrées du principal:
C'est une implémentation globale assez stupide, avec quelques astuces printf. Il a des inclusions manquantes, utilise la syntaxe K&R pour la fonction et s'appuie sur les initialiseurs de plage de GCC, donc ce n'est pas très standard. De plus, la version de la fonction utilise toujours des globaux, elle ne peut donc être appelée qu'une seule fois!
La version de la fonction prend 2 paramètres; attendez (en secondes) et zoomez. Voici un appelant pour cela:
Courir comme:
Panne:
la source
strtod
etatof
.C,
569402361 octetsCela a été assez rapide, donc je suis sûr qu'il y a d'autres choses que je pourrais faire pour diminuer mon score, mais je suis juste content d'avoir compilé et exécuté correctement ce programme dès la première tentative.
Version De-golf:
MISE À JOUR: J'ai ajusté la boucle pour tout imprimer dans une seule instruction d'impression et j'ai utilisé le fait que les variables sont définies comme int par défaut pour raser certains octets. UPDATE2: Certains var renommage et certains raccourcissement logique pour raser quelques octets de plus.
la source
JavaScript (ES6)
241244227222231 octetsCela semblait intéressant - j'adore l'art ASCII!
Je viens de commencer, toujours en train de jouer au golf ...
--- EDIT: il s'avère que je ne peux pas vraiment le mettre dans eval () - sinon il ne peut pas accéder aux vars I et Z (ajoute donc 9 octets)
- sauvé 6 octets grâce à user81655
- sauvé 5 octets grâce à Dave
Explication
la source
c^=!e
au lieu dec+=a==b
(vous permet de supprimer la%2
coche plus tard). Pourrait aussi-m+2
être2-m
!c=c^(e==0)
; il applique un XOR de la même manière que vous aviez précédemment un ajout. Si vous n'êtes pas familier avec XOR, c'est une opération au niveau du bit: eXclusive OR (wikipedia peut l'expliquer correctement)