Heilige Kriege wurden um Leerzeichen und Tabulatoren geführt. (Und natürlich haben Räume gewonnen, die objektiv überlegen sind.) - Alex A.
S ome peo p le noch weigern , zu einem ccept dass WHI c h cl e arly s upreme. Sie haben gerade erhalten eine Datei mit dem incor re ct, b Anzeige und inf e rior Form von WHI t espace, und jetzt t er cont e nts der Datei ein r e verdorben und ruiniert.
Sie können der Person, die die Datei an Sie gesendet hat, auch zeigen, wie falsch sie ist - und zwar mit Gewalt.
Beschreibung
Wie der Titel schon sagt, besteht Ihre Herausforderung darin, eine Datei zu erstellen, die eine oder mehrere Registerkarten enthält:
this is an evil tab onoes
und sie rücksichtslos in Stücke zerschmettern:
this is an evil tab
o
n
o
e
s
Beachten Sie, dass die Stack Exchange-Software Literal-Registerkarten in vier Leerzeichen umwandelt (weil es richtig ist), sodass Registerkarten in diesem Beitrag als vier Leerzeichen angezeigt werden. Die Eingabe in Ihr Programm enthält jedoch die eigentlichen Registerkarten.
Herausforderung
Die Lösung sollte eine einzelne Zeichenfolge als Eingabe verwenden, die druckbare ASCII-Zeichen, Zeilenumbrüche und Tabulatoren enthalten kann. In der Eingabe ist immer mindestens ein Tab enthalten.
Die Ausgabe sollte dieselbe Zeichenfolge sein und die folgenden Regeln enthalten:
Starten Sie den Cursor bei Koordinaten (0,0) und mit einer Richtung nach rechts. Die Koordinaten sind (Spalte, Zeile), mit einem Index von Null, und in welche Richtung soll der Cursor nach dem Drucken eines Zeichens bewegt werden.
Für jedes Zeichen in der Zeichenfolge:
Wenn es sich um eine neue Zeile handelt, gehen Sie zu den Koordinaten (0, n), wobei n die Anzahl der neuen Zeilen in der Zeichenfolge ist (einschließlich dieser), und setzen Sie die Richtung nach rechts zurück.
Wenn es sich um eine Registerkarte handelt, geben Sie zwei Leerzeichen aus, drehen Sie den Cursor um 90 Grad im Uhrzeigersinn und geben Sie zwei weitere Leerzeichen aus, wodurch die Registerkarte in zwei Hälften geteilt wird. Hier ist ein visuelles Beispiel, in dem eine Registerkarte als
--->
und Leerzeichen als dargestellt wird·
:foo--->bar--->baz
wird
foo··· · b a r · · zab··
Ansonsten geben Sie einfach das Zeichen am Cursor aus und bewegen den Cursor einen Schritt in die aktuelle Richtung.
Da Sie die Zeichenfolge von Anfang bis Ende lesen, müssen Sie möglicherweise "über" vorhandene Zeichen schreiben. Dies ist in Ordnung. Zum Beispiel die Eingabe
foo--->bar
spaces are superior
sollte zu einer Ausgabe von führen
foo
b
spaces are superior
r
Sie können wählen, ob "kaputte Tabulatoren" andere Zeichen überschreiben sollen - die ursprüngliche Absicht war, dass sie dies nicht tun, aber die Spezifikation war nicht eindeutig. Dies ist also Ihre Entscheidung.
Nachdem Sie diese Regeln angewendet haben, können Sie dies auch tun
Fügen Sie so viele Leerzeichen hinzu oder entfernen Sie sie, wie Sie möchten.
Fügen Sie maximal eine einzelne nachgestellte Zeile hinzu.
Die Eingabe enthält niemals nachgestellte Leerzeichen. Es wird auch niemals führende oder nachfolgende Zeilenumbrüche enthalten. Sie können auch immer davon ausgehen, dass Sie niemals in eine Spalte oder Zeile schreiben müssen, die kleiner als 0 ist (dh außerhalb des Bildschirms).
Testfall
Tabs werden in diesem Testfall so dargestellt, --->
weil sie sonst von SE verschlungen werden.
Eingang:
Test case. Here's a tab--->there's a tab--->everywhere a tab--->tab--->this is some more text
blah
blah
blah blah blah blah blah blah--->blaah--->blaah--->blah--->blaaaaah--->blah--->blah--->blah--->blah--->blah
Ausgabe:
Test case. Here's a tab
blah
blah t
blah blah blah blah blah blah
blaablah
r b
e l b
h 'h a l
a sa a a
l l h h
this is some mobe tbxt
haalhalb
b a
a b
t
bat a erehwyreve
Ausgefallene Animation:
Regeln
- Das ist Code-Golf , also gewinnt der kürzeste Code in Bytes!
quelle
(0,0)
müssen wir dann zuerst die Konsole leeren, oder meinen Sie damit nur die Standardposition des Cursors?Antworten:
MATLAB, 144 Bytes
Die Waffe der Wahl für den Umgang mit Strings ist natürlich eine Sprache, die für die Manipulation von Zahlen entwickelt wurde. Scherz beiseite, das Tolle an Matlab ist, dass es egal ist, ob Sie ein Array außerhalb der Grenzen zuweisen: Es wird einfach eine größere Matrix erstellen. Darüber hinaus wird das Standardmatrixelement
0
als Leerzeichen anstelle eines innull
der ASCII-Spezifikation vorgeschriebenen Zeichens gerendert .Tabulatoren sind einfach ein Sprung in die Koordinaten, sodass für einen Tabulator keine Leerzeichen ausgegeben werden.
Ich habe mit 209 Bytes angefangen, aber das meiste davon wurde durch vorsichtiges Golfen beseitigt. Dieser Code enthält viele Wiederholungen, daher habe ich einige Versuche durchgeführt, welche Alternativen am besten funktionieren. Ich denke, es gibt nicht viel Raum für mehr Optimierung mit diesem Code, aber ich bin immer froh, wenn ich mich als falsch erweisen kann. Edit: Tom Carpenter hat es geschafft, mir das Gegenteil zu beweisen. es gelang ihm, 9 Bytes zu speichern, die ich optimierte, um satte 29 Bytes zu speichern. Letztes Byte, das gespeichert wurde, wenn keine Steuerzeichen (ASCII <9) in der Eingabe vorhanden sind - MATLAB-Zeichenfolgen werden nicht abgeschlossen
null
.quelle
q('hello<tab>my name<tab>is tom<tab>c')
, aber es ist etwas in der Art vonAttempted to access o(11,-2); on line 7
. Dies hat möglicherweise mehr mit einem Problem in der Frage zu tun - wenn der Cursor rückwärts zeigt und über die erste Spalte hinausgeht, was mit dem Rest der Zeile geschieht.d
Variable und stattdessen vier Variablen, welche für eine Schleife , die [1 0 -1 0] Muster zu machen als solche:function o=q(t) u=1;v=0;w=-1;z=0;x=0;y=1;n=1;for s=t if s==9 x=x+2*u-2*v;y=y+2*v+2*u;a=z;z=w;w=v;v=u;u=a;elseif s==10 n=n+1;x=0;y=n;else x=x+u;y=y+v;o(y,x)=s;end end
(natürlich in den Kommentaren wobei alle Linien entfernt, so dass Sie werden um es wie deine neu zu formatieren, um zu sehen, was ich getan habe)Python 3,
272270266262255253244 BytesDas
\t
sollte ein tatsächliches Tabulatorzeichen sein.Der Code funktioniert ähnlich wie die Antwort von Zach Gates
M
By-M
Grid in demM
die Summe der Linienlängen angegeben ist. (Das ist ein riesiger Überschuss, aber der Code wird kürzer.) Anschließend werden die Zeichen durchlaufen, an den richtigen Stellen platziert und die unterste besuchte Zeile verfolgt. Schließlich werden alle Zeilen bis zu dieser Zeile gedruckt.Die Ausgabe enthält (normalerweise sehr viele) nachgestellte Leerzeichen und eine nachgestellte Zeile.
quelle
Javascript (ES6),
264245 BytesVersuchte den Ansatz "Erstellen Sie ein riesiges Raster aus Leerzeichen, füllen und trimmen", der 19 Byte kürzer als der andere endete.
Indem Sie die vorletzte Zeile wie folgt ändern, können Sie die große Anzahl von Leerzeichen in jeder Zeile entfernen:
Probieren Sie es hier aus:
Code-Snippet anzeigen
Erklärung folgt in Kürze; Vorschläge willkommen!
quelle
JavaScript (ES6), 180
183Unter Verwendung von Vorlagenzeichenfolgen gibt es einige Zeilenumbrüche, die signifikant und gezählt sind.
Dies ist eine Funktion, die die angeforderte Ausgabe zurückgibt (aufgefüllt mit Tonnen von nachgestellten Leerzeichen).
Es gibt wenig zu erklären: Die Zeilen werden nach Bedarf erstellt. Es gibt keine Richtungsvariable, nur den 2-Versatz für x und y, da sie bei Drehung im Uhrzeigersinn einfach verwaltet werden können:
dx <= -dy, dy <= dx
Testen Sie das folgende Snippet in Firefox
quelle
Python 2,
370369368 BytesVielen Dank an @sanchises und @ edc65 , die mir jeweils ein Byte gespart haben.
Es erzeugt das größtmögliche Gitter und durchläuft dann zeichenweise die Schaltrichtung auf jeder Registerkarte.
quelle
if !d
undif d>2
!d
ist keine gültige Syntax. @sanchises Danke für dend>2
Tipp.d==0
->d<1