Ihr Code wird für immer eine sehr einfache ASCII-artige Darstellung der DNA erzeugen. Es werden zwei Zahlen in einem beliebigen Format als Eingabe verwendet: als Liste, als Argumente für eine Funktion, für stdin usw.
- Ein Gleitkommaintervall
I
in Sekunden zwischen 0,0 und 1,0 (einschließlich) - Eine Zoomstufe
Z
als Ganzzahl von 1 bis einschließlich 64
Ihr Code druckt jede I
Sekunde eine Zeile auf stdout oder das Äquivalent davon und erzeugt eine unendliche Ausgabe, die ungefähr so aussieht (für Zoomstufe 4):
A
T-----a
G-------c
G-----c
g
t-----A
a-------T
c-----G
T
A-----t
C-------g
...
Genauer gesagt, unsere Darstellung von DNA ist ein Paar von Sinuswellen , die durch Bindestriche verbunden ist , eine aus den Zeichen a
, c
, g
, und t
, die andere der Zeichen A
, C
, G
, und T
. Wenn x
die 0-indizierten Nummer der Zeile sind wir gerade gedruckt wird , die 0-basierte Position des Zeichens in der Kleinwelle wird durch gegeben (sin(πx / Z) + 1) * Z
, und in der Groß Welle ist gegeben durch (-sin(πx / Z) + 1) * Z
, die beide abgerundet (nicht platt) zum nächstgelegenen ganze Zahl. Weitere Details:
- In Fällen, in denen sich die beiden Wellen überlappen, müssen Sie abwechseln, welche Welle vorne liegt, beginnend mit der Welle in Großbuchstaben. (Wenn wir mit der Welle in Kleinbuchstaben beginnen, erhalten wir eine Doppelhelix, die es nicht gibt !)
- Ignoriert man den Fall, so paart sich A immer mit T und C immer mit G, wie in der realen DNA. Die Paare selbst sollten zufällig mit einer gleichmäßigen Verteilung über die vier Möglichkeiten ausgewählt werden. Es spielt keine Rolle, ob die Auswahl der Paare bei aufeinanderfolgenden Codeausführungen gleich oder unterschiedlich ist. Die statistische Qualität Ihrer zufälligen Auswahl ist kein Problem, solange die Ausgabe kein offensichtliches Muster und einen Zeitraum von mindestens mehreren Milliarden aufweist (fehlerhafte PRNGs wie RANDU sind in Ordnung).
- Sie dürfen entweder keine nachgestellten Leerzeichen haben oder jede Zeile bis zur maximalen Position der Wellen in dieser Zoomstufe auffüllen (im obigen Beispiel neun Zeichen). Zoomstufe 1 kann aus mathematischen Gründen ein optionales zusätzliches nachgestelltes Leerzeichen enthalten.
Da die DNA klein ist, muss Ihr Code so kurz wie möglich sein.
Mehr Beispiele:
Zoomstufe 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
...
Zoomstufe 2:
A
T---a
c
g---C
G
A---t
c
a---T
...
Zoomstufe 1 (beachten Sie das führende Leerzeichen):
G
a
C
t
...
Antworten:
Ruby, Rev. B
171161 BytesDas Fixieren der Ausgabe für z = 1 kostet 10 Bytes. Es ist ein Sonderfall: Die Helix ist wirklich 3 Zeichen breit, wenn Sie sie bei 90 Grad betrachten, aber wenn wir sie bei 0 Grad betrachten, sieht sie nur 1 Zeichen breit aus.Null führende Leerzeichen auf z = 1 werden nicht mehr benötigtEinige Einsparungen durch Eliminieren von Klammern und durch Multiplizieren von y.abs mit 2 vor dem Abschneiden bei der Berechnung der Anzahl der benötigten Zeichen.
Schließlich habe ich das
include Math
(fürsin
und erforderlichePI
) vermieden, indem ich eine komplexe Zahlenarithmetik mit Potenzen der Zahl verwendet habei
. Der Imaginärteil der komplexen Zahl ist äquivalent zu sin x, außer dass er sich mit Periode 4 anstelle von Periode 2 * PI wiederholt. Das Speichern für diese Änderung betrug entweder 1 oder 0 Byte.Ruby, Rev A 165 Bytes
Das ist viel länger als erwartet. Es gibt einige mögliche Golfgelegenheiten, die erforscht werden müssen.
Kommentiert im Testprogramm
quelle
I=gets.to_i
sollte das seinI=gets.to_f
.C
294289285283281270265237218 BytesOder die längere Version, die Eingaben von main analysiert:
Es ist eine ziemlich blöde Gesamtimplementierung mit ein paar printf-Tricks. Es hat einige fehlende Includes, verwendet K & R-Syntax für die Funktion und stützt sich auf die GCC-Bereichsinitialisierer, daher ist dies nicht sehr Standard. Auch die Funktionsversion verwendet immer noch Globals, so dass sie nur einmal aufgerufen werden kann!
Die Funktionsversion akzeptiert 2 Parameter; Warten Sie (in Sekunden) und zoomen Sie. Hier ist ein Anrufer dafür:
Rennen wie:
Nervenzusammenbruch:
quelle
strtod
und erspartatof
.C
569402361 BytesIch habe das ziemlich schnell durchgearbeitet und bin mir sicher, dass ich noch einige andere Dinge tun kann, um meine Punktzahl zu senken, aber ich bin einfach froh, dass ich dieses Programm beim ersten Versuch richtig kompilieren und ausführen konnte.
De-Golf-Version:
UPDATE: Ich habe die Schleife so angepasst, dass alles in einer print-Anweisung gedruckt wird, und habe die Tatsache verwendet, dass Variablen standardmäßig als int definiert sind, um einige Bytes zu sparen. UPDATE2: Einige Var-Umbenennungen und einige Logik-Kürzungen, um ein paar Bytes mehr zu sparen.
quelle
JavaScript (ES6)
241244227222231 ByteDas sah interessant aus - ich liebe ASCII-Kunst!
Gerade erst angefangen, noch dabei, Golf zu spielen ...
--- EDIT: stellt sich heraus, dass ich es nicht in eval () schreiben kann - ansonsten kann es nicht auf die Vars I und Z zugreifen (fügt also 9 Bytes hinzu)
- 6 Bytes dank user81655
gespart - 5 Bytes dank Dave gespart
Erläuterung
quelle
c^=!e
stattdessen weitere 4 Bytes speichernc+=a==b
(Sie können das%2
Häkchen später entfernen ). Könnte-m+2
auch sein2-m
!c=c^(e==0)
; Es wendet ein XOR auf die gleiche Weise an, wie Sie es zuvor hinzugefügt hatten. Wenn Sie mit XOR nicht vertraut sind, handelt es sich um eine bitweise Operation: EXKLUSIV-ODER (Wikipedia kann dies richtig erklären)