Twoim zadaniem jest zaakceptowanie jako danych wejściowych dwóch sekwencji genów i sekwencji „punktów podziału” i zwrócenie sekwencji genów wynikającej ze wskazanych skrzyżowań.
Co mam na myśli to, że masz sekwencje [A, A, A, A, A, A, A]
i [Z, Z, Z, Z, Z, Z, Z]
, i przejechać przez punkty 2
i 5
. Wynikowa sekwencja byłaby [A, A, Z, Z, Z, A, A]
, ponieważ:
Krzyż tutaj: VV Wskaźniki: 0 1 2 3 4 5 6 Geny 1: AAAAAAA Geny 2: ZZZZZZZ Wynik: AAZZZAA ^ ^
Zwróć uwagę, że chociaż używam tutaj liter dla jasności, faktyczne wyzwanie wykorzystuje liczby dla genów.
Wynik jest pierwszą sekwencją do momentu napotkania punktu podziału, następnie wynik pobiera od drugiej sekwencji do napotkania innego punktu podziału, a następnie wynik trwa od pierwszej sekwencji do momentu znalezienia punktu podziału ...
Wejście:
Dane wejściowe mogą mieć dowolną rozsądną formę. Dwie sekwencje mogą być parą, z punktami jako drugim argumentem, wszystkie trzy mogą być osobnymi argumentami, pojedynczą tripletą
(genes 1, genes 2, cross-points)
, mapą z nazwanymi kluczami ...Punkty przecięcia zawsze będą w porządku i zawsze będą zaokrąglane. Nie będzie duplikatów punktów, ale lista punktów podziału może być pusta.
Sekwencje genów będą zawsze tej samej długości i nie będą puste.
Wskaźniki mogą być oparte na 0 lub 1.
Geny zawsze będą liczbami z zakresu 0–255.
Nie ma znaczenia, który argument to „geny 1” lub „geny 2”. W przypadku braku punktów podziału wynik może być albo całkowicie „genami 1”, albo „genami 2”.
Wynik
Wynik może być dowolną rozsądną formą, która nie jest dwuznaczna. Może to być tablica / lista liczb, tablica liczb ciągów, rozdzielany ciąg liczb (niektóre znaki nienumeryczne muszą oddzielać liczby) ...
Można go zwrócić lub wydrukować na standardowe wyjście.
Wpisy mogą mieć pełne programy lub funkcje.
Przypadki testowe (genes 1, genes 2, cross points) => result
:
[0], [1], [0] => [1]
[0, 1], [9, 8], [1] => [0, 8]
[0, 2, 4, 6, 8, 0], [1, 3, 5, 7, 9, 1], [1, 3, 5] => [0, 3, 5, 6, 8, 1]
[1, 2, 3, 4], [5, 6, 7, 8], [] => [1, 2, 3, 4]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 2, 3, 6, 8] => [1, 1, 0, 1, 1, 1, 0, 0, 1, 1]
To jest Code Golf.
źródło
Odpowiedzi:
Galaretka ,
1210 bajtówWypróbuj online!
Argument 1: seq1, seq2
Argument 2: punkty przecięcia (indeksowane 0)
źródło
;⁹ZL‘¤Ṭ+\ịŒDḢ
byłoby wymagane :(Haskell,
58535145 bajtówDwie sekwencje genów są traktowane jako para list, a punkty krzyżowe jako drugi argument.
Wypróbuj online!
źródło
JavaScript (ES6),
4745 bajtówZaoszczędź 2 bajty dzięki @ETHproductions
Staje wejścia jako tryplet [a, b, c] , gdzie i b są sekwencje genowe i C lista 0 indeksowanych poprzecznych punktów.
Wypróbuj online!
Skomentował
źródło
x[(j+=x[2][j]==i)%2][i++]
aby zaoszczędzić kilka bajtów.APL (Dyalog 16.0) , 26 bajtów
Wypróbuj online!
Dane wejściowe to a , c , a następnie b . c jest
1
indeksowane.W jaki sposób?
a←⎕
- dostać .0⍴⍨≢
- utwórz tablicę0
s na jej długości.1@⎕⊢
- weź c i zmień0
s na1
s na indeksach.d←
- przypisać do d .⊂≠\d
- rozwiń d za pomocą xor, aby utworzyć sekwencję wyboru (0
dla a ,1
dla b ), i dołącz.(~,⊢)
- weź d i jego odwrotność.a⎕×
- i pomnożyć odpowiednio przez wprowadzone b oraz a .+/
- zsumuj każdą parę elementów, uzyskując wartości a s na0
s i b s na1
s.źródło
⊢0⍴⍨≢
->≠⍨
( wskazówka ),
wejściowych wektorów 1-elementowych na wejściuPython 2 , 43 bajty
Wypróbuj online!
Wyjście poprzez modyfikację argumentu
a
. Zamiast tego jako program:50 bajtów
Wypróbuj online!
źródło
Perl 5
-a
,4540 bajtówPodaj dane wejściowe w kolejności „sterowanie”, „druga sekwencja”, „pierwsza sekwencja” jako osobne linie na STDIN
Wypróbuj online!
źródło
J , 24 bajty
Wypróbuj online!
Nie liczę
f=:
znaków, ponieważ działa równie dobrze jak funkcja anonimowa (jak pokazano w próbce TIO)Uwaga: Nie działa w przypadku pustej listy punktów podziału!
Wyraźny oneliner,
x
to lewy argument - lista punktów podziału,y
to prawy argument, dwuwierszowa tabela sekwencji.Wyjaśnienie:
4 :' ... '
- dynastyczny czasownik(...)}y
- Każdy atom operandu (...) wybiera atom z odpowiednich pozycji elementów y#{.y
- bierze pierwszą sekwencję i znajduje jej długośćI.
tworzy listę zer o długości argumentu1 x}
zmienia pozycje argumentu rigth (lista zer) na 1 przy indeksach wskazanych przezx
(lista cors nad punktami)+/\
prowadzenie sum listy2|
moduł 2Zmontowane:
źródło
R ,
8479 bajtówWypróbuj online!
Pobiera dane wejściowe jako macierz 2 kolumn i a
vector
.źródło
Python 3,
6160 bajtówWypróbuj online!
-1 bajt od Jonathana Frecha
Wyjaśnienie:
źródło
a[d:c[0]]+f(b,a,c[1:],c[0])
to nigdy nie będzie fałszywe.Galaretka , 13 bajtów
Dyadyczne łącze akceptujące (1-indeksowane) punkty podziału po lewej stronie oraz listę dwóch sekwencji po prawej stronie, która zwraca wynikową listę.
Wypróbuj online!
W jaki sposób?
źródło
Ḃ
: Co za bezużyteczna rzecz do indeksowania do listy 2-elementowej.ż/
: Co za komplikacja, i tak okrutnie spłaszczona przez wielką ciężarówkę!Węgiel drzewny , 19 bajtów
Wypróbuj online!Link jest do pełnej wersji kodu. Pobiera dane wejściowe jako parę sekwencji genów struny i indeksowaną przez 0 listę punktów przecięcia. Wyjaśnienie:
Alternatywnie
⭆
można zastąpićE
wydrukowaniem wyniku w postaci ciągu. Wypróbuj online!źródło
SWI-Prolog, 78 bajtów
Sposób użycia: Wywołaj „Genes1 / Genes2 / CrossoverPoints / X”, gdzie „Genes1”, „Genes2”, „CrossoverPoints” to listy w nawiasach kwadratowych, oddzielone przecinkami.
źródło
C (brzęk) , 79 bajtów
Wypróbuj online!
Dane wejściowe:
g[0]
jest sekwencją genową 1, sekwencjąg[1]
genową 2,c
stanowi punkty podziału krzyżowego.l
jest długościąg[0]
ig[1]
m
jest długościąc
Wszystkie dane wejściowe tablicy są tablicami liczb całkowitych o indeksie 0.
Wyjścia: Dane
wyjściowe są przechowywane w
g[0]
makro a () w stopce robi ładne drukowanie przypadków testowych i wyniku
źródło