Als Programmierer haben Sie wahrscheinlich von Schrägstrichen und umgekehrten Schrägstrichen gehört. Aber haben Sie von Downslashes gehört? Dann nimmst du ein paar Schrägstriche, verbindest ihre Enden und ziehst sie nach unten.
Für die heutige Herausforderung müssen Sie ein Programm oder eine Funktion schreiben, die eine Zeichenfolge verwendet, die nur aus Schrägstrichen besteht, und alle diese Schrägstriche in einer Linie ausgibt, die sie verbindet. Dies wird viel deutlicher, wenn Sie ein Beispiel sehen. In Anbetracht der Zeichenfolge \\\//\/\\
sollten Sie Folgendes ausgeben:
\
\
\
/
/
\
/
\
\
Hier einige Erläuterungen:
Es muss ein Schrägstrich pro Zeile stehen.
Die erste Zeile enthält 0 führende Leerzeichen.
Für jedes Paar Schrägstriche:
Wenn sie sich unterscheiden, werden sie in derselben Spalte gezeichnet. Zum Beispiel
\/
wird geben:\ /
Wenn sie den gleichen Charakter, die untere werden , ist in der Richtung darauf zu, daß für einen umgekehrten Schrägstrich nach rechts bewegt, und für einen Schrägstrich nach links bewegt. So
\\//
wird es geben\ \ / /
Jede Zeile kann zusätzliche Leerzeichen enthalten, solange dies das Erscheinungsbild der Ausgabe nicht verändert. Bis zu einer nachgestellten und führenden Zeile ist ebenfalls zulässig. Zusätzliche führende Leerzeichen sind nicht zulässig !
Um dies zu vereinfachen, können Sie davon ausgehen, dass die Zeichenfolge niemals zu viele Schrägstriche enthält. Mit anderen Worten, kein Präfix der Eingabe enthält mehr Schrägstriche als umgekehrte Schrägstriche, sodass eine Eingabe wie \\////
oder //
niemals gegeben wird. Dies bedeutet auch, dass jede Eingabe mit einem Backslash beginnt.
Wenn Ihre Eingabe als String-Literal interpretiert wird, können Sie die Backslashes umgehen, falls dies erforderlich ist. Sie müssen auch niemals eine Eingabe verarbeiten, die leer ist oder andere Zeichen als Schrägstriche enthält.
Sie können in jedem vernünftigen Format ausgeben .
Wie üblich handelt es sich hierbei um eine Code-Golf- Herausforderung. Versuchen Sie daher, die kürzestmögliche Lösung zu finden, auch wenn Sie eine Sprache auswählen, in der dies schwierig ist. Bonuspunkte für die Erklärung interessanter Techniken, mit denen Sie Bytes abgelegt haben!
Beispiele
#Input
\\\\\\\\\\\
#Output
\
\
\
\
\
\
\
\
\
\
\
#Input
\\\//\\/\//\\///
#Output
\
\
\
/
/
\
\
/
\
/
/
\
\
/
/
/
#Input
\/\/\/
#Output
\
/
\
/
\
/
Antworten:
GNU Sed, 20
Beachten Sie, dass es sich bei
^L
und^H
um Literalformfeed- und Backspace-Zeichen (0x12 und 0x8) handelt.Diese Antwort funktioniert durch Bewegen des Cursors mit Rücktaste und Formfeed-Zeichen. Die Schrägstriche / Backslashes werden nicht mit Leerzeichen aufgefüllt - Nicht sicher, disqualifiziert diese Antwort. Dies funktioniert nicht in TIO, aber es sieht gut aus unter gängigen Terminals wie
xterm
undgnome-terminal
.Erstellen Sie dieses sed-Skript wie folgt neu:
Führen Sie es wie folgt aus:
Erläuterung:
quelle
Kohle ,
131211 BytesProbieren Sie es online! Link ist eine ausführliche Version des Codes. Unterstützt zusätzliche
//
s. Erläuterung:quelle
↓¶
= "Nach links bewegen" in der Beschreibung nicht richtig ist.\n/
unten drucken " zu sagenprint \n/ down
weil ich der Meinung war, dass es hilfreicher ist, die Wirkung des Codes zu beschreiben, als seine wörtliche Übersetzung.MyCode - Do the spec
). Ich verstehe es jetzt, obwohl der Effekt darin besteht, sich nach links zu bewegen. Es könnte sich lohnen zu sagen "Nach links bewegen (durch Drucken einer neuen Zeile mit Druckrichtung nach unten)".Python 2 ,
5554515753 Bytes-3 Bytes (und ein Bugfix) dank Felipe Nardi Batista
Probieren Sie es online!
quelle
/// 119 Bytes
/// hat keine Eingabebefehle, daher muss die Eingabe in das Programm eingebettet sein. In diesem Fall wird die Eingabezeichenfolge einfach angehängt, ohne dass ein Escapezeichen erforderlich ist.
-d
Option (Programmstatus in Klammern, bevor jeder Befehl ausgeführt wird).Wie es funktioniert
\\/\//
wird zu Demonstrationszwecken eine Eingabe von an das Programm angehängt.
wird verwendet, um Zeilenumbrüche im Inline-Code darzustellen.Abkürzungen
Der Beginn
/=/\/\///M/|%%=N/%|||=C/BA=
des Programms enthält Substitutionen für Golfabkürzungen.=
erweitert sich zu//
,M
zu|%%
,N
zu%|||
undC
zuBA
.Danach wird das aktuelle Programm
Eingabe-Rekodierung
In der nächsten Stufe wird die angehängte Eingabezeichenfolge in eine benutzerfreundlichere Form umgewandelt. Da es vollständig aus den beiden Befehlszeichen von /// besteht, ist darauf zu achten, dass das Basisprogramm nicht beschädigt wird.
/\/\\/\/BA\\/
ersetzt die Zeichenfolge/\
durch/BA\
./\
zu diesem Zeitpunkt keine, daher wirkt sich diese Ersetzung nicht auf das Programm aus.\
s gefolgt von Folgen von/
s auf, was es zusammen mit demABA
am Ende des Basisprogramms ermöglicht, sie mit den folgenden Ersetzungen zu durchlaufen.ABA
Präfix davor einfügen, wird die Beispiel-Eingabezeichenfolge jetzt zuABA\\/BA\//
./BA\\/BAbBA/
ersetztBA\
durchBAbBA
.\
s der Eingabezeichenfolge, die nun mit dem Präfix versehen wirdABAbBAbBA/BAbBA//
/B\A\//BAfBA/
ändert sichBA/
zuBAfBA
und durchläuft das/
s.\
bei dieser Substitution ist erforderlich, da es sonst durch die vorherige entstellt würde.ABAbBAbBAfBABAbBAfBAfBA
./AB//
einige überflüssige Teile der Codierung entfernt und in umgewandeltAbBAbBAfBAbBAfBAfBA
.AB
aus der/|/AB\\/
Ersetzung später im Programm, die erforderlich war, um es vor der obigen/\
Manipulation zu schützen .\
in der ursprünglichen Eingabezeichenfolge gewordenAbB
, und jeder/
ist gewordenAfB
. (b
undf
stehen für vorwärts und rückwärts.) Am Ende ist ein StreunerA
.A
s undB
s durch Programmfragmente, die im Endstadium ausgeführt werden sollen. In den Ersetzungszeichenfolgen codieren%
s und|
s, was zu/
s bzw.\
s wird. Dies hat zwei Vorteile:/
und\
müssen die%
Zeichen s und|
s nicht maskiert werden, um kopiert zu werden./\
, dass die Teilzeichenfolge enthalten ist , die andernfalls durch die vorherigen Manipulationen beschädigt worden wäre./|/\\/
(früher/|/AB\\/
) nun das|
s, woraus das Folgende/%/|//
geworden ist/%/\//
und das%
s entschlüsselt .Programmstruktur in der Endphase
Zu diesem Zeitpunkt hat das Basisprogramm alle seine Ersetzungen ausgeführt, und alles, was übrig bleibt, ist die Programmcodierung der Eingabezeichenfolge.
Jedes eingegebene Zeichen ist zu einem Unterprogramm geworden
(nachfolgende Newline), wobei
*
entwederf
für ein Original/
oderb
für ein Original steht\
./\//xy
am Ende des Programms, der keine Auswirkung hat, außer einen/
für die Ersetzungen des vorherigen Unterprogramms erforderlichen zu liefern .Geteilte Teilzeichenfolge
Bevor die letzte Iteration durch die Unterprogramme beginnt, befindet sich nach dem Unterprogramm jedes Zeichens des Formulars eine Teilzeichenfolge, die die Grenze überschreitet
\//
./
, die die Ersetzungen verankert) ausgeführt wird, um die Zeile dafür auszudrucken Charakter./
die richtige imaginäre "vorherige Zeile" enthält, damit das erste eingegebene Zeichen am Anfang der Zeile gedruckt wird.\\
oder\/
einer neuen Zeile und einer Folge davon/
.Ausführen eines Zeichenunterprogramms
Einige der folgenden Substitutionen enthalten zusätzliche
\
s, um zu verhindern, dass sie einander zugeordnet und entstellt werden (einschließlich anderer Kopien in anderen Unterprogrammen). Dies zu erreichen ist auch der Grund, warum sowohl vonx
alsy
auch benötigt werden./\//xyf\z/
oder/\//xyb\z/
bewirkt, dass/
am Ende der gemeinsam genutzten Teilzeichenfolgexyfz
oder stehtxybz
, unmittelbar nach\/
oder\\
./\\\\x\y/ /
ersetzt\\xy
durch ein Leerzeichen, und die Substitution/\\\/x\y//
ersetzt\/xy
durch nichts.\
oder/
war.\
nächsten, gefolgt vonfz
oderbz
./ \fz/\\\/\//
ersetzt fz
durch\//
und/b\z/\\\\\//
ersetztbz
durch\\/
./
bzw.\
ist./
richtig zu platzieren.///
eine Endlosschleife getroffen./
am Ende der freigegebenen Teilzeichenfolge wieder her.Nachdem das letzte Zeichen-Unterprogramm ausgeführt wurde, bleibt vom Programm Folgendes übrig
/\//xy
. Da dies eine unvollständige Ersetzung mit fehlendem Finale ist/
, wird sie vom Programm übersprungen und normal angehalten.quelle
Jelly , 14 Bytes
Ein vollständiges Programm druckt das Ergebnis aus.
Probieren Sie es online!
Wie?
quelle
Haskell , 49 Bytes
Probieren Sie es online!
quelle
Perl 5 , 44 Bytes
42 Byte Code + 2 für
-F
FlagProbieren Sie es online!
quelle
JavaScript (ES8),
665963 Bytes7 Bytes gespart dank Justin Mariner
+4 Bytes zum Reparieren
/\\/\\/
(von Neil bemerkt )Probieren Sie es online!
quelle
MATL ,
231918 BytesDank @Sanchises 1 Byte weniger
Die Eingabe ist eine Zeichenfolge in einfachen Anführungszeichen.
Probieren Sie es online! Oder überprüfen Sie die Testfälle: 1 , 2 , 3 .
Erläuterung
Betrachten Sie die Eingabe
'\\\//\/\\'
als Beispiel.quelle
C # (.NET Core) ,
748882787776 + 18 Byte-1 Byte dank Kevin Cruijssen
Gibt eine Sammlung von Zeichenfolgen aus, eine für jede Zeile. Die Byteanzahl umfasst auch:
Probieren Sie es online!
Erklärung für die 77-Byte-Antwort:
quelle
/\\/\\/
.s.Take(i).Sum(y=>y<92?-1:1)+(x-s[0])/45+1
auf(x-s[0])/45-~s.Take(i).Sum(y=>y<92?-1:1)
05AB1E , 14 Bytes
Probieren Sie es online!
Erläuterung
quelle
/\\/\\/
.Ç¥.¥0<.SηOv¹Nèy<ú,
Schluchzen in binärenR ,
122121 Bytes-1 Byte danke an Giuseppe
Probieren Sie es online!
Mit zusätzlichem Leerzeichen:
Erläuterung: Diese Antwort basiert auf der Beobachtung, dass sich die Anzahl der führenden Leerzeichen in jeder Zeile um -1 ändert, zuzüglich der Anzahl
/
in der vorherigen und der aktuellen Zeile.Wenn wir N Schrägstriche haben, ist die Variable
y
ein Vektor der Länge N,\
ansonsten 1 für jede Position mit , 0. Daher berechnen wir, um die Änderung der Anzahl der führenden Leerzeichen pro Zeile zu erhalteny[1:(N-1)] + y[2:N] - 1
. Die Funktiondiffinv
konvertiert diese Differenzen in eine Sequenz, beginnend mit 0. Der Rest ist nur eine Frage der Zusammenstellung jeder Zeile als die erforderliche Anzahl von nachgestellten Leerzeichen, gefolgt von dem entsprechenden Schrägstrich und einer neuen Zeile.quelle
diffinv
;) Auch Sie könneny=x>")"
für -1 Byte einstellenstrsplit
, was immer tödlich ist. Sie können auch die berühmten nutzendiffinv
!library(methods)
in den Header setzen (was ohne Strafe OK sein sollte, da dieses Paket Teil Basis R ist), können Sie verwendenel
. Auch stelltediffinv
sich heraus, dass es genauso lang ist wiecumsum
! :)*S
bringt alles durcheinander.Brain-Flak , 175 Bytes (174 Zeichen + 1 Flag)
Laufen Sie mit
-c
Flagge.Probieren Sie es online!
Erläuterung
quelle
Ruby ,
8076 Bytes-4 Bytes dank Handarbeit
Probieren Sie es online!
Erläuterung:
quelle
.each_cons(2){…}
. In Änderung können Sie durch Ersetzen von.each_char
→ speichern.chars
.i+=
an den Anfang des verschachtelten ternären Ausdrucks springen und ihn mit beenden-1:1:0
.Java 8,
121118110109102 Bytes-7 Bytes dank der bitweisen Magie von @Nevay . :)
Erläuterung:
Probieren Sie es hier aus.
quelle
a->{String r="";int s=0,p=0,i;for(char c:a){for(i=s+=p+(p=c-63)>>5;i-->0;r+=" ");r+=c+"\n";}return r;}
>>
/>>>
/<<
...&
|
~
^
C (GCC)
13713497 BytesProbieren Sie es online!
• 3 Bytes dank ATaco
• 37 Bytes dank Digital Trauma & ThePirateBay
Nichts Besonderes, nur eine einfache rekursive Funktion, die einen String verwendet und die Schrägstriche ausgibt. Beachten Sie, dass die Eingabe zuerst die umgekehrten Schrägstriche überschreiben muss.
Verwendungszweck
Ungolfed
Dies ist die alte Antwort. Sehen Sie sich den Link online ausprobieren für eine aktualisierte Antwort an!
Ausgabe
quelle
c=='\0'
mit!c
für den gleichen Effekt ersetzen .printf("%*s%c", n, "", c)
das Zeichen mit n führenden Leerzeichen drucken?(c!=n)
mitc-n
und Neuanordnung ternäre Ausdrücke. Gleiche mit(c=='/')
. Sie können auch durch eine'/'
Literalnummer ersetzen47
. Ich denke, es sind insgesamt 7 Bytes.C 60 Bytes
Probieren Sie es online!
quelle
Netzhaut , 47 Bytes
Probieren Sie es online! Link enthält Testfälle. Erläuterung:
Fügen Sie am Anfang jeder Zeile und vor jeder Zeile ein Leerzeichen ein
\
.Betrachten Sie die ersten beiden Zeichen der Zeichenfolge. Wenn der erste ein
/
ist, muss der Einzug dekrementiert werden. Dies wird erreicht, indem der vorhergehende Bereich in das Capture aufgenommen wird (der immer vorhanden ist, weil die erste Stufe ihn hinzugefügt hat). Wenn die Sekunde eine\\
ist, muss sie inkrementiert werden. Dies wird durch Einbeziehen des Speicherplatzes erreicht, den die erste Stufe dem Capture hinzugefügt hat. Nachdem das zweite Zeichen den richtigen Einzug erhalten hat, wird die Stufe für das zweite und dritte Zeichen usw. wiederholt.Entfernen Sie den zusätzlichen Einzug.
Ich habe eine 94-Byte-Version geschrieben, die (wie meine Charcoal-Antwort) eine beliebige Kombination von Schrägstrichen zulässt: Probieren Sie es online aus! Erläuterung:
Bringe den Ball ins Rollen, indem du den letzten Schrägstrich nimmst und ihn an derselben Position in seiner eigenen Linie einrückst.
Stellen Sie allen Schrägstrichen ein Leerzeichen voran, damit sie erfasst werden können.
Nehmen Sie wiederholt den letzten Schrägstrich der Eingabe und richten Sie ihn in einer eigenen Zeile an dem Schrägstrich in der Zeile darunter aus.
Löschen Sie alle verbleibenden Einrückungen.
Löschen Sie die jetzt leere Eingabe.
quelle
Lua , 96 Bytes
Probieren Sie es online!
Das kürzeste, das ich in Lua finden konnte. Die Eingabe erfolgt über die Befehlszeile.
Dies erfordert einige Tricks:
(...):gmatch(
Dies sollte die kürzeste Form sein, um einen einzelnen String von der Kommandozeile in ein Lua-Programm zu bekommen. Der
...
Ausdruck in Lua erfasst alle überschüssigen Parameter einer Funktion, die nicht in der Funktionsdeklaration angegeben sind, und wird für varargs verwendet. Da der Hauptteil eines Lua-Programms als Funktion mit den Befehlszeilenargumenten als Parametern aufgerufen wird, enden die Befehlszeilenargumente in...
.Die umgebenden Klammern verwandeln den potenziell mehrwertigen
...
Ausdruck in einen einwertigen Ausdruck. Betrachten Sie dieses (etwas überraschende) Beispiel:and
/or
für "wenn x dann Wert1 sonst Wert2" Logik.Der
and
Operator von Lua gibt das erste Argument zurück, wenn es falsch ist. Andernfalls wird das zweite Argument zurückgegeben. Deror
Operator gibt das erste Argument zurück, wenn es wahr ist. ansonsten das zweite Argument.p
benötigt keine Initialisierung.p==s
muss im ersten Durchlauf der Schleife immer false sein, unabhängig von der Eingabe. Wenn Siep
vor dem Eintritt in die Schleife (Verlassen der Schleifenil
) keinen Wert einstellen, geschieht dies und es werden auch Bytes gespart.Kann jemand Golf spielen (in Lua)?
quelle
c=0(...):gsub(".",function(s)c=c+(p==s and(s=="/"and-1or 1)or 0)p=s print((" "):rep(c)..s)end)
gmatch(".")
,gmatch"."
wie Sie es in Ihrer nächsten Antwort getan haben.Pyth , 28 Bytes
Probieren Sie es online!
quelle
Q
statt:j.u+?qeNY?>Y\/+PNdPPNPNYtQh
.R , 119 Bytes
Probieren Sie es online!
Dies unterscheidet sich etwas von der Antwort von user2390246 . Sie durchlaufen jeweils die Zeichenfolge und geben eine bestimmte Anzahl von Leerzeichen und dann das entsprechende
/\
Zeichen aus.Ich habe jedoch vermieden, die Zeichenfolge zu teilen, und stattdessen die Zeichen durch den UTF-8-Codierungswert ersetzt, sodass ich direkt mit den Zahlen rechnen kann, was mir nur ein paar Bytes erspart hat.
quelle
diffinv
definitiv nicht funktionieren.C # (.NET Core) , 60/65 Byte
Ich habe versucht kürzere C # -Version
wie gesagt: "Das bedeutet auch, dass jede Eingabe mit einem Backslash beginnt." Oder etwas länger welche lösen ab "/"
Probieren Sie es online!
quelle
Lua ,
8884 BytesVerbesserte Version (-4 Bytes dank QuertyKeyboard)
Probieren Sie es online!
Originalversion (88 Bytes)
Ein weiterer Versuch in Lua, diesmal mit einem völlig anderen Ansatz, bei dem anstelle einer Zählervariablen die Zeichenfolge manipuliert wird.
Ungolfed:
Es gibt eine interessante Sache im Code:
(...):gmatch"."
Hier werden einige Macken im Lua-Parser verwendet. Wenn Lua auf einen Code im Formular stößt
func "string"
, wird dieser in konvertiertfunc("string")
. Dies ist so, dass man schreiben kann,print "string"
um eine konstante Zeichenfolge zu drucken, und es funktioniert nur mit einem einzelnen Zeichenfolgenliteral nach der Funktion. Alles andere führt zu einem Syntaxfehler. Dieser syntaktische Zucker funktioniert jedoch auch mit Funktionsaufrufen in der Mitte eines Ausdrucks, und überraschendererweise funktioniert er gut mit dem:
Methodenaufruf syntaktischer Zucker. Also wird Lua den Code am Ende so interpretieren:Wenn jemand eine Möglichkeit findet, einen der drei gsub-Aufrufe zu entfernen, teilen Sie mir dies bitte mit.quelle
s=""g=s.gsub g(...,".",function(c)s=g(g(g(s,"\\"," "),"/?$",c)," /","/")print(s)end)
Pyth - 33 Bytes
Erster Versuch, wird Golf spielen.
Probieren Sie es hier online aus .
quelle
Perl, 40 + 2 Bytes
Du brauchst die
-F
Flagge.quelle
Perl,
3438 + 1 Bytesdie beiden Fälle zu behandeln
mit
-p
Option ausgeführt werdenBEARBEITEN: Der folgende Kommentar funktioniert nicht, wenn das erste Zeichen ist
/
Die Ausgabe wird jedoch um ein Zeichen nach rechts verschoben, wenn das erste Zeichen steht
\
quelle
/\\/\\/
.34
Lösung jetzt vollkommen gültigVBA (Excel), 181 Bytes
quelle
[...]
Notation verwenden: Ich habe es auf 128 Bytes reduziertSub q
For x=1To[Len(A1)]
c=Mid([A1],x,1)
If c="\"Then Debug.?b;c:b=b+" "
If c="/"Then b=Left(b,Len(b)-1):Debug.?b;c
Next
End Sub
Pyth ,
2421 BytesPort aus Rods Antwort .
Probieren Sie es online!
quelle
\
. Übrigens, wo ist dein Code?SOGL V0.12 ,
1613 BytesProbieren Sie es hier aus! - erwartet die Eingabe auf dem Stapel, so dass für die Benutzerfreundlichkeit
,
hinzugefügt wirdquelle
Dyalog APL, 31 Bytes
Probieren Sie es hier aus!
quelle
{↑⍵↑¨⍨a-1-+\¯1*a←⍵='\'}