Wenn Sie in Python codieren, möchten Sie manchmal einen mehrzeiligen String in einer Funktion, z
def f():
s = """\
Line 1
Line 2
Line 3"""
(Der Backslash ist das Entfernen eines führenden Zeilenumbruchs)
Wenn Sie jedoch versuchen, tatsächlich auszudrucken s
, erhalten Sie
Line 1
Line 2
Line 3
Das wollen wir überhaupt nicht! Es gibt zu viel führendes Leerzeichen!
Die Herausforderung
Entfernen Sie bei einer mehrzeiligen Zeichenfolge, die nur aus alphanumerischen Zeichen, Leerzeichen und Zeilenumbrüchen besteht, alle gemeinsamen Leerzeichen am Anfang jeder Zeile. Jede Zeile muss mindestens ein Nicht-Leerzeichen enthalten und darf keine nachgestellten Leerzeichen enthalten. Die Ausgabe darf keine Leerzeichen enthalten, sei es vor oder nach der gesamten Ausgabe oder einer einzelnen Zeile (mit Ausnahme einer einzelnen optionalen nachgestellten Zeile).
Die Eingabe kann über STDIN oder ein Funktionsargument erfolgen, und die Ausgabe kann über STDOUT oder einen Funktionsrückgabewert erfolgen. Sie können keine eingebauten Funktionen verwenden, die dazu dienen, mehrzeilige Zeichenfolgen zu dedizieren oder genau diese Aufgabe auszuführen, z textwrap.dedent
. B. Python's .
Das ist Code-Golf , also gewinnt die Lösung mit den wenigsten Bytes. Es gelten Standardlücken .
Testfälle
"a" -> "a"
" abc" -> "abc"
" abc\n def\n ghi" -> " abc\ndef\n ghi"
" a\n b\n c" -> "a\nb\nc"
" a\n b\n c\nd" -> " a\n b\n c\nd"
" a b\n c d\n e f" -> "a b\n c d\n e f"
Zum Beispiel ist der letzte Testfall
a b
c d
e f
und sollte so aussehen, nachdem führende Leerzeichen entfernt wurden:
a b
c d
e f
quelle
Antworten:
CJam,
20 bis14 BytesAlgorithmus :
qN/_
)z{S-}#
).f>
)N*
)Code-Erweiterung
Probieren Sie es hier online aus
quelle
Pyth,
19181714 BytesDie Implementierung ist ziemlich cool.
u .z
greift nach allen stdin-Zeilen in einem Array und fügt sie einG
. Dann wertet es den inneren Körper aus, setzt das Ergebnis einG
und tut dies so lange, bis es sich nicht mehr ändert (Fixpunkt).!rhCG6
transponiertG
, ruft das erste Element des transponierten Arrays (die erste Spalte) ab, entfernt alle Leerzeichen und prüft, ob andere Zeichen als Leerzeichen übrig sind.Der Wert von 2 ist ein Boolescher Wert, der als int 0 oder 1 angesehen werden kann. Er nimmt
>R G
diese Zahl und schneidet so viele Zeichen links von jeder Zeile in abG
. Die kombinierten Schritte 1, 2 und 3 bedeuten im Grunde, dass weiterhin Leerraumspalten entfernt werden, bis keine reine Leerraumspalte mehr vorhanden ist.jb
Verbindet das Zeilenfeld durch Zeilenumbrüche und druckt es aus.quelle
sed - 26 Bytes
renn mit
-rz
Ziemlich einfach:
-r
Option aktiviert erweiterte reguläre Ausdrücke,-z
liest die gesamte Eingabe als einzelne Zeichenfolge (verwendet tatsächlich NUL-Byte als Zeilentrennzeichen)quelle
:;N;$!b
zu Beginn die Eingabezeilen in einem einzigen Musterraum zusammenfassen? Bearbeiten: nein, tust du nicht; Dafür ist die-z
Flagge da.:;/^\S/M!s/^ //mg;t
, jetzt nicht erforderlich-r
SWI-Prolog,
233223217 BytesEdit : Hat meine Antwort komplett geändert. Es werden jetzt Zeichencodes anstelle von Zeichenfolgen verwendet.
Ein Beispiel für diesen Aufruf wäre
a(` a b\n c d\n e f`).
, mit Anführungszeichen. Möglicherweise müssen"
Sie stattdessen doppelte Anführungszeichen verwenden, wenn Sie einen alten SWI-Prolog-Distributor haben.quelle
Julia,
939281 BytesDank Glen O 10 Bytes gespart.
Dadurch wird eine unbenannte Funktion erstellt, die eine Zeichenfolge akzeptiert und auf stdout druckt.
Ungolfed + Erklärung:
quelle
minimum([length(search(j, r"^ +")) for j in p])+1
verwendenminimum([search(j,r"[^ ]")[1]for j=p])
. Da die Abfrage angibt, dass in allen Zeilen kein Leerzeichen verwendet wird, ist sie sicher und spart 9 Byte (einschließlich 3, die durch Verwendung von=
anstelle von "in). Still looking to see if more can be saved. (I wish I could drop the
[1]" gespeichert wurden). Bei der Suche wird jedoch ein Enumerator-Array vom Typ "Any" erstellt, während dies mindestens erforderlich ist ein Int-Typ)s->for i=(p=split(s,"\n")) println(i[minimum([search(j,r"[^ ]")[1]for j=p]):end])end
minimum(x)
wannx
ein Array vorliegt, verwenden Siemin(x...)
, um ein zusätzliches Byte zu sparen (ich werde dieses Byte zu meiner Liste der Julia-Golftipps hinzufügen).\S
anstatt verglichen werden[^ ]
, wodurch ein Byte gespeichert wird.\S
du das erwähnt hast - ich bin nicht gut mit Regex, aber es stellte sich heraus, dass das auch für meine Lösung nützlich ist.Java, 159
Weil es auffällig wenig Java gibt ...
Es sind nur Schleifen, die die Länge mit der zugeschnittenen Länge vergleichen und dann Teilstrings ausspucken. Nichts Besonderes. Für die Bildlaufleiste beeinträchtigt:
quelle
Perl,
4733Vielen Dank an @ThisSuitIsBlackNot für den Vorschlag, die implizite Schleife von Perl zu verwenden
Das Obige wird als 30 Bytes für die Codezeile + 3 für
00p
Flags gewertet .Originalfassung, als Funktion:
Dies setzt das Argument in ein
$_
und versucht dann, gierig Leerzeichen, die in allen Zeilen vorhanden sind, mit/^( +).*(\n\1.*)*$/
- abzugleichen. Wenn dies erfolgreich ist,$1
enthält es jetzt das längste gemeinsame Präfix, und wir führen die Ersetzung auss/^$1//mgr
, um es am Anfang jeder Zeile zu löschen und den resultierenden String zurückzugeben.Prüfung
quelle
perl -00pe '/^( +).*(\n\1.*)*$/&&s/^$1//mg'
(30 Bytes + 3 für00p
)./me
geht weg, um aufzublicken-00p
; Vielen Dank @ThisSuitPython 2,
867975 BytesDies kann mit ziemlicher Sicherheit noch etwas gekürzt werden, aber im Moment ist es nicht schlecht.
Danke an xnor für das Speichern von 4 Bytes!
quelle
x.find(x.strip())
.input()
in Python 2 würde diese Daten ersticken.):
C #, 18 + 145 = 163 Bytes
Benötigt (18 Bytes):
Methode (145 Bytes):
Die Methode berechnet die geringste Anzahl von führenden Leerzeichen in den Zeilen und erstellt eine neue Zeichenfolge, die aus allen Zeilen besteht, wobei N Zeichen übersprungen werden (wobei N die zuvor berechnete Zahl ist).
quelle
Ruby:
7773706665585740 ZeichenProbelauf:
quelle
f=->t{t.gsub /^#{t.scan(/^ */).min}/,""}
?C #, 149 Bytes insgesamt
Praktisch die gleiche Lösung wie bei ProgramFOX, obwohl die Anzahl der zu trimmenden Zeichen manuell berechnet wird.
Und die Funktion selbst:
quelle
Python 3, 100
quelle
JavaScript, ES6,
8986 BytesIn diesem Fall werden nur RegEx-Übereinstimmungen und -Ersetzungen verwendet.
Wie immer nur Firefox, seit ES6. Fügt später die ES5-Version hinzu.
quelle
K, 31 Bytes
Übernimmt die Eingabe einer Liste von Zeichenfolgen und druckt das Ergebnis auf stdout.
quelle
Haskell, 52 Bytes
Anwendungsbeispiel:
unlines.until(any(/=' ').map head)(map tail).lines $ " abc\n def\n ghi"
->" abc\ndef\n ghi\n"
Wie es funktioniert:
quelle
Python, 94/95
Lambda (94 Bytes):
def (95 Bytes)
quelle
Bash + Sed + Coreutils,
74,56, 55Testdaten
Antworten
Ausgabe
quelle
cut -c$[`grep -o '^ *'<<<"$s"|sort|sed q|wc -c`]-<<<"$s"
$[]
Rechnen vergessen . Diecut
Spaltenauswahl ist viel besser. Ich habe noch niesed q
eine Alternative gesehenhead -n1
, es ist ein guter Golftick. Vielen Dank!head -n1
vssed q
gibt es einline
Tool im Paket util-linux.R
118111 BytesVerwenden der wunderbaren Zeichenfolgenfunktionen von R :) Dies ist ähnlich zu anderen bereits veröffentlichten Lösungen. Die Eingabe erfolgt über STDIN und Katzen an STDOUT.
Test und Erklärung
quelle
Julia,
726261575449 BytesUngolfed:
Ältere Lösung (57 Bytes):
Ursprüngliche Lösung (72 Bytes):
quelle
k (24 Bytes)
Nimmt eine Zeichenfolge als Argument und gibt eine Zeichenfolge zurück (mit nachfolgendem Zeilenumbruch).
Beispiel:
quelle
05AB1E , 10 Bytes
Probieren Sie es online!
quelle
*
wiederholt die Zeichenfolge b einige Male? .. Wusste nicht über diese Funktion von*
. Normalerweise mache ich dass∍
(tauschen und verlängern), wenn ich einen bestimmten Charakter wiederholen möchte.и
ergibt und eine Liste von Zeichen ergibt.Gawk,
101100Beispielsweise...
Ausgabe...
quelle
/^( +)/
→/^ +/
(dann haben Sie den gewünschten Wertt[0]
anstelle vont[1]
); änderns==""
→!s
; Entfernen Sie das{
und}
um den Code nachif
; entferne das;
vorher}
; Verwenden der Gawk-spezifischen Funktion, um den{
und}
um den Code herum zu entfernen, nachdemfor
:{sub(s,"",z[r]);print z[r]}
→print gensub(s,"",1,z[r])
.C GCC, 74 Bytes
Entfernt nur alle Leerzeichen, die sich nicht auf vorherige Zeilen beziehen, und fordert zum Beenden Hilfe an. Bedeutet AUCH in Bezug auf übliche Leerzeichen das OP, dass in welcher Zeile die wenigsten führenden Leerzeichen stehen, dh die Anzahl der Leerzeichen, die aus jeder Zeile entfernt werden sollen?
quelle
Gestapelt , nicht konkurrierend, 43 Bytes
Probieren Sie es online!
Dies funktioniert, indem Sie die Anzahl der Leerzeichen am Anfang jeder Zeile ermitteln (
'^ +'match$#'"!
), das Minimum ermitteln, ein Leerzeichen so oft wiederholen und das Leerzeichen durch nichts in jeder Zeile ersetzen.quelle
Vim,
33, 31 BytesProbieren Sie es online!
Alte Version:
quelle
Stax , 9 Bytes
Führen Sie es aus und debuggen Sie es
quelle
CoffeeScript, 112 Bytes
quelle
JavaScript (ES6),
10698 ByteDie Zeilenumbrüche sind notwendig und werden jeweils als 1 Byte gezählt:
Demo
Wie bei anderen ES6-Antworten funktionieren sie derzeit nur in Firefox.
quelle
JavaScript ES6, 85 Byte
Die neuen Zeilen sind von Bedeutung
ES5 Demo:
quelle
JavaScript ( ES6 ) 56
Rekursiv, wobei versucht wird, jeweils ein Leerzeichen aus jeder Zeile zu entfernen, bis ein Nicht-Leerzeichen gefunden wird.
Testen Sie das folgende Snippet - nur ES6, Firefox
quelle