Twój kod na zawsze wygeneruje bardzo prostą reprezentację DNA w stylu ASCII. Przyjmie dwie liczby jako dane wejściowe w dowolnym formacie: jako listę, jako argumenty funkcji, na standardowe wejście itp.
- Przedział zmiennoprzecinkowy
I
w sekundach od 0,0 do 1,0 (włącznie) - Poziom powiększenia
Z
jako liczba całkowita od 1 do 64 (włącznie)
Kod wydrukuje co I
sekundę jeden wiersz na standardowe wyjście lub jego ekwiwalent , tworząc nieskończone wyjście, które wygląda mniej więcej tak (dla poziomu powiększenia 4):
A
T-----a
G-------c
G-----c
g
t-----A
a-------T
c-----G
T
A-----t
C-------g
...
W szczególności, reprezentacja naszym DNA jest para sinusoidalnych połączonych łącznikami, składający się ze znaków a
, c
, g
i t
, z drugiej strony z postaci A
, C
, G
i T
. Jeśli x
jest to indeksowany przez 0 numer linii, którą obecnie drukujemy, pozycja znaku w fali małych liter jest określana przez 0 (sin(πx / Z) + 1) * Z
, a w fali wielkich liter przez (-sin(πx / Z) + 1) * Z
, obie zaokrąglone (nie zmienione) do najbliższej liczba całkowita. Dalsze szczegóły:
- W przypadku, gdy dwie fale zachodzą na siebie, musisz na przemian, która fala znajduje się z przodu, zaczynając od fali wielkiej litery. (Zaczynając od małej litery, dałoby nam podwójną helisę, która nie istnieje !)
- Ignorując wielkość liter, A zawsze łączy się z T i C zawsze łączy się z G, jak w prawdziwym DNA. Same pary powinny być wybierane losowo z równomiernym rozkładem na cztery możliwości. Nie ma znaczenia, czy wybór par jest taki sam, czy różny przy kolejnych uruchomieniach kodu. Jakość statystyczna twoich losowych wyborów nie stanowi problemu, o ile dane wyjściowe nie mają oczywistego wzorca i okresu co najmniej w miliardach (wadliwe PRNG, takie jak RANDU, są w porządku).
- Musisz albo nie mieć spacji końcowych, albo wstawiać każdą linię do maksymalnego położenia fal na tym poziomie powiększenia (w powyższym przykładzie dziewięć znaków). Poziom powiększenia 1 może mieć jedno opcjonalne dodatkowe miejsce na końcu z powodów matematycznych.
Ponieważ DNA jest małe, kod będzie musiał być jak najkrótszy.
Więcej przykładów:
Poziom powiększenia 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
...
Poziom powiększenia 2:
A
T---a
c
g---C
G
A---t
c
a---T
...
Poziom powiększenia 1 (zwróć uwagę na wiodące miejsce):
G
a
C
t
...
Odpowiedzi:
Ruby, Rev B
171161 bajtówNaprawienie wyjścia dla z = 1 kosztuje 10 bajtów. Jest to szczególny przypadek: helisa ma naprawdę 3 znaki szerokości, jeśli spojrzysz na nią pod kątem 90 stopni, ale gdy spojrzymy na nią pod kątem 0 stopni, wygląda ona tylko na 1 znak szerokości.zero wiodących spacji na z = 1 nie jest już wymaganeNiektóre oszczędności poprzez eliminację nawiasów i mnożenie y.ab przez 2 przed obcięciem przy obliczaniu potrzebnej liczby znaków.
Wreszcie uniknąłem
include Math
(wymaganegosin
iPI
) używania arytmetyki liczb zespolonych z potęgami liczbyi
. Urojona część liczby zespolonej jest równoważna sin x, z tym wyjątkiem, że powtarza się z okresem 4 zamiast okresu 2 * PI. Zapisywanie tej zmiany wynosiło 1 lub 0 bajtów.Ruby, Rev A 165 bajtów
Jest to znacznie dłużej niż oczekiwano. Istnieje kilka potencjalnych możliwości gry w golfa.
Skomentowane w programie testowym
źródło
I=gets.to_i
powinno byćI=gets.to_f
.C
294289285283281270265237218 bajtówLub dłuższa wersja, która analizuje dane wejściowe z głównego:
Jest to dość głupia ogólna implementacja, z pewnymi sztuczkami printf. Brakuje w niej niektórych elementów, używa dla tej funkcji składni K&R i polega na inicjatorach zakresu GCC, więc nie jest to zbyt standardowe. Również wersja funkcji nadal używa globałów, więc można ją wywołać tylko raz!
Wersja funkcji przyjmuje 2 parametry; poczekaj (w sekundach) i powiększ. Oto osoba dzwoniąca:
Uruchom jako:
Awaria:
źródło
strtod
iatof
.C,
569402361 bajtówSzybko to poprawiłem, więc jestem pewien, że mogę zrobić kilka innych rzeczy, aby obniżyć swój wynik, ale cieszę się, że udało mi się skompilować i uruchomić ten program przy pierwszej próbie.
Wersja do gry w golfa:
AKTUALIZACJA: Dostosowałem pętlę, aby wydrukować wszystko w jednej instrukcji print i wykorzystałem fakt, że zmienne są domyślnie zdefiniowane jako int, aby golić niektóre bajty. AKTUALIZACJA 2: Zmiana nazwy var i skrócenie logiki w celu golenia jeszcze kilku bajtów.
źródło
JavaScript (ES6)
241244227222231 bajtówWyglądało to interesująco - uwielbiam sztukę ASCII!
Właśnie zaczęłam grać w golfa ...
--- EDYCJA: okazuje się, że właściwie nie mogę umieścić go w eval () - w przeciwnym razie nie może uzyskać dostępu do zmiennych I i Z (więc dodaje 9 bajtów)
- zapisane 6 bajtów dzięki użytkownikowi 81655
- zapisane 5 bajtów dzięki Dave'owi
Wyjaśnienie
źródło
c^=!e
zamiastc+=a==b
(pozwala to usunąć%2
czek później). Również-m+2
może być2-m
!c=c^(e==0)
; stosuje XOR w taki sam sposób, jak wcześniej dodałeś. Jeśli nie znasz XOR, jest to operacja bitowa: eXclusive OR (wikipedia może to poprawnie wyjaśnić)