Benutzer von Leerzeicheneinrückungen, vereinigt euch ! Wir müssen gegen alle Benutzer mit niedrigen Tabs kämpfen !
Ihre Mission (sollten Sie diese akzeptieren) ist es, ein Programm oder eine Funktion zu schreiben, die zwei Argumente enthält:
- Eine Zeichenfolge: Dies ist die Eingabe.
- Eine positive Ganzzahl: Dies ist die Anzahl der Leerzeichen pro Tabulator.
Sie müssen jede Zeile der Zeichenfolge durchgehen und jeden Tabulator, der zum Einrücken verwendet wird, durch die angegebene Anzahl von Leerzeichen und jeden Tabulator, der nicht zum Einrücken verwendet wird (z. B. in der Mitte einer Zeile), durch ein Leerzeichen ersetzen .
Beachten Sie, dass Zeilen wie \t \tabc
undefiniertes Verhalten sind. Sie wurden von den Benutzern der bösen Registerkarte eingefügt, um Ihre Programme zu komplizieren.
Laut der Tabs Must Die Society muss Ihr Programm so kurz wie möglich sein, um eine Erkennung durch die bösen Tab-Benutzer zu vermeiden.
Beispiel
\t
wird verwendet, um hier Registerkarten darzustellen.
Eingabezeichenfolge:
a
\t\tb\tc
d
Eingabenummer:
4
Ausgabe:
a
b c
d
Die mittlere Zeile wurde um 8 Leerzeichen eingerückt, 4 pro Tab (da die angegebene Nummer 4 war).
Eingabezeichenfolge:
\ta\t\tb
Eingabenummer:
4
Ausgabe:
a b
HINWEIS: Dies ist kein Duplikat der Tab-Erweiterungsaufforderung . Es erfordert ein ganz anderes Eingabeformat und etwas andere Anforderungen.
quelle
\ta\t\tb
,4
(meine frühere Revision versagt , dass man)Antworten:
CJam,
302423 BytesNormalerweise weigere ich mich, bösartigen Code ins Internet zu stellen.
Dies ist ein vollständiges Programm, das die Zeichenfolge von STDIN und die Zahl als Befehlszeilenargument liest.
Probieren Sie es online im CJam-Interpreter aus .
Wie es funktioniert
Was
NA=
macht:Enthält für das erste Zeichen
N
seinen Standardwert, dh die Zeichenfolge"\n"
.Enthält für alle nachfolgenden Zeichen
N
das Ergebnis der letzten Iteration, dh das letzte eingegebene Zeichen, ein Leerzeichen oder eine Zeichenfolge aus einem oder mehreren Leerzeichen.Wenn
N
es sich um eine Zeichenfolge handelt,NA=
wird das Element am Index 10 von N ausgewählt (umlaufend). Das Ergebnis ist ein Leerzeichen oder ein Zeilenumbruch. Beide sind wahr.Wenn N ein Zeichen ist,
NA=
drücken Sie 1 für einen Zeilenumbruch und 0 ansonsten.Aus diesem Grund
NA=
wird ein wahrer Wert für das erste Zeichen, ein Zeichen mit vorangestelltem Zeilenvorschub oder ein Zeichen mit vorangestellter Leerzeichenfolge (Einrückung, die bereits ersetzt wurde), übertragen.In allen anderen Fällen (einschließlich Tabulatoren , die durch ein Leerzeichen ersetzt wurde Charakter ),
NA=
drückt einen falsy Wert.quelle
K5,
5345 BytesIn Aktion:
Ich möchte nur, dass die Akte zeigt, dass diese Frage moralisch verwerflich ist.
quelle
... this question is morally reprehensible.
`0:
und "\ n".Perl, 23 Bytes
22 Byte Code + 1 Byte Befehlszeile
Hoffentlich nicht zu frech, um anzunehmen, dass die numerische Eingabe über den Parameter -i erfolgen kann! Stellen Sie sicher, dass \ t im folgenden Code durch das tatsächliche Tabulatorzeichen ersetzt wird.
Anwendungsbeispiel:
Oder der Einfachheit halber:
Erläuterung:
Die Verwendung des
-p
Arguments führt das Programm für jede Zeile in der Eingabe aus und gibt das Ergebnis am Ende aus.Im obigen Beispiel wird die Regex-Ersetzung
\G\t
durch" "x4
(ein Leerzeichen, das viermal wiederholt wird) ersetzt.\G
ist ein wenig bekanntes Regex-Konstrukt, das entweder mit der Position der ersten Übereinstimmung bei der ersten Iteration oder mit der Position der vorherigen Übereinstimmung bei der ersten Iteration übereinstimmt. Dies bedeutet, dass nur alle Tabulatoren am Anfang der Zeichenfolge ersetzt werden und mach das eins nach dem anderen. Dasy/\t/ /
ersetzt einfach alle verbleibenden Tabulatoren durch Leerzeichen.quelle
Julia,
69-59BytesUngolfed:
10 Bytes gespart und ein Problem dank Glen O behoben!
quelle
"hello\t\t1"
?"\t \t"
Situationen), können Sie Folgendes tun:,f(s,n)=(r=replace)(r(s,r"^\t*"m,i->" "^endof(i)n),"\t"," ")
das eine Ersetzungsfunktion verwendet und alle Einrückungs-Tabulatoren mit einem Treffer erfasst.Haskell, 82 Bytes
Dann
g 3 "a\n\t\tb\tc\nd"
macht das Ding.quelle
Mathematica,
4237 BytesVielen Dank an @ LegionMammal978 für mehrere Vorschläge zum Speichern von Code. Der erste Parameter
#
steht für den Eingabetext, der zweite#2
für die Anzahl der Leerzeichen pro Tabulator.quelle
Table[" ",{#2}]
um" "~Table~{#2}
ein Byte zu speichern. WarumStringJoin
legst du den leeren String drauf?Ruby 49 Bytes
quelle
JavaScript (ES6), 70
Mit Hilfe von Template-Strings wird der Zeilenumbruch signifikant und gezählt
Testen Sie das folgende Snippet in Firefox.
quelle
CoffeeScript, 72 Bytes
(Beim Versuch, mindestens zwei weitere Bisse zu golfen, schlägt es die ES6-Lösung ... Hilfe geschätzt: D)
Verwendung:
quelle
Netzhaut, 42 Bytes
Alle Vorkommen von
.
sind Leerzeichen, alle\t
sind wörtliche Tabulatoren (1 Byte) und<empty>
stellen eine leere Datei dar. Es dient nur der Lesbarkeit. Ich bin mir auch nicht ganz sicher, ob ich die Schleife richtig mache, aber ich denke schon. Jede Zeile sollte in einer eigenen Datei platziert werden. Ich habe 1 Byte für jede weitere Datei hinzugefügt.Es wird davon ausgegangen, dass sich die Eingabe am Ende der Eingabe in einer eigenen Zeile in Unary befindet.
Erläuterung
Ich füge
_
vor der Unary-Eingabe ein hinzu, um sie beim Ersetzen abzugrenzen, damit ich keine nachgestellten aus der Eingabezeichenfolge entferne. Dann ersetze ich alle Tabulatoren, die nicht am Anfang einer Zeile stehen, durch ein einzelnes Leerzeichen. Dann schleife ich, entferne ein einzelnes1
und füge nach jedem Tab ein einzelnes Leerzeichen hinzu, bis mir die Eingabe ausgeht. Zum Schluss entferne ich die Tabs und den Unterstrich.quelle
Python,
7268 BytesTabulatoren sind wörtliche Tabulatoren (1 Byte) und werden daher
r'...'
nicht benötigt. Leider erfordert Python Look-Behinds / Look-Aheads mit "fester Breite", sodass ich sie nicht verwenden kann(?<!^|\t)
. Verwendet fast die gleiche Methode wie meine Retina-Lösung.quelle
Stax , 20 Bytes
Führen Sie es aus und debuggen Sie es
Dieses Programm liest die erste Zeile als Einzugsbreite und den Rest der Eingabe als Programm.
quelle
Japt v2.0a0, 17 Bytes
Versuch es
quelle
Haskell , 75 Bytes
Probieren Sie es online! Dies setzt voraus, dass die Eingabe nur druckbare Zeichen sowie Tabulatoren und Zeilenumbrüche enthält, wie dies durch OP in den Kommentaren zulässig ist.
Erläuterung:
Die äußere
#
Funktion nimmt eine Zeichenfolges
und eine Zahlm
und ruft die innere lokal definierte#
Funktion mit denselben Argumenten auf. Dies geschieht, um den ursprünglichenm
Wert zu verfolgen , da die innere#
Funktion die Zahl ändert:('\t':r)#n=(' '<$[1..n])++r#n
Wenn Sie auf einen Tabulator stoßen, ersetzen Sie ihn durchn
Leerzeichen und lassen Sie ihnn
unverändert.(x:r)#n=x:r#(m^sum[1|x<' '])
Wennx
ein Tabulator nicht gefunden wird, behalten Sie diesen bei, setzen Sie ihn jedochn
auf die ursprüngliche Nummer,m
wennx
es sich um einen Zeilenumbruch handelt, und auf eine1
andere Nummer . Dies wird gemacht durchm^sum[1|x<' ']
: Wirdm
zur Potenz vonsum[1|x<' ']
ausgewertet,1
wennx
kleiner als ein Leerzeichen (dh eine neue Zeile) ist, so dass wir erhaltenm^1 = m
. Ansonsten ist es0
und wir habenm^0 = 1
.quelle
Java 11, 134 Bytes
Probieren Sie es online aus.
HINWEIS: Java 11 ist noch nicht in TIO, wurde also
" ".repeat(n)
als emuliertrepeat(" ",n)
(mit derselben Byteanzahl).Erläuterung:
quelle