Ваша задача - принять в качестве входных данных две последовательности гена и последовательность «точек пересечения» и вернуть последовательность гена, полученную в результате указанных пересечений.
Я имею в виду, что у вас есть последовательности [A, A, A, A, A, A, A]
и [Z, Z, Z, Z, Z, Z, Z]
, и пересекайте точки 2
и 5
. Результирующая последовательность будет [A, A, Z, Z, Z, A, A]
, потому что:
Крест здесь: ВВ Индексы: 0 1 2 3 4 5 6 Гены 1: ААААААА Гены 2: ZZZZZZZ Результат: AAZZZAA ^ ^
Обратите внимание, что, хотя я здесь и использую буквы для ясности, в реальной задаче используются числа для генов
Результатом является первая последовательность до точки пересечения, затем результат берется из второй последовательности, пока не встретится другая точка пересечения, а затем результат берется из первой последовательности до точки пересечения ...
Входные данные:
Ввод может быть в любой разумной форме. Две последовательности могут быть парой, с точками в качестве второго аргумента, все три могут быть отдельными аргументами, одним триплетом
(genes 1, genes 2, cross-points)
, картой с именованными ключами ...Точки пересечения всегда будут в порядке и всегда будут в границах. Повторных точек не будет, но список точек пересечения может быть пустым.
Генные последовательности всегда будут одинаковой длины и будут непустыми.
Индексы могут быть 0 или 1 на основе.
Гены всегда будут числами в диапазоне 0-255.
Неважно, какой аргумент "гены 1" или "гены 2". В случае отсутствия точек пересечения, результатом может быть либо полностью «гены 1», либо «гены 2».
Выход
Вывод может быть любой разумной формой, которая не является неоднозначной. Это может быть массив / список чисел, массив строковых чисел, строка чисел с разделителями (некоторые нечисловые символы должны разделять числа) ...
Его можно вернуть или распечатать на стандартный вывод.
Записи могут быть полными программами или функциями.
Тестовые случаи (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]
Это Код Гольф.
источник
Ответы:
Желе ,
1210 байтПопробуйте онлайн!
Аргумент 1: seq1, seq2
Аргумент 2: точки пересечения (с 0 индексами)
источник
;⁹ZL‘¤Ṭ+\ịŒDḢ
бы потребуется :(Haskell,
58535145 байтДве генные последовательности взяты в виде пары списков, а точки пересечения - в качестве второго аргумента.
Попробуйте онлайн!
источник
JavaScript (ES6),
4745 байтСохранено 2 байта благодаря @ETHproductions
Принимает входные данные в виде триплета [a, b, c], где a и b - последовательности генов, а c - список 0-индексированных точек пересечения.
Попробуйте онлайн!
комментарии
источник
x[(j+=x[2][j]==i)%2][i++]
чтобы сохранить пару байтов.APL (Dyalog 16.0) , 26 байтов
Попробуйте онлайн!
Ввод a , c , затем b . с будет
1
индексироваться.Как?
a←⎕
- получить .0⍴⍨≢
создать массив0
s в его длине.1@⎕⊢
- возьмите c и измените0
s на1
s по индексам.d←
- назначить на d .⊂≠\d
- разверните d с помощью xor, чтобы создать последовательность выбора (0
для a ,1
для b ), и заключите.(~,⊢)
- взять d и его обратное.a⎕×
- и умножить соответственно с введенными b и a .+/
- суммировать каждую пару элементов, получая a s на0
s и b s на1
s.источник
⊢0⍴⍨≢
->≠⍨
( совет ),
до 1-элементных векторов на входеPython 2 , 43 байта
Попробуйте онлайн!
Выводы путем изменения аргумента
a
. Вместо этого как программа:50 байтов
Попробуйте онлайн!
источник
Perl 5
-a
,4540 байтВведите входные данные в порядке «контроль», «вторая последовательность», «первая последовательность» в виде отдельных строк на STDIN
Попробуйте онлайн!
источник
J , 24 байта
Попробуйте онлайн!
Я не считаю
f=:
символы, потому что он работает так же хорошо, как анонимная функция (как показано в примере TIO)Примечание: это не работает для пустого списка точек пересечения!
Явный
x
аргумент, левый аргумент - список точек пересечения,y
- это правый аргумент, таблица из двух рядов последовательностей.Объяснение:
4 :' ... '
- диадический глагол(...)}y
- Каждый атом операнда (...) выбирает атом из соответствующих позиций элементов у#{.y
- берет первую последовательность и находит ее длинуI.
создает список нулей с длиной аргумента1 x}
изменяет элементы аргумента rigth (список нулей) на 1 по индексам, обозначенным какx
(список cors по точкам)+/\
промежуточные суммы списка2|
по модулю 2Собранный:
источник
R ,
8479 байтПопробуйте онлайн!
Принимает входные данные в виде матрицы из 2 столбцов и a
vector
.источник
Python 3,
6160 байтПопробуйте онлайн!
-1 байт от Джонатана Фреха
Объяснение:
источник
a[d:c[0]]+f(b,a,c[1:],c[0])
это никогда не будет ложным.Желе , 13 байт
Двоичная ссылка, принимающая точки пересечения (с 1 индексом) слева и список двух последовательностей справа, который возвращает результирующий список.
Попробуйте онлайн!
Как?
источник
Ḃ
: Бесполезная вещь для индексации в двухэлементном списке.ż/
: Как бесполезно из-за осложнений, он все равно жестоко расправляется с большим грузовиком!Древесный уголь , 19 байт
Попробуйте онлайн! Ссылка на подробную версию кода. Принимает входные данные в виде пары последовательностей генных строк и 0-индексированного списка точек пересечения. Объяснение:
Кроме того,
⭆
может быть заменен дляE
печати результата в виде строки. Попробуйте онлайн!источник
SWI-Пролог, 78 байт
Использование: вызовите «Genes1 / Genes2 / CrossoverPoints / X», где «Genes1», «Genes2», «CrossoverPoints» являются заключенными в скобки списками, разделенными запятыми.
источник
C (лязг) , 79 байтов
Попробуйте онлайн!
Входные данные:
g[0]
последовательность гена 1, последовательностьg[1]
гена 2, точкиc
пересечения.l
это длинаg[0]
иg[1]
m
длинаc
всех входных массивов являются массивами целых чисел с индексом на основе 0.
Выходы:
выход хранится в
g[0]
macro a () в нижнем колонтитуле выполняет симпатичную печать тестовых случаев и результата
источник