Wprowadzenie
Mieliśmy histogramy i liczymy , ale nie wymieniliśmy ich wszystkich.
Każdego roku Dyalog Ltd. organizuje konkurs studencki. Wyzwanie polega na napisaniu dobrego kodu APL. To jest agnostyczna edycja kodu golfowego szóstego problemu tego roku.
Mam wyraźną zgodę na opublikowanie tutaj tego wyzwania od pierwotnego autora konkursu. Możesz to zweryfikować, klikając podany link i kontaktując się z autorem.
Problem
Termin k-mer zazwyczaj odnosi się do wszystkich możliwych podciągów o długości k zawartych w ciągu. W genomice obliczeniowej k-mery odnoszą się do wszystkich możliwych podsekwencji (o długości k ) z odczytu uzyskanego przez sekwencjonowanie DNA. Napisz funkcję / program, który pobiera ciąg ik (długość podłańcucha) i zwraca / wyprowadza wektor k-merów oryginalnego ciągu.
Przykłady
[4,"ATCGAAGGTCGT"]
→ ["ATCG","TCGA","CGAA","GAAG","AAGG","AGGT","GGTC","GTCG","TCGT"]
k > długość łańcucha? Zwróć nic / pusty wynik:
[4,"AC"]
→ []
lub ""
lub[""]
['A', 'T', 'C', 'G']
Zamiast"ATCG"
?Odpowiedzi:
Galaretka , 1 bajt
Galaretka ma jednobajtowy atom dyadowy dla tej samej operacji
Wypróbuj online! (stopka dzieli wynikową listę na nowe linie, aby uniknąć wydrukowania zadumanej reprezentacji).
źródło
Oktawa, 28 bajtów
Wypróbuj online!
W przypadku k> długość łańcucha działa w oknach Octave 4.2.1, ale w tio (Octave 4.0.3) nie działa.
Tworzy indeksy numeryczne kolejnych elementów i indeksuje ciąg według niego.
źródło
05AB1E , 2 bajty
Kod:
Wyjaśnienie:
Wykorzystuje kodowanie 05AB1E .
Wypróbuj online!
źródło
C (GCC na POSIX),
676663 bajtów-3 bajty dzięki @LeakyNun!
Wypróbuj online!
źródło
j=0
.j+i<=strlen(s)
tylkos[j+i]
Brachylog , 3 bajty
Wypróbuj online!
Okular:
["ATCGAAGGTCGT",4]
Z
Z = ["ATCG","TCGA","CGAA","GAAG","AAGG","AGGT","GGTC","GTCG","TCGT"]
Jak to działa
źródło
Python 3 ,
47 4542 bajtów-3 bajty dzięki ovs (użyj odpakowania Python 3, aby ponownie użyć
a[n-1:]
na końcu).Funkcja rekurencyjna pobierająca ciąg
a
oraz długość plasterkan
i zwracająca listę plasterków lub pusty ciąg.a[n-1:]
pobiera wycinek bieżącego ciągu od n- tego 1- tego (0-indeksowanego) elementu, aby sprawdzić, czy pozostało wystarczającej liczby elementów (pusty ciąg jest falsey w Pythonie) - jest on krótszy niż odpowiedniklen(a)>=n
.Jeśli istnieje wystarczająca ilość elementów listy jest zbudowane,
[...]
z pierwszychn
elementów łańcucha,a[:n]
i niespakowanego wyniku ponownie wywołaniu funkcji*f(...)
, z rozkolejkowywana wersją aktualnego wejścia (bez pierwszego elementu)a[1:]
.Jeśli nie ma wystarczającej liczby elementów, ogon rekurencji zostaje osiągnięty, gdy
a[n-1:]
jest zwracany (w tym przypadku pusty ciąg znaków).Wypróbuj online!
45 dla Python 2 lub 3 z:
źródło
f=lambda a,n:a[n-1:]and[a[:n],*f(a[1:],n)]
dla 42 bajtów (Python 3) TIOjot , 2 bajty
To nie jest kompletny program, ale funkcja z operatorem.
Nazwij to tak:
Wypróbuj online!
Jak to działa
Operator (zwany „koniunkcją”)
\
(o nazwie „ infix ”) jest używany jako taki:W
u
tym przypadku funkcja (zwana „czasownikiem”) jest funkcją,,
która jest prostą funkcją „ dołącz ”:źródło
Mathematica, 21 bajtów
Funkcja anonimowa. Bierze ciąg i liczbę (w tej kolejności) jako dane wejściowe i zwraca listę ciągów jako dane wyjściowe.
źródło
R,
6561 bajtów-2 bajty dzięki MickyT
-2 bajty poprzez zmianę indeksowania
zwraca anonimową funkcję.
substring
przełącza indeksy (w przeciwieństwie dosubstr
których nie ma), a jeśli indeks początkowy jest mniejszy niż 1,1
zamiast tego przyjmuje wartość domyślną , więc sprawdza i zwraca pusty ciąg.x:n-n+1
jest równoważne,1:(x-n+1)
ponieważ:
ma pierwszeństwo przed sumami / różnicamiWypróbuj online!
źródło
function(s,n,x=nchar(s))
jeśli(n>x,'',substring(s,1:(x-n+1),n:x))
Pyth , 2 bajty
To nie jest kompletny program, ale wbudowana funkcja.
Nazwij to tak:
Wypróbuj online!
Pełny program:
Wypróbuj online!
(To
.*
jest ikona).źródło
.:F
jest o bajt krótszy dla pełnego programu.Meduza , 7 bajtów
Wypróbuj online!
Jak to działa
W liniowym:
p(\(I,i))
gdziep
jest drukowany i\
pobiera wymagane podciągi.I
jest nieprzetworzonym pierwszym wejściem, podczas gdyi
jest oszacowanym drugim wejściem.W meduzach każda funkcja i operator otrzymują dwa argumenty, jeden z prawej strony, a drugi z dołu. Tutaj funkcja
p
pobiera argument z wyniku_
, który jest wymagany, jeśli mamy użyć operatora\
do uzyskania podłańcuchów.źródło
Python 2 , 54 bajty
Wypróbuj online!
źródło
Java (OpenJDK 8) , 92 bajty
Wypróbuj online!
źródło
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 bajtów
Cóż to jest przydatne:
Przykłady:
źródło
CJam , 4 bajty
Anonimowy blok, który oczekuje argumentów na stosie i pozostawia wynik na stosie po.
Wypróbuj online!
ew
jest wbudowany, który robi dokładnie to, co jest wymagane.źródło
Siatkówka ,
4138 bajtówWypróbuj online!
Bierze ciąg i liczy na osobne linie. Pierwsze dwa wiersze są używane do konwersji liczby z dziesiętnej na jednostkową, więc jeśli jednoargumentowe wejście jest dopuszczalne, wówczas liczba bajtów zostanie zmniejszona do
3431. Edycja: Zapisano 3 bajty dzięki @FryAmTheEggman. Lub, jeśli wolisz, 48-bajtowa wersja, która obsługuje znaki nowego wiersza w ciągu, chociaż powoduje to mylące dane wyjściowe:źródło
(?!)
na¶
.Oktawa z pakietem obrazów, 29 bajtów
Wypróbuj online!
Wyjaśnienie
Funkcja
im2col(m,b)
pobiera macierzm
, wyodrębnia z niej bloki wielkościb
i układa je jako kolumny. Domyślnie bloki przesuwają się (w przeciwieństwie do wyraźnych). Tutaj macierzm
jest wektorem wierszowym kodów ASCII ciągu wejściowegos
(jest to wykonywane jako+s
, który jest krótszy niż standardowydouble(s)
), a rozmiarb
ma na[1 n]
celu uzyskanie poziomo przesuwnych blokówn
elementów.Wynik jest transponowany (przy użyciu transpozycji złożonej sprzężonej
'
, która jest krótsza niż transpozycja.'
) w celu przekształcenia kolumn w wiersze, a następnie jest konwertowany z powrotem na znak char ([... '']
który jest krótszy niż standardowychar(...)
).źródło
ok, 2 bajty
Firma OK ma operatora przesuwnego okna !
źródło
Python 3 , 49 bajtów
Wypróbuj online!
Rozwiązanie nierekurencyjne, choć nie krótsze.
Kompatybilny z Python 2.
źródło
f=
, oszczędzając dwa bajty, ponieważ nie używaszf
nigdzie indziej. Domyślnie funkcje, które zostały właśnie zadeklarowane i nie są używane, można pozostawić bez nazwy.PHP, 75 bajtów
Wersja online
80 bajtów bez podwójnych wartości
źródło
Haskell, 39 bajtów
Przykład użycia:
4 # "ABCDEF"
->["ABCD","BCDE","CDEF"]
.Wypróbuj online!Prosta rekurencja, która utrzymuje pierwsze
n
znaki łańcucha wejściowego i kontynuuje ogon łańcucha, o ile jego długość jest nie mniejsza niżn
.źródło
Serwer Microsoft Sql, 199 bajtów
Sprawdź to.
źródło
PowerShell, 70 bajtów
Wypróbuj online!
źródło
Ułożone , 7 bajtów
Wypróbuj online!
Dość standardowy. Bez tego wbudowanego staje się 20 bajtów:
Który jest:
źródło
MATL , 3 bajty
Wypróbuj online!
Wyjaśnienie
źródło
C # 89 bajtów
Wypróbuj online!
Najlepsza metoda, jaką mogłem znaleźć w języku C #, jest w zasadzie taka sama jak Java
źródło
Rubinowy,
4846 bajtówŻadnych szczególnych sztuczek, po prostu stabby-lambda definiująca funkcję, która pobiera wymagane podciągi z każdego ważnego punktu początkowego.
Zaoszczędzono dwa bajty, ponieważ wydaje się, że nie ma potrzeby przechowywania lambda.
źródło
V , 16 bajtów
Obawiam się, że nie bardzo dobrze grałem w golfa, walcząc z „usuń ciąg, jeśli k> len (str)”. Dane wejściowe znajdują się w pliku, k jest argumentem. Gra w golfa przed wyjaśnieniem
Wypróbuj online!
źródło
Standardowy ML (mosml),
1096561 bajtówPobiera liczbę i listę znaków (dość powszechna alternatywa dla ciągów znaków w świecie SML). (Naprawdę działa oczywiście na wszystkich listach.)
Stosowanie:
Dziennik zmian:
źródło
if length(x)<n then
naif n>length(x)then
. Ponieważ jednak SML może obsługiwać ciągi znaków, nie jestem pewien, czy dozwolone jest, aby wymagaćexplode
już zastosowania do łańcucha wejściowego.then nil else
może być skrócony dothen[]else
.fun f$n=if n>length$then[]else List.take($,n)::f(tl$)n
.JavaScript (Firefox 30-57), 51 bajtów
64 bajty w ES6:
źródło