вступление
У нас были гистограммы и подсчеты , но мы не перечислили их все.
Ежегодно ООО «Дьялог» проводит студенческий конкурс. Задача состоит в том, чтобы написать хороший код APL. Это не зависящее от языка кодовое издание шестой проблемы этого года.
У меня есть явное разрешение опубликовать этот вызов здесь от первоначального автора конкурса. Не стесняйтесь проверить, перейдя по предоставленной ссылке и связавшись с автором.
проблема
Термин k-mer обычно относится ко всем возможным подстрокам длины k , которые содержатся в строке. В вычислительной геномике k-меры относятся ко всем возможным подпоследовательностям (длиной k ) из чтения, полученного с помощью секвенирования ДНК. Напишите функцию / программу, которая принимает строку и k (длину подстроки) и возвращает / выводит вектор k-мер исходной строки.
Примеры
[4,"ATCGAAGGTCGT"]
→ ["ATCG","TCGA","CGAA","GAAG","AAGG","AGGT","GGTC","GTCG","TCGT"]
k > длина строки? Ничего не вернуть / пустой результат:
[4,"AC"]
→ []
или ""
или[""]
['A', 'T', 'C', 'G']
вместо"ATCG"
?Ответы:
Желе , 1 байт
У желе есть однобайтовый диадический атом для этой самой операции
Попробуйте онлайн! (нижний колонтитул разделяет результирующий список с помощью новых строк, чтобы избежать печатного представления.)
источник
Октава, 28 байт
Попробуйте онлайн!
Для k> длина строки работает в окнах Octave 4.2.1, но в tio (Octave 4.0.3) не работает.
Создает числовые индексы последовательных элементов и индексирует строку по ним.
источник
05AB1E , 2 байта
Код:
Объяснение:
Использует кодировку 05AB1E .
Попробуйте онлайн!
источник
C (GCC на POSIX),
676663 байта-3 байта благодаря @LeakyNun!
Попробуйте онлайн!
источник
j=0
.j+i<=strlen(s)
на простоs[j+i]
Брахилог , 3 байта
Попробуйте онлайн!
Технические характеристики:
["ATCGAAGGTCGT",4]
Z
Z = ["ATCG","TCGA","CGAA","GAAG","AAGG","AGGT","GGTC","GTCG","TCGT"]
Как это устроено
источник
Python 3 ,
47 4542 байта-3 байта благодаря ovs (используйте распаковку Python 3 для повторного использования
a[n-1:]
в конце)Рекурсивная функция, принимающая строку,
a
длину срезаn
и возвращающая список срезов или пустую строку.a[n-1:]
берет фрагмент текущей строки из n-1- го (0-индексированного) элемента и далее, чтобы проверить, достаточно ли осталось элементов (пустая строка - ложная в Python) - это короче, чем эквивалентlen(a)>=n
.Если имеется достаточное количество элементов списка конструируют,
[...]
с первымиn
элементами строки,a[:n]
и распакованного результате повторного вызова функции,*f(...)
с версией из очереди на вход тока (без первого элемента),a[1:]
.Если элементов недостаточно, хвост рекурсии достигается, когда
a[n-1:]
возвращается (в этом случае пустая строка).Попробуйте онлайн!
45 для Python 2 или 3 с:
источник
f=lambda a,n:a[n-1:]and[a[:n],*f(a[1:],n)]
42 байт (Python 3) ТиоJ , 2 байта
Это не полная программа, а функция с оператором.
Назовите это так:
Попробуйте онлайн!
Как это устроено
Оператор (называемый «конъюнкция»)
\
(называемый « инфикс ») используется следующим образом:Функция (называемая «глаголом»)
u
в этом случае является функцией,,
которая является простой функцией « добавления »:источник
Mathematica, 21 байт
Анонимная функция. Принимает строку и число (в этом порядке) в качестве входных данных и возвращает список строк в качестве выходных данных.
источник
Р,
6561 байт-2 байта благодаря MickyT
-2 байта путем изменения индексации
возвращает анонимную функцию.
substring
циклически перебирает индексы (в отличие отsubstr
которых нет), и если начальный индекс меньше 1, по умолчанию1
вместо этого, поэтому он проверяет и возвращает пустую строку.x:n-n+1
эквивалентно1:(x-n+1)
с:
имеет приоритет над суммами / разностямиПопробуйте онлайн!
источник
function(s,n,x=nchar(s))
if(n>x,'',substring(s,1:(x-n+1),n:x))
Pyth , 2 байта
Это не полная программа, а встроенная функция.
Назовите это так:
Попробуйте онлайн!
Полная программа:
Попробуйте онлайн!
(
.*
Сплат.)источник
.:F
это короче байта для полной программы.Медуза , 7 байт
Попробуйте онлайн!
Как это устроено
В линейном:,
p(\(I,i))
гдеp
печать и\
получает необходимые подстроки.I
является необработанным первым вводом, в то времяi
как оценивается вторым вводом.В Jellyfish каждая функция и оператор получают два аргумента: один справа и один снизу. Здесь функция
p
получает аргумент из выходных данных_
, который необходим, если мы хотим использовать оператор\
для получения подстрок.источник
Python 2 , 54 байта
Попробуйте онлайн!
источник
Java (OpenJDK 8) , 92 байта
Попробуйте онлайн!
источник
String[]f(String s,int n){int i=0,t=s.length()-n+1;String[]r=new String[t];for(;i<t;r[i]=s.substring(i,n+i++));return r;}
Clojure, 19 байт
Ну это удобно
Примеры:
источник
CJam , 4 байта
Анонимный блок, который ожидает аргументы в стеке и оставляет результат в стеке после.
Попробуйте онлайн!
ew
это встроенный, который делает именно то, что требуется.источник
Retina ,
4138 байтПопробуйте онлайн!
Берет строку и рассчитывает на отдельные строки. Первые две строки используются для преобразования числа из десятичного в унарное, поэтому, если унарный ввод допустим, то количество байтов будет уменьшено до
3431. Редактирование: 3 байта сохранены благодаря @FryAmTheEggman. Или, если вы предпочитаете, 48-байтовую версию, которая обрабатывает символы новой строки в строке, хотя это приводит к сбивающему с толку выводу:источник
(?!)
на¶
.Октава с пакетом изображений, 29 байт
Попробуйте онлайн!
объяснение
Функция
im2col(m,b)
берет матрицуm
, извлекаетb
из нее блоки размером и размещает их в виде столбцов. По умолчанию блоки являются скользящими (в отличие от отдельных). Здесь матрицаm
представляет собой вектор-строку кодов ASCII входной строкиs
(это делается как+s
, что короче, чем стандартdouble(s)
), а размерb
предназначен[1 n]
для получения горизонтально скользящих блоковn
элементов.Результат транспонируется (используя сложное-сопряженное транспонирование
'
, которое короче, чем транспонирование.'
), чтобы превратить столбцы в строки, и затем он преобразуется обратно в символ ([... '']
который короче, чем стандартchar(...)
).источник
ОК, 2 байта
ОК имеет оператор скользящего окна !
источник
Python 3 , 49 байт
Попробуйте онлайн!
Нерекурсивное решение, хотя и не короче.
Совместим с Python 2.
источник
f=
, сохранив два байта, потому что вы не используетеf
где-либо еще. По умолчанию функции, которые только что объявлены и не используются, могут быть оставлены без имени.PHP, 75 байт
Онлайн версия
80 байт без двойных значений
источник
Haskell, 39 байт
Пример использования:
4 # "ABCDEF"
->["ABCD","BCDE","CDEF"]
. Попробуйте онлайн!Простая рекурсия, которая сохраняет первые
n
символы входной строки, продолжается с хвоста строки, пока ее длина не меньше чемn
.источник
Microsoft Sql Server, 199 байт
Проверь это.
источник
PowerShell, 70 байт
Попробуйте онлайн!
источник
С накоплением , 7 байтов
Попробуйте онлайн!
Довольно стандартный. Без этого встроенного, это становится 20 байтами:
Который:
источник
MATL , 3 байта
Попробуйте онлайн!
объяснение
источник
C # 89 байт
Попробуйте онлайн!
Лучший метод, который я мог найти в C #, в основном такой же, как Java
источник
Рубин,
4846 байтНикаких особых трюков, просто лямбда-определение, определяющая функцию, которая извлекает необходимую подстроку из каждой действительной начальной точки.
Сохранено два байта, поскольку нет необходимости хранить лямбду.
источник
V , 16 байтов
Боюсь, не очень хорошо в гольф, борясь с "удалить строку, если k> len (str)". Вход находится в файле, k является аргументом. Гольф перед объяснением
Попробуйте онлайн!
источник
Стандарт ML (mosml),
1096561 байтПринимает число и список символов (довольно распространенная альтернатива строкам в мире SML). (Действительно работает во всех списках, конечно.)
Использование:
Changelog:
источник
if length(x)<n then
наif n>length(x)then
. Однако, поскольку SML вполне может обрабатывать строки, я не уверен, что разрешено требовать, чтобыexplode
его уже применяли к входной строке.then nil else
может быть сокращено доthen[]else
.fun f$n=if n>length$then[]else List.take($,n)::f(tl$)n
.JavaScript (Firefox 30-57), 51 байт
64 байта в ES6:
источник