Einführung
Lassen Sie uns die Zeichenfolge beobachten abc
. Die Teilzeichenfolgen, die daraus erstellt werden können, sind:
a, ab, abc, b, bc, c
Wir müssen sie nun wie folgt unter der Anfangszeichenfolge ausrichten:
abc
a
b
c
ab
bc
abc
Die Reihenfolge der Zeichenfolge spielt keine Rolle, daher gilt dies auch:
abc
a
ab
abc
b
bc
c
Die Teilzeichenfolge befindet sich also unter der Position der Teilzeichenfolge in der Anfangszeichenfolge. Also für abcdef
und die Teilzeichenfolge cde
würde es so aussehen:
abcdef
cde
Die Aufgabe
Die Aufgabe besteht darin, alle Teilzeichenfolgen mit einer Länge größer als 0 auszurichten , wie oben gezeigt. Sie können davon ausgehen, dass die Zeichenfolge selbst nur alphabetische Zeichen enthält und mindestens 1 Zeichen enthält. Zum Auffüllen können Sie ein Leerzeichen oder ein anderes nicht alphabetisch druckbares ASCII-Zeichen ( 32 - 127
) verwenden. Vielleicht nicht unbedingt zu erwähnen, aber die Zeichenfolge selbst enthält nur eindeutige Zeichen, also nicht wie aba
, da die a
zweimal vorkommt.
Testfälle
Eingang: abcde
Mögliche Ausgabe:
a
ab
abc
abcd
abcde
b
bc
bcd
bcde
c
cd
cde
d
de
e
Eingang: abcdefghij
Mögliche Ausgabe:
a
ab
abc
abcd
abcde
abcdef
abcdefg
abcdefgh
abcdefghi
abcdefghij
b
bc
bcd
bcde
bcdef
bcdefg
bcdefgh
bcdefghi
bcdefghij
c
cd
cde
cdef
cdefg
cdefgh
cdefghi
cdefghij
d
de
def
defg
defgh
defghi
defghij
e
ef
efg
efgh
efghi
efghij
f
fg
fgh
fghi
fghij
g
gh
ghi
ghij
h
hi
hij
i
ij
j
Das ist Code-Golf , also gewinnt die Einsendung mit der geringsten Anzahl von Bytes!
Antworten:
Pyth,
141310 BytesVielen Dank an @FryAmTheEggman für das Speichern von 3 Bytes.
Probieren Sie es online!
quelle
jmXQ-Qd;.:
Ähnliche Idee, mitX
.Perl,
322824 BytesBeinhaltet +1 für
-n
Code:
Führen Sie mit der Zeichenfolge auf STDIN aus:
Die Golfsprachen sind so nah und doch so fern ...
Erläuterung
/.+/
stimmt mit einem Teilstring überein. Leider hört es auf, sobald es zu einem passt. Also benutze ich das Runtime-Regex-Konstrukt(??{})
, um das Regex so zu erweitern, dass es fehlschlägt. Beim Backtracking wird die folgende Teilzeichenfolge verwendet, und am Ende werden alle ausprobiert, bevor es angewidert aufgibt.Innerhalb des
(??{})
drucke ich den aktuellen Teilstring, dem so viele Leerzeichen vorangestellt sind, wie der Versatz des Teilstrings verwendet$"x"@-"
Die Ausgabe dokumentiert also genau, wie das Regex-Backtracking funktioniert:
quelle
perl6 -ne 'm/^(.*)(.+)<{+put " "x$0.to,$1}>/'
ab1
(nehme ich an, weilsay...
auswertet1
). (Getestet in 5.18.2.) Edit: Oh! Entschuldigung, die Frage lautet "Sie können davon ausgehen, dass die Zeichenfolge selbst nur alphabetische Zeichen enthält".MATL ,
20 bis18 BytesInspiriert von dem Muster der Teilzeichenfolgen, die durch @ aditsus Antwort generiert wurden
Probieren Sie es online!
Das Muster der Teilzeichenfolgen wird durch eine obere Dreiecksmatrix mit der gleichen Größe wie die Eingabe und alle Teilmatrizen erzeugt, die durch sukzessives Entfernen der letzten Zeile und Spalte erhalten werden.
Erläuterung
Alter Ansatz (kartesische Kraft)
Ich behalte diesen Ansatz bei, falls er als Inspiration für andere Antworten dient
Im Online-Compiler hat dies nicht genügend Speicher für den längsten Testfall.
Probieren Sie es online!
Erläuterung
Dies erzeugt alle Muster von Werten
0
,1
und2
in aufsteigender Reihenfolge, und dann transformiert2
in0
. Dies gibt alle möglichen Muster von0
und1
wo die1
Werte zusammenhängend sind. Diese werden verwendet, um zu markieren, welche Zeichen aus der ursprünglichen Zeichenfolge stammen.Als Beispiel für eine Zeichenfolge werden
'abc'
die Muster wie folgt generiert. Zuerst wird die kartesische Potenz der[0 1 2]
Erhöhung auf die Anzahl der eingegebenen Zeichen erhalten:Das Sortieren jeder Zeile ergibt
Die Umwandlung
2
in0
(dhmod(...,2)
) und das Entfernen doppelter Zeilen ergibt das endgültige Musterin der jede Zeile eine Maske ist, die einem (zusammenhängenden) Teilstring entspricht. Die erste Zeile muss entfernt werden, da sie der leeren Teilzeichenfolge entspricht.
quelle
Retina ,
483231 BytesVielen Dank an Kenny Lau, der 3 Bytes gespart und den Weg für viele mehr geebnet hat.
Die Anzahl der Bytes setzt die Kodierung nach ISO 8859-1 voraus.
Probieren Sie es online!
Reihenfolge der generierten Teilstrings:
Erläuterung
Dadurch erhalten wir alle Präfixe der Eingabe. Dies erfolgt durch Matching (
M
) eines beliebigen Teilstrings (.+
) beginnend mit end (r
), wobei überlappende Übereinstimmungen (&
) berücksichtigt werden und alle Übereinstimmungen zurückgegeben werden, die mit linefeeds (!
) verknüpft sind .Jetzt müssen wir nur noch die aufeinander folgenden Präfixe dieser Präfixe herausarbeiten (indem wir sie durch Leerzeichen ersetzen). Wir machen dies Schritt für Schritt mit einer Schleife:
Die
%
bedeutet , dass diese ganze Sache auf jede Zeile einzeln durchgeführt wird (wenn man bedenkt es eine separate Zeichenfolge für Vorerst, und alles wieder zusammen mit Zeilenvorschübe am Ende Beitritt). Das+
weist Retina an, diese Ersetzung in einer Schleife auszuführen, bis sich die Ausgabe nicht mehr ändert (was in diesem Fall bedeutet, dass die Regex nicht mehr übereinstimmt). Der Regex versucht dann, die letzte Zeile der Eingabe mit mindestens zwei Nicht-Leerzeichen abzugleichen, und fügt eine neue Zeile hinzu, wobei die erste durch ein Leerzeichen ersetzt wird.quelle
!
impliziertM
und 1char Versionen.+
und.*
?.+
und.*
ich würde die Regex tokenise habe, und während ich plane , dass irgendwann zu tun, ich glaube nicht , dass in absehbarer Zeit passieren ist (und wenn ich das tue, werde ich wahrscheinlich auf Funktionen konzentrieren , die tatsächlich Ausdruckskraft hinzufügen).Oracle SQL 11.2, 146 Byte
Nicht golfen
quelle
CJam, 20
Probieren Sie es online aus
Erläuterung:
quelle
Python, 57 Bytes
Gibt ein
set
ähnliches aus{' b', 'a', 'ab'}
. Die Idee ist, zwei Verzweigungen, die das erste oder letzte Zeichen abschneiden, zu rekursiv zu behandeln. Das gibt redundante Ausgaben, aber dasset
entfernt automatisch Duplikate. Bei der Ausrichtung wird jedes Mal, wenn das erste Zeichen abgeschnitten wird, dem Präfix ein Leerzeichen hinzugefügtp
, das auf der Vorderseite verkettet wird.quelle
PowerShell v2 +, 69 Byte
Nimmt Eingaben auf
$a
, durchläuft die Länge (Einstellung$b
für spätere Verwendung). Jede äußere Schleife wird$b
erneut durchlaufen und$i
für die spätere Verwendung eingestellt. In jeder inneren Schleife geben wir die$i
Anzahl der Leerzeichen aus, die mit einem Teil der Eingabezeichenfolge verknüpft sind. Da wir nur die Zeichenfolge durchlaufen, werden alle beliebigen Zeichenfolgen (doppelte Buchstaben, Leerzeichen usw.) verarbeitet.Beispiel
quelle
C #,
136132131 BytesGolf gespielt
Ungolfed
Vollständiger Code
Releases
-1 byte
- GeändertString o="",e="";
inString o="",e=o;
, um 1 Byte zu speichern. Die Idee kam von Gallant ( ich habe vergessen, diesen Teil im letzten Update anzuwenden, ich entschuldige mich. ).-4 bytes
- Löste die Klammern von denfor
Schleifen und verschob dase
Var- Space-Inkrement in die Iteratorzone der äußerenfor
Schleife. Die Idee kam von Gallant .136 bytes
- Anfangslösung.quelle
e=o
, um 3 Bytes zu speichern.String o="",...
mitvar o...
einem anderen tauschen 3.String o = "", e = "";
zu konvertieren ,var
da ich sie in zwei Teile trennen müsste, was dazu führt, dassvar o = ""; var e = "";
die Länge mit der von mir verglichen wird. Würde es tun, aber VS erlaubt keine Mehrfachvariablendeklaration, wenn implizit typisierte Variablen - auch bekannt alsvar
's - verwendet werden. Aber danke für die Hilfe. EDIT: Wenn VS mich schreit, dass ich es nicht kann, gehe ich davon aus, dass es falsch ist, kann es falsch sein.Python 2.7,
7082 BytesIch konnte nicht herausfinden, wie ich es in eine Zeile bekomme. Mit anrufen
e("abcde",0)
quelle
Python 3,
8078 BytesDurchlaufen Sie die Anzahl der Leerzeichen, denen das Präfix vorangestellt werden soll, und die Anzahl der Zeichen, mit denen das Zeichen enden soll.
Bearbeiten: Leerzeichen vor den for-Schleifen entfernt.
quelle
MATL,
1514 Bytes1 Byte aufgrund des @ LuisMendo- Tipps hier gespeichert !
So viele Wege ... mussten einen neuen finden. Glückliche Stücke! :)
Probieren Sie es online!
Explodiert
quelle
JavaScript (ES6), 89 Byte
Unkomplizierter Ansatz. Die Ausgabe enthält eine nachgestellte Newline.
quelle
=>
bedeutet in Javascript? Ist es ein binärer OperatorJavaScript (ES6), 72
quelle
Pyth,
1211 BytesLeider erlaubt uns die Frage, eindeutige Zeichen anzunehmen, so dass ich nur die erste Position des Teilstrings suche und mit Leerzeichen auffülle.
quelle
;
stattdessen verwenden,\
wenn Sie sich in der Karte der untersten Ebene befinden.Mathematica 89 Bytes
Erläuterung
i
bezieht sich auf die EingabezeichenfolgeSubsequences[y=Characters@i]
gibt alle Teilfolgen (dargestellte Zeichenlisten) der Eingabe zurück. (Subsequences
wurde in v. 10.4 eingeführt)Gibt für jede
Complement...
Untersequenz die Zeichen aus der Eingabezeichenfolge zurück, die nicht vorhanden sind. Jedes dieser Zeichen wird durch ein Leerzeichen ersetztStringReplace[i,#->" "]
.Column
Zeigt die Ergebnisse in einer einzelnen Spalte an. Jede Ausgabezeichenfolge hat die gleiche Anzahl von Zeichen, was zu ausgerichteten Buchstaben führt.quelle
J
32 2928 BytesDies ergibt ein monadisches Verb. Probieren Sie es hier aus. Verwendung:
Erläuterung
Als einige andere Antworten berechne ich den Index des Vorkommens des ersten Zeichens jeder Teilzeichenfolge. Die Teilzeichenfolgen werden in einer Matrix mit nachgestellten Leerzeichen gespeichert, daher drehe ich sie um ihren Index nach rechts, um den richtigen Abstand zu erhalten. Das ein Stück Whitespace zwischen
"1
unda:
ist wirklich nervig ...quelle
a e
ist keine Teilzeichenfolge im Sinne der HerausforderungJavaScript (Firefox 30-57),
6563 BytesGibt ein Array von Zeichenfolgen zurück. Als ES6 sind es 78 Bytes:
quelle
QBasic, 75 Bytes
Die grundlegende
FOR
Double-Loop-Strategie wurde für die 1-basierte Indexierung von QBasic etwas modifiziert. Der Haupttrick istLOCATE,j
, den Cursorj
vor dem Drucken in die Spalte der aktuellen Zeile zu bewegen. Da Spalte 1 die erste Spalte ist, entspricht dies dem Drucken vonj-1
führenden Leerzeichen.quelle
Perl 6 , 34 Bytes
Der Grund für das
+
Vorherput
ist, dass es1
stattdessen zurückkehrtTrue
, was garantiert nicht in der Eingabe ist, so dass es immer zurückverfolgen muss.(Wenn Sie es in umgekehrter Reihenfolge wünschen, verwenden Sie
(.*?)(.+?)
statt(.*)(.+)
)Dies wurde von der Perl 5-Antwort inspiriert .
quelle
J,
352322 BytesEs hat eine Weile gedauert, aber ich habe es endlich optimiert.
Verwendung
Erläuterung
quelle
[:+./"1' '~:]
stattdessen[:-.[:*/"1' '=]
weitere 2 Bytes gespeichert.Java, 138 Bytes
Formatiert:
quelle
Pyke, 15 Bytes
Probieren Sie es hier aus!
Vorausgesetzt, ein Array mit gepolsterten Zeichenfolgen ist zulässig
Erst Pads und dann Chops.
quelle
Haskell, 65 Bytes
Es erfordert
inits
undtails
von Data.List. Um es auszugeben, fügen SiemapM_ putStrLn.
es der Vorderseite hinzu.Relativ einfach; Damit
reverse
stellen Sie sicher, dass die ursprüngliche Zeichenfolge an erster Stelle steht.quelle
(>>=zipWith(++)(inits$cycle" ").init.tails).inits
. Und bitte addieren Sie dieimport Data.List;
zur Byteanzahl.Ruby,
7567 BytesAnonyme Funktion.
Verwendet die Regex-Ersetzung, um die Teilzeichenfolgen auszurichten..
ist das Füllzeichen.quelle
Bash + GNU Coreutils, 109 Bytes
Vielleicht gibt es eine kürzere Lösung, aber dies ist die beste, die mir eingefallen ist. Die Einzigartigkeit der Chracters spielt hier keine Rolle.
quelle
PHP, 151 Zeichen
Ungolfed
Golf gespielt
Beispiel
quelle
C ++, 145 Bytes
Der erste Startparameter wird als Eingabe, die Konsole als Ausgabe verwendet
quelle
std::cout<<r[0]<<y<<'\n'
anstelle von `std :: cout.write (r [0], y) << '\ n' tun ? Können Sie bitte eine kurze Erklärung hinzufügen? Vielen Dank!Python 2 (Ungolfed) 99 Bytes
Ergebnis:
quelle