Intro
Wir hatten Histogramme und haben gezählt , aber nicht alle aufgelistet.
Jedes Jahr veranstaltet Dyalog Ltd. einen Studentenwettbewerb. Die Herausforderung besteht darin, guten APL-Code zu schreiben . Dies ist eine sprachunabhängige Code-Golf- Ausgabe des diesjährigen sechsten Problems.
Ich habe die ausdrückliche Erlaubnis, diese Herausforderung hier vom ursprünglichen Autor des Wettbewerbs zu posten. Sie können dies jederzeit überprüfen, indem Sie dem angegebenen Link folgen und den Autor kontaktieren.
Problem
Der Begriff k-mer bezieht sich typischerweise auf alle möglichen Teilzeichenfolgen der Länge k , die in einer Zeichenfolge enthalten sind. In der Computational Genomics beziehen sich k-mere auf alle möglichen Teilsequenzen (mit der Länge k ) aus einem durch DNA-Sequenzierung erhaltenen Messwert. Schreiben Sie eine Funktion / ein Programm, das eine Zeichenfolge und k (die Länge der Teilzeichenfolge) verwendet und einen Vektor der k-mere der ursprünglichen Zeichenfolge zurückgibt / ausgibt.
Beispiele
[4,"ATCGAAGGTCGT"]
→ ["ATCG","TCGA","CGAA","GAAG","AAGG","AGGT","GGTC","GTCG","TCGT"]
k > Stringlänge? Nichts / kein leeres Ergebnis zurückgeben:
[4,"AC"]
→ []
oder ""
oder[""]
['A', 'T', 'C', 'G']
"ATCG"
Antworten:
Gelee , 1 Byte
Jelly hat genau für diese Operation ein dyadisches Einzelbyte-Atom
Probieren Sie es online! (Die Fußzeile teilt die resultierende Liste mit Zeilenumbrüchen, um zu vermeiden, dass eine muskulöse Darstellung gedruckt wird.)
quelle
Oktave, 28 Bytes
Probieren Sie es online!
Für k> funktioniert die Stringlänge in Octave 4.2.1-Fenstern, in tio (Octave 4.0.3) jedoch nicht.
Erstellt numerische Indizes aufeinanderfolgender Elemente und indiziert die Zeichenfolge danach.
quelle
05AB1E , 2 Bytes
Code:
Erläuterung:
Verwendet die 05AB1E- Codierung .
Probieren Sie es online!
quelle
C (GCC auf POSIX),
676663 Bytes-3 Bytes dank @LeakyNun!
Probieren Sie es online!
quelle
j=0
.j+i<=strlen(s)
mit nur ersetzens[j+i]
Brachylog , 3 Bytes
Probieren Sie es online!
Technische Daten:
["ATCGAAGGTCGT",4]
Z
Z = ["ATCG","TCGA","CGAA","GAAG","AAGG","AGGT","GGTC","GTCG","TCGT"]
Wie es funktioniert
quelle
Python 3 ,
47 4542 Bytes-3 Bytes dank ovs (benutze das Auspacken von Python 3, um es
a[n-1:]
am Ende wiederzuverwenden .)Eine rekursive Funktion, die die Zeichenfolge
a
und die Slice-Länge verwendetn
und eine Liste der Slices oder eine leere Zeichenfolge zurückgibt.a[n-1:]
Nimmt einen Teil der aktuellen Zeichenfolge ab dem n- 1ten (0-indizierten) Element, um zu testen, ob noch genügend Elemente vorhanden sind (eine leere Zeichenfolge ist in Python falsch). Dies ist kürzer als das Äquivalentlen(a)>=n
.Wenn genügend Elemente vorhanden sind, wird eine Liste
[...]
mit den erstenn
Elementen der Zeichenfolgea[:n]
und dem entpackten Ergebnis des erneuten Aufrufs der Funktion*f(...)
mit einer in die Warteschlange gestellten Version der aktuellen Eingabe (ohne das erste Element) erstellta[1:]
.Wenn nicht genügend Elemente vorhanden sind, wird der Endpunkt der Rekursion erreicht, wenn
a[n-1:]
zurückgegeben wird (in diesem Fall eine leere Zeichenfolge).Probieren Sie es online!
45 für Python 2 oder 3 mit:
quelle
f=lambda a,n:a[n-1:]and[a[:n],*f(a[1:],n)]
für 42 Bytes (Python 3) TIOJ , 2 Bytes
Es ist kein vollständiges Programm, sondern eine Funktion mit einem Operator.
Nennen Sie es als solches:
Probieren Sie es online!
Wie es funktioniert
Der Operator (genannt "Konjunktion")
\
(genannt " Infix ") wird als solcher verwendet:Die Funktion (genannt "Verb") ist
u
in diesem Fall die Funktion,,
die eine einfache " Anhängen " -Funktion ist:quelle
Mathematica, 21 Bytes
Anonyme Funktion. Nimmt eine Zeichenfolge und eine Zahl (in dieser Reihenfolge) als Eingabe und gibt eine Liste von Zeichenfolgen als Ausgabe zurück.
quelle
R
6561 Bytes-2 Bytes dank MickyT
-2 Bytes durch Ändern der Indizierung
Gibt eine anonyme Funktion zurück.
substring
Durchläuft die Indizes (im Gegensatz zusubstr
denen , die dies nicht1
tun ). Wenn der Startindex kleiner als 1 ist, wird stattdessen standardmäßig der Wert 1 verwendet, sodass die leere Zeichenfolge überprüft und zurückgegeben wird.x:n-n+1
entspricht1:(x-n+1)
da:
hat Vorrang vor Summen / DifferenzenProbieren Sie es online!
quelle
function(s,n,x=nchar(s))
if(n>x,'',substring(s,1:(x-n+1),n:x))
Pyth , 2 Bytes
Es ist kein vollständiges Programm, sondern eine eingebaute Funktion.
Nennen Sie es als solches:
Probieren Sie es online!
Volles Programm:
Probieren Sie es online!
(Das
.*
ist splat.)quelle
.:F
ist ein Byte kürzer für das gesamte Programm.Qualle , 7 Bytes
Probieren Sie es online!
Wie es funktioniert
In linear :,
p(\(I,i))
wop
wird gedruckt und\
erhält die erforderlichen Teilzeichenfolgen.I
ist die rohe erste Eingabe, währendi
die ausgewertete zweite Eingabe ist.In Jellyfish erhält jede Funktion und jeder Operator zwei Argumente, eines von rechts und eines von unten. Hier
p
erhält die Funktion das Argument aus der Ausgabe von_
. Dies ist erforderlich, wenn der Operator\
zum Abrufen von Teilzeichenfolgen verwendet werden soll.quelle
Python 2 , 54 Bytes
Probieren Sie es online!
quelle
Java (OpenJDK 8) , 92 Byte
Probieren Sie es online!
quelle
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 Bytes
Gut, das ist praktisch:
Beispiele:
quelle
CJam , 4 Bytes
Anonymer Block, der die Argumente auf dem Stapel erwartet und das Ergebnis danach auf dem Stapel belässt.
Probieren Sie es online!
ew
ist ein eingebautes Gerät, das genau das tut, was benötigt wird.quelle
Retina ,
4138 BytesProbieren Sie es online!
Nimmt den String und zählt in separaten Zeilen. Die ersten beiden Zeilen werden verwendet, um den Zählwert von dezimal nach unär zu konvertieren. Wenn also eine unäre Eingabe zulässig ist, wird die Byteanzahl auf
34reduziert . Oder, wenn Sie es vorziehen, eine 48-Byte-Version, die Zeilenumbrüche in der Zeichenfolge verarbeitet, obwohl dies zu einer verwirrenden Ausgabe führt:quelle
(?!)
zu¶
.Oktave mit Bildpaket, 29 Bytes
Probieren Sie es online!
Erläuterung
Die Funktion
im2col(m,b)
nimmt eine Matrixm
, extrahiert daraus Größenblöckeb
und ordnet sie als Spalten an. Standardmäßig werden Blöcke verschoben (im Gegensatz zu unterschiedlichen). Hier ist die Matrixm
ein Zeilenvektor der ASCII-Codes der Eingabezeichenfolges
(dies erfolgt als+s
, was kürzer als der Standard istdouble(s)
), und die Größeb
ist[1 n]
, um horizontal gleitende Blöcke vonn
Elementen zu erhalten.Das Ergebnis wird transponiert (mithilfe der komplex-konjugierten Transponierung
'
, die kürzer als die Transponierung ist.'
), um die Spalten in Zeilen umzuwandeln, und dann wieder in char ([... '']
die kürzer als der Standard istchar(...)
) konvertiert .quelle
ok, 2 bytes
ok hat einen schiebefensterheber !
quelle
Python 3 , 49 Bytes
Probieren Sie es online!
Eine nicht rekursive Lösung, wenn auch nicht kürzer.
Kompatibel mit Python 2.
quelle
f=
zwei Bytes sparen, da Sie sief
nirgendwo anders verwenden. Standardmäßig können Funktionen, die nur deklariert und nicht verwendet werden, unbenannt bleiben.PHP, 75 Bytes
Online Version
80 Bytes ohne doppelte Werte
quelle
Haskell, 39 Bytes
Anwendungsbeispiel:
4 # "ABCDEF"
->["ABCD","BCDE","CDEF"]
. Probieren Sie es online!Eine einfache Rekursion, die die ersten
n
Zeichen der Eingabezeichenfolge beibehält und mit dem Ende der Zeichenfolge fortfährt, solange ihre Länge nicht kleiner als istn
.quelle
Microsoft SQL Server, 199 Byte
Prüfen Sie.
quelle
PowerShell, 70 Byte
Probieren Sie es online!
quelle
Gestapelt , 7 Bytes
Probieren Sie es online!
Ziemlich normal. Ohne dieses Builtin werden es 20 Bytes:
Welches ist:
quelle
MATL , 3 Bytes
Probieren Sie es online!
Erläuterung
quelle
C # 89 Bytes
Probieren Sie es online!
Die beste Methode, die ich in C # finden konnte, ist im Grunde die gleiche wie in Java
quelle
Ruby,
4846 BytesKeine besonderen Tricks, nur ein Stabby-Lambda, das eine Funktion definiert, die die erforderliche Teilzeichenfolge von jedem gültigen Startpunkt abzieht.
Zwei Bytes gespart, da das Lambda nicht gespeichert werden muss.
quelle
V , 16 Bytes
Ich fürchte, nicht besonders gut golfen zu können, da ich mit "Lösche die Zeichenfolge, wenn k> len (str)" kämpfe. Die Eingabe erfolgt in der Datei, k ist ein Argument. Golfen vor der Erklärung
Probieren Sie es online!
quelle
Standard ML (mosml),
1096561 BytesNimmt eine Zahlen- und eine Zeichenliste auf (eine häufig verwendete Alternative zu Zeichenfolgen in der SML-Welt). (Funktioniert natürlich wirklich auf allen Listen.)
Verwendung:
Änderungsprotokoll:
quelle
if length(x)<n then
zuif n>length(x)then
. Da es für SML jedoch durchaus möglich ist, Zeichenfolgen zu verarbeiten, bin ich mir nicht sicher, ob es erforderlichexplode
sein darf, dass diese bereits auf die Eingabezeichenfolge angewendet werden.then nil else
kann verkürzt werdenthen[]else
.fun f$n=if n>length$then[]else List.take($,n)::f(tl$)n
.JavaScript (Firefox 30-57), 51 Byte
64 Bytes in ES6:
quelle