Beenden Sie die Tabs gegen Space War
Es gab also viele Diskussionen darüber, ob Tabulatoren oder Leerzeichen zum Einrücken / Formatieren von Code verwendet werden sollen. Können Sie der Universität helfen, den Streit beizulegen, indem Sie eine unglaublich verrückte und einzigartige Formatierungsmethode anwenden?
Ihre Aufgabe ist es, ein vollständiges Programm oder eine Funktion zu schreiben, die alle Tabulatoren in vier Leerzeichen erweitert. Und ersetzt dann eine Folge von n führenden Leerzeichen durch "/ (n - zwei Sterne hier) /". Sie erhalten Eingaben über mehrere Zeilen in jedem vernünftigen Format (einzelnes String-Array von Strings für jede neue Zeile. Spalten-Array usw.).
Probeneingabe schamlos gestohlen . Beachten Sie, dass, da Tabulatoren in SE automatisch auf vier Leerzeichen erweitert werden, ich sie als "^" -Zeichen repräsentiere, Sie jedoch auch Tabulatoren (Codepunkt 0x09) behandeln müssen. Alle "^" Zeichen stehen für eine Tabellierung.
Calculate the value 256 and test if it's zero
If the interpreter errors on overflow this is where it'll happen
++++++++[>++++++++<-]>[<++++>-]
+<[>-<
Not zero so multiply by 256 again to get 65536
[>++++<-]>[<++++++++>-]<[>++++++++<-]
+>[>
# Print "32"
++++++++++[>+++++<-]>+.-.[-]<
<[-]<->] <[>>
# Print "16"
+++++++[>+++++++<-]>.+++++.[-]<
<<-]] >[>
# Print "8"
++++++++[>+++++++<-]>.[-]<
<-]<
# Print " bit cells\n"
+++++++++++[>+++>+++++++++>+++++++++>+<<<<-]>-.>-.+++++++.+++++++++++.<.
>>.++.+++++++..<-.>>-
Clean up used cells.
[[-]<]l
^this is preceded by a tab
^^two tabs
^^^three tabs etcetera!
Beispielausgabe
Calculate the value 256 and test if it's zero
If the interpreter errors on overflow this is where it'll happen
++++++++[>++++++++<-]>[<++++>-]
+<[>-<
/**/Not zero so multiply by 256 again to get 65536
/**/[>++++<-]>[<++++++++>-]<[>++++++++<-]
/**/+>[>
/******/# Print "32"
/******/++++++++++[>+++++<-]>+.-.[-]<
/**/<[-]<->] <[>>
/******/# Print "16"
/******/+++++++[>+++++++<-]>.+++++.[-]<
<<-]] >[>
/**/# Print "8"
/**/++++++++[>+++++++<-]>.[-]<
<-]<
# Print " bit cells\n"
+++++++++++[>+++>+++++++++>+++++++++>+<<<<-]>-.>-.+++++++.+++++++++++.<.
>>.++.+++++++..<-.>>-
Clean up used cells.
[[-]<]l
/**/this is preceded by a tab
/******/two tabs
/**********/three tabs etcetera!
Da die Universität Speicherplatz zum Herunterladen von Vim und Emacs benötigt, dürfen Sie nur sehr wenig Speicherplatz für Ihren Code verwenden. Daher ist dies Codegolf und der kürzeste Code gewinnt. Sie können davon ausgehen, dass die Eingabe korrekt ist und Zeilen mit weniger als vier Leerzeichen (nach dem Ersetzen von Tabulatoren) zu undefiniertem Verhalten führen können.
Haftungsausschluss
Diese "ausgezeichnete" Formatierungsstrategie wurde mit freundlicher Genehmigung von Geobits erstellt und mit seiner Erlaubnis reproduziert. Bei der Erstellung dieser Herausforderung wurden keine Programmierer verletzt.
quelle
/*
, oder kann dies als nicht "wohlgeformter Eingang" angesehen werden? Eine C ++ - Quelldatei wäre ein besserer Test gewesen, da der mehrzeilige Kommentar/* */
möglicherweise einige Antworten unterbrechen würde, die das erste und das letzte der führenden Leerzeichen durch ein ersetzen/
und dann Leerzeichen füllen*
./* */
C ++ - Code vor, diesmal jedoch am Anfang der Zeile. Entsprechend Ihrer Spezifikation sollte es so belassen werden, wie es ist. Hier ist die Falle, und es wurden bereits falsche Antworten gefunden, dass ein regulärer Ausdruck, der/\** /
verwendet wird, um diese Leerzeichen zwischen // mit Sternchen zu füllen, die Zeile in umwandeln würde/***/
. Ich habe diese Konvertierung auch gesehen/*//*/
. Ich gehe davon aus, dass beide falsch sind.Antworten:
V ,
21, 20 BytesProbieren Sie es online!
Dies ist buchstäblich nur ein direkter Teil meiner vim Antwort. Die bemerkenswerten Unterschiede:
Der
Í
Befehl (Globaler Ersatz) füllt das/g
Flag automatisch aus , wodurch zwei Bytes eingespart werdenô
ist identisch mit\t
Î
Ist eine Mnemonik für:%norm
und füllt auch den erforderlichen Abstand zwischen:%norm
und den Tastenanschlägen aus.Der abschließende Wagenrücklauf am Ende wird implizit hinzugefügt.
quelle
Vim,
37, 34, 33,32 BytesProbieren Sie es online!
Beachten Sie, dass dies einen abschließenden Wagenrücklauf (Enter) in vim erfordert, jedoch nicht im Online-Interpreter.
Dies verwendet den V-Interpreter, da er abwärtskompatibel ist. Eine sehr einfache Lösung.
Hier ist ein GIF, mit dem Sie die Lösung in Echtzeit sehen können. Dies verwendet eine etwas ältere Version, und ich habe einige zusätzliche Tastenanschläge hinzugefügt, um die Ausführung zu verlangsamen, damit Sie sehen können, was passiert:
Und hier ist die Erklärung, wie es funktioniert:
quelle
g
aber dann haben Sie bearbeitet, um g: / +1 trotzdem nicht zu verwenden: D:g
weil sie eine weniger bekannte Funktion missbraucht: Dernorm
Befehl wird abgebrochen, wenn er^F<space>
fehlschlägt. Ist:%norm ^F<space>foo
also im Wesentlichen dasselbe wie:g/^ /norm foo
lustige Vim-Hacks. : Dnorm
?^F
keine<C-f>
Silly Vim- Tastennotation . In diesem Fall ist es^
, zum ersten Nicht-Leerzeichen zu springen undF<space>
das erste Leerzeichen hinter dem Cursor zu finden.Perl, 41 Bytes
Laufen Sie mit der
-p
Flagge wie folgt:␉
Durch einen Tabulator ersetzen (in Bash versuchen Sie, etwas einzugeben Control-V Tab.)quelle
perl
und Weise , wie diese Rückbeziehung an Ort und Stelle ersetzt wurde, hätte ich mir auch gewünschtsed
.Cheddar ,
605756 Bytes3 Bytes gespart dank @Conor O'Brien
Ich wünschte, Cheddar hätte eine bessere String-Formatierung.
Probieren Sie es online!
Erläuterung
Dies ist eine Funktion.
@
ist eine funktionalisierte Eigenschaft (z. B. ruby's&:
), mit der Sie Folgendes ausführen können: `ar.map (@. head (-1))Wenn Sie mit Regex nicht vertraut sind:
Dies stimmte im Grunde mit einem oder mehreren (
+
) Leerzeichen () am Anfang (
^
) jeder (g
) Zeile (m
) überein .quelle
/^ +/
als Regex genügt, da davon ausgegangen werden kann, dass die führenden Leerzeichen mindestens 4 lang sind.Mathematica, 97 Bytes
Anonyme Funktion. Nimmt einen String als Eingabe und gibt einen String als Ausgabe zurück.
quelle
Python 3, 124 Bytes
Benutzt guten alten Regex.
Ideone es!
quelle
Java
210207 BytesDies ist die Referenzlösung, die sie naiv implementiert.
quelle
for(int j=0;++j<i-1;)
. Sie können aber auch das Entfernenint
vorj
und legte es nach dem bereits int:int i=s.length()-(x=s.replaceAll("^\\s+", "")).length(),j;
JavaScript ES6, 75 Byte
Ersetzen
\t
Sie den Code durch einen wörtlichen Tabulator.quelle
Java,
185184167152 BytesAngesichts der sehr losen Definition des String-Arrays im ersten Beitrag habe ich verwendet,
Stream<String>
was einige konsequente Byte-Einsparungen ermöglicht.Ich habe andere Techniken als die RI verwendet, um das gleiche Ziel zu erreichen. Der Algorithmus selbst ist eher der gleiche.
Testen und ungolfed :
quelle
Retina , 25 Bytes
Das
\t
sollte durch ein tatsächliches Tabulatorzeichen (0x09) ersetzt werden.Probieren Sie es online!
Erläuterung
Ersetzen Sie jede Registerkarte durch vier Leerzeichen.
Transformieren jede Zeile einzeln (
%
) durch Abgleichen2+N
Leerzeichen am Anfang der Zeile und ersetzt sie mit/.../
denen...
sindN
Kopien*
.quelle
Python,
125111 Byteshttps://repl.it/DGyh/2
quelle
SED (56 + 1 für -r) 57
Wo
⇥
ist ein Tabulator?1. Ersetzt Tabulatoren durch Leerzeichen.
2. Ersetzt das erste und letzte führende Leerzeichen durch
/
.3. Ersetzt das erste Leerzeichen nach
/
und 0+*
durch ein,*
bis keine Übereinstimmung mehr vorliegt.quelle
-f
. Alle zusätzlichen Flags, die wie n oder r verwendet werden, sollten als jeweils ein Byte gezählt werden. Sie sparen hier also 2 Bytes.;
Befehl nach dem t ist ebenfalls nicht erforderlich. Für den Code selbst benötigen Sie ein ^ am Anfang des drittens
Befehls, andernfalls wird eine Eingabe wie diese "3/5" in "3 / * 5" umgewandelt. Im erstens
Befehl befindet sich tatsächlich ein Tabulator, der jedoch nicht korrekt angezeigt und irreführend ist. Verwenden Sie daher entweder \ t oder geben Sie an, dass char ein Tabulator war.Die Universität soll ein bisschen mehr Platz für Programme in Emacs Lisp (oder Standard prüfen , so dass
tabify
unduntabify
allein), wie sie noch mehr bekommen ausführlicher als Java. Es sollte auch Schülern (oder Lehrern), deren Identifizierungsgröße kleiner als vier ist oder die in einer nicht-C-ähnlichen Sprache codieren, besondere Aufmerksamkeit geschenkt werden.Die folgende Lösung hat 206 Bytes
Unter der Annahme, dass dies
tab-width
nicht explizit festgelegt werden muss, können wir 20 davon speichern.Und ungolfed Version würde so aussehen
Wir begeben uns zuerst in
untabify
die Region, bevor es losgeht. Während am Anfang einer Zeile ein Leerzeichen angezeigt wird, wird dieses durch einen Kommentar ersetzt, der so lang ist wie das angegebene Leerzeichen. Um genau zu sein, wird der einzufügende Kommentar von konstruiertdie selbst nimmt 97 Bytes. Eine kürzere Lösung zum n-maligen Kopieren von Zeichenfolgen wird sehr geschätzt.
quelle
Ruby,
5247 + 1 (p Flag) = 48 BytesBearbeiten : ganze 5 Bytes dank Value Ink gespeichert
quelle
p
Flag verwenden, um die Tatsache auszunutzen, dass (g) sub$_
den gedruckten Wert ändert und somit ändert?ruby -pe 'gsub ?\t," "*4;sub(/^ +/){?/+?**($&.size-2)+?/}'
(g)sub
ohne dass sich$_
hier etwas ändern lässt .GNU sed,
6664 + 1 (r Flag) = 65 BytesEdit: 1 Byte weniger dank Rileys Vorschlag.
Führen Sie Folgendes aus : sed -rf formatter.sed eingabedatei
Der Grund für die mit einer Trennung
\n
vom Rest des Textes auf dieser Linie die führenden Leerzeichen, ist , weil sonst ein C ++ Zeile mit einem Kommentar wie dieser Start/* */
wäre wiederum in/*****/
durch eine einfachere Linie 4 wies,^(/\**) ,\1*,
oder sogars,^(/\**) ( */),\1*\2,
. Da sed das Skript für jede Eingabezeile ausführt,\n
wird beim Lesen no in den Musterraum eingefügt.quelle
/
Sie den Abschluss erst eingeben, wenn Sie den ersetzen\n
. Das erspart Ihnen den Abgleich in Zeile 4.\t
ein Tabulatorzeichen ersetzen .