Wir haben schon jetzt gelernt, wie man einen String aus seinen Räumen entfernt.
Als richtige Herren / Damen sollten wir uns jedoch lieber ausziehen .
Das Ausziehen einer Saite ist dasselbe wie das Abziehen, nur empfindlicher. Anstatt alle führenden und nachfolgenden Leerzeichen gleichzeitig zu entfernen, entfernen wir sie nacheinander . Wir wechseln auch zwischen Vor- und Nachlauf, um keine Schritte zu verbrennen.
Beispiel, beginnend mit " codegolf "
(fünf führende und nachfolgende Leerzeichen):
codegolf
codegolf
codegolf
codegolf
codegolf
codegolf
codegolf
codegolf
codegolf
codegolf
codegolf
Zuerst den String unverändert ausgeben. Geben Sie dann jeden Schritt aus. Entfernen Sie zunächst ein vorangestelltes Leerzeichen (falls zutreffend - siehe Regel 2).
Die Eingabe kann eine unterschiedliche Anzahl von führenden und nachfolgenden Leerzeichen enthalten. Wenn Sie auf der einen Seite keine freien Stellen mehr haben, ziehen Sie die andere Seite weiter aus, bis die Schnur leer ist.
Die Eingabe darf keine führenden oder nachfolgenden Leerzeichen enthalten. Wenn dies der Fall ist, geben Sie es so aus, wie es ist.
Verwenden Sie die Standard-E / A-Methoden von PPCG . PPCG Default Lücken sind verboten.
Undefiniertes Verhalten bei leerer Eingabe oder Eingabe, die nur Leerzeichen enthält, ist in Ordnung.
Sie können davon ausgehen, dass die Zeichenfolge nur Zeichen aus dem druckbaren ASCII-Bereich (
0x20
bis0x7E
) enthält.
Beispiele - Leerzeichen werden .
zur besseren Lesbarkeit durch Punkte ersetzt :
4 leading spaces, 5 trailing: "....Yes, Sir!....."
....Yes, Sir!.....
...Yes, Sir!.....
...Yes, Sir!....
..Yes, Sir!....
..Yes, Sir!...
.Yes, Sir!...
.Yes, Sir!..
Yes, Sir!..
Yes, Sir!.
Yes, Sir!
6 leading, 3 trailing: "......Let's go golfing..."
......Let's go golfing...
.....Let's go golfing...
.....Let's go golfing..
....Let's go golfing..
....Let's go golfing.
...Let's go golfing.
...Let's go golfing
..Let's go golfing
.Let's go golfing
Let's go golfing
0 leading, 2 trailing: "Hello.."
Hello..
Hello.
Hello
0 leading, 0 trailing: "World"
World
21 leading, 5 trailing: ".....................a....."
.....................a.....
....................a.....
....................a....
...................a....
...................a...
..................a...
..................a..
.................a..
.................a.
................a.
................a
...............a
..............a
.............a
............a
...........a
..........a
.........a
........a
.......a
......a
.....a
....a
...a
..a
.a
a
Ein Gentleman / eine Dame ist prägnant, daher gewinnt die kürzeste Antwort in Bytes .
0x20
bis0x7E
) verarbeiten. Die anderen sind Undefiniertes Verhalten." test\r "
oder auch" \v test"
nicht geben.".....................a....."
? Wenn ja, schlage ich vor, es hinzuzufügen, da einige Antworten diese Art von Test nicht zu bestehen scheinen. (Punkte sind für eine bessere Lesbarkeit natürlich)Antworten:
Netzhaut , 26 Bytes
Probieren Sie es online! (Die Testsuite verwendet aus Gründen der Übersichtlichkeit Punkte. Fußzeile und Kopfzeile konvertieren sie in und aus Leerzeichen für den Hauptcode.)
Erläuterung
Es wäre schön, wenn wir einfach abwechselnd ein vorangestelltes und ein nachgestelltes Leerzeichen löschen und jedes Mal das Zwischenergebnis ausdrucken könnten. Das Problem ist, dass Retina derzeit nicht bedingt drucken kann, sodass dieses Zwischenergebnis sogar gedruckt wird, wenn keine führenden oder nachgestellten Leerzeichen mehr vorhanden sind und Duplikate generiert werden. (Retina 1.0 erhält eine Option, die das Ergebnis nur ausgibt, wenn der String durch die Operation geändert wurde, aber wir sind noch nicht da ...)
Stattdessen bauen wir eine einzelne Zeichenfolge auf, die alle Zwischenergebnisse enthält und die am Ende gedruckt wird.
Die
{
beiden Programmphasen werden in eine Schleife eingebunden, die so lange wiederholt wird, bis sich die Zeichenfolge nicht mehr ändert (dh, es sind keine führenden / nachfolgenden Leerzeichen mehr vorhanden). Die Bühne selbst vergleicht ein führendes Leerzeichen in der letzten Zeile des Strings und in dieser letzten Zeile und schreibt dann das Match sowie das Zeug nach dem Leerzeichen in einer neuen Zeile zurück (wodurch das führende Leerzeichen in der Kopie entfernt wird).Das Entfernen des nachgestellten Leerzeichens ist etwas einfacher. Wenn wir nur das letzte Leerzeichen abgleichen, können wir auf das Zeug davor (in derselben Zeile) zugreifen, mit
$%`
dem eine zeilenbewusste Variante der Präfixersetzung vorliegt$`
.quelle
Python 2 ,
12210710310298959391908887 ByteProbieren Sie es online!
Python 3 ,
97959390 BytesProbieren Sie es online!
quelle
s=input()
einer Funktion anstelle einer Funktion würde weniger Bytes in Anspruch nehmen.5. Undefined behaviour on empty input, or input that only contains spaces, is OK.
, 98 Bytes .a
durch die integrierte Funktion ersetzenid
, damit Sie ihn nicht zu Beginn definieren müssen. -2 Bytes.Perl 6 , 55 Bytes
3 Bytes dank @nwellnhof eingespart.
Probieren Sie es online!
Erläuterung :
($_,{$++%2??S/" "$//!!S/^" "//}...*)
ist eine rekursive unendliche Folge, die mit der ursprünglichen Zeichenfolge ($_
) beginnt und das nächste Element wird durch den Block angegeben, der für das vorherige Element aufgerufen wurde.Der Block selbst erhält den String in der
$_
Variablen. Der OperatorS/(regex)/(string)/
sucht nach dem ersten Vorkommen von(regex)
in$_
, ersetzt es durch(string)
und gibt das Ergebnis zurück. Wenn es keine Übereinstimmung gibt, wird der Inhalt$_
unverändert zurückgegeben. Wir verwenden den ternären Operator?? !!
mit der Bedingung$++%2
, die zwischenFalse
und wechseltTrue
($
eine freie Variable, die ihren Inhalt über Aufrufe des Blocks hinweg beibehält).Im schlimmsten Fall (alle Leerzeichen auf einer Seite und 1 anderes Zeichen) entfernen wir alle 2 Schritte 1 Leerzeichen. Wir können also sicher sein, dass in Schritten von 2 * (Länge der Zeichenfolge) alle Leerzeichen entfernt wurden. Wir nehmen so viele Elemente aus der rekursiven Sequenz mit
[^.comb*2]
und verwerfen schließlich Duplikate (die immer dann auftreten, wenn ein Leerzeichen hätte entfernt werden sollen, es aber nicht vorhanden ist) mit.unique
. Dies gibt die Liste der Zeichenfolgen zurück, die schrittweise von Leerzeichen befreit werden.quelle
[^.comb*2]
Spart 2 Bytes. Aus irgendeinem Grund funktioniert das, aber[^2*.comb]
nicht. Keine Ahnung warum. Wenn Sie einen Ternären?? !!
zum Auswählen der Regex verwenden, wird ein weiteres Byte gespeichert.[^2*.comb]
und es hat nicht funktioniert, also habe ich es einfach benutzt[0..2*.comb]
. Und danke für das Ternär, ich fand es einfach zu teuer und mir fiel nicht ein, dass ich es durch etwas noch teureres ersetzte ...05AB1E ,
2115 BytesProbieren Sie es online!
Erklärung ^
quelle
C (GCC) ,
8984 BytesRekursive Version ist kürzer ;-)
Probieren Sie es online!
C (gcc) :
10710210110099 Bytes2 Bytes dank @Jonathan Frech mit Leerzeichen und ~ gespeichert
Probieren Sie es online!
quelle
==46
mit<33
als der Raum der kleinste druckbare Zeichen ist , und Sie haben nur diejenigen zu behandeln.++k+
?k
und fügt eins hinzu, was gleichbedeutend mitk = k + 1; i = k + 1;
oder isti = k + 2; k = k + 1
.i=k+++2
funktioniert das auch, was ich verwendet hätte, weil das+++
komisch aussieht: PJavaScript (ES6) 92
@Upvoters: Schauen Sie sich die andere JS-Antwort an, die 76 Byte lang ist
Eine Schleife, die nach einem Platz vorne oder am Ende sucht. Wenn gefunden, entfernen Sie Leerzeichen und die Ausgabezeichenfolge. Wenn 2 Mal kein Platz gefunden wurde, stoppen Sie.
quelle
<'!'
. Damit Ihr Snippet weiterhin funktioniert, können Siereplace
Punkte mit Leerzeichen eingeben, bevor Sie zu Ihrer Funktion übergehen.Perl 5, 32 Bytes
4 Bytes aufgrund von @Abigail gespeichert .
Benötigt
-pl
als 2 gezählt, mit aufgerufen-E
.Beispielnutzung
Probieren Sie es online!
quelle
print;s/^ //&&print,s/ $//&&print while/^ | $/
funktioniert mit-n
Flagge, wird auch-l
nicht benötigtC # (.NET Core) ,
192183182181179178 Bytes-3 Bytes dank Kevin Cruijssen
Probieren Sie es online!
quelle
var e=1;while(n.Trim()!=n)
->for(var e=1;n.Trim()!=n;)
;if(n[0]==' ')
->if(n[0]<33)
<33
ist möglich aufgrund der neu hinzugefügten OP-Regel: " Sie können davon ausgehen, dass die Zeichenfolge nur Zeichen aus dem druckbaren ASCII-Bereich (0x20
bis0x7E
) enthält. "Java 8,
150146145137 Bytes-4 Bytes dank @Nevay Wechsel
(f<1&s.charAt(0)<33)
zuf+s.charAt(0)<33
.-1 Byte mit dem
!s.trim().equals(s)
Trick aus der C # .NET-Antwort von @someone anstelle vons.matches(" .*|.* ")
.-8 Bytes danke an @Nevay nochmal durch Umstellung
!s.trim().equals(s)
aufs!=s.trim()
, daString#trim
wird " Eine Kopie dieser Zeichenfolge mit entferntem führenden und nachgestellten Leerzeichen oder diese Zeichenfolge, wenn sie kein führendes oder nachgestelltes Leerzeichen enthält " zurückgegeben wird!=
kann verwendet werden, um zu überprüfen, ob es sich um die gleiche Referenz handelt, anstatt.equals
den gleichen Wert zu überprüfen.Erläuterung:
Versuchen Sie es hier (oder versuchen , eine visuelle Version hier mit
#
anstelle von Leerzeichen).quelle
s=f+s.charAt(0)<33
anstelle von(f<1&s.charAt(0)<33)
(-4 Byte) verwenden.s!=s.trim()
anstelle von!s.trim().equals(s);
(-8 Byte) verwenden.C
91-90BytesProbieren Sie es online!
quelle
Gelee , 16 Bytes
Probieren Sie es online!
-2 Bytes dank Erik dem Outgolfer
-1 Bytes dank Meilen
Erläuterung
quelle
ḣ1Ḣ=⁶
->=⁶Ḣ
ƭ
Benötigt nur einen Nilad, wenn die Kette länger als zwei ist.¹Ṛƭ
funktioniert gut hier.Ruby , 63 Bytes
Probieren Sie es online!
quelle
Java (OpenJDK 8) ,
161 147146 BytesProbieren Sie es online!
-1 Byte danke an Kevin Cruijssen !
quelle
(u=32-x.charAt(l)>>-1)
zu(u=32-x.charAt(l)>>k)
k
ist0
jede zweite Iteration.u
. Es ist nicht , als ich ändere auch-1
zuk
fürv
. Ich bin verwirrt, warum es funktioniert, dak
wird es in der Tat0
nachk=~k
..: Sk=0
Szenario: Wenn links noch Leerzeichen hat,u
hat es denselben Wert wie zuvor (0
); Wenn left keine Leerzeichen mehr hat, wird es(k=~k)&~v|u
zu-1|u
(~0&-1|u
) ausgewertet , daher spielt der undefinierte (negative) Wert vonu
keine Rolle (-1|x==-1
).05AB1E ,
2517 Bytes-8 Bytes durch Ausleihen der No-Need-for-an-End-Check-Idee von Emigna
Probieren Sie es online!
Ich bin mir ziemlich sicher, dass ein weniger direkter Ansatz diese Lösung leicht schlagen kann. Zur Zeit...
Erklärungen:
quelle
S
anstelle von#
(-1 Byte). Die Schleife ... naja ... spart im Vergleich zu einem einfachen Ansatz satte 1 Byte. Ich bin derzeit auf der Suche nach einer kürzeren Möglichkeit, das Ende der Aufgabe zu erkennen (5 Byte sind viel), und ich überlege mir auch einen anderen Ansatz. Ich denke, es gibt einen geschickteren Weg, um diese Herausforderung zu lösen.R ,
145133111 Bytes-12 Bytes dank @Giuseppe, indem das Ergebnis
sub
in einer neuen Variablen gespeichert und geprüft wird, ob es sich geändert hat-22 Bytes durch Rückgabe eines Zeichenfolgenvektors anstelle einer Zeichenfolge mit Zeilenumbrüchen
Probieren Sie es online!
Erklärung zu einer teilweise ungolften Version:
quelle
C(s<-sub(),\n)
anstelle einer separaten Druckanweisung verwenden? Ah, nein, wegensep=" "
sep=""
. Bei den meisten Herausforderungen spielt der zusätzliche Leerraum keine Rolle, aber hier tut es das leider!sub
gerade vorgeschlagen, IDK warumL=s
einen String-Vektor setzen und zurückgeben?Java (OpenJDK 8) ,
137125121120124 BytesProbieren Sie es online!
quelle
s->{for(int i=0;s!=s.trim();)System.out.println(s=s.substring(s.charAt(0)<33?1-i%2:0,s.length()-(s.endsWith(" ")?i++%2:0)));}
s->{int i=1;do System.out.println(s);while(s!=(s=s.substring(s.charAt(0)<33?i:(i=0),s.length()-(s.endsWith(" ")?i^=1:0))));}
(124 Byte) verwenden (scheint korrekt zu sein, hat aber nicht viel getestet).MATL ,
2116 BytesHierbei werden Punkte anstelle von Leerzeichen verwendet, um die Übersichtlichkeit zu erhöhen. Für Leerzeichen ersetzen Sie
46
durch32
.Probieren Sie es online!
Erläuterung
quelle
Schale ,
2322 BytesDanke an Leo für -1 Byte.
Probieren Sie es online!
Erläuterung
Die Funktion
`G`I
sollte eigentlich eine eingebaute sein ...quelle
?
scheint im Nachhinein offensichtlich ...C ++,
196193189186183 Bytes-10 Bytes dank Jonathan Frech
-3 Bytes dank Zacharý
Für die Kompilierung mit MSVC müssen die SDL-Prüfungen deaktiviert werden
quelle
==32
mit<33
.#include<string>
wirklich notwendig ?if(...){...;D;}
->if(...)...,D;
.#define R ...<33
,||R){
Undif(R){
->#define R ...<33)
,||R{
undif(R{
.C # (.NET Core) ,
176 bis170 ByteProbieren Sie es online!
Dies ist eine Alternative zur Antwort von @ jemandem und gibt die Zeichenfolgen direkt aus.
quelle
JavaScript (ES6), 76 Byte
Ausgabe als mehrzeilige Zeichenfolge.
Testfälle
Verwenden Sie Punkte anstelle von Leerzeichen, wie es die meisten Antworten tun.
Code-Snippet anzeigen
quelle
Sed, 24 Bytes
Probieren Sie es online!
quelle
Oktave ,
8883 Bytes5 Bytes weniger dank Stewie Griffin!
Probieren Sie es online!
quelle
min
benötigt wird, weils
dynamisch geschrumpftx86-Maschinencode für Linux, 60 Byte
Dies ist eine Funktion für Linux x86. Es nimmt als Eingabezeiger den String in
edi
und die Stringlänge inebp
.Ungolfed, mit etwas zu testender Infrastruktur (mit FASM kompilieren, mit dem String als Programmargument ausführen; nach dem
undress:
Label für den tatsächlichen Funktionscode suchen ):quelle
sys_write()
machteax
ungleich Null (genauer gesagt1
, die Anzahl der geschriebenen Zeichen, vorausgesetzt, es ist nicht so-errno
), so wird es,print
wenn Sie nichtpop eax
am Ende. Sie könnten kurzxor eax,eax
vorcmp byte [edi], ' '
und speichern diemov al,1
, und vielleicht einigeeax
speichern / wiederherstellen. Obwohl Sie es erst speichern, nachdem Sie mit geclobbt habenSYS_WRITE
. Hmm, stattdessen0
könntest duSYS_WRITE
vs. verwenden1
, dacmp al, imm8
ist die gleiche Größe wietest al,al
.'\n'
in das Array mit setzen,mov byte [ecx + edx], '\n'
anstatt die 2. zu tunwrite()
? (Und die Länge nach dem Drucken verringern?) Sparen Sie sich möglicherweise ein paar Anweisungen.print()
noch Blätter'\n'
ineax
, die von verschieden istSYS_WRITE
, so könnte man noch , dass der Check. Ich dachte, Sie speichern / wiederherstelleneax
, aber das spart nur Bytes, die eine Konstante herum kopieren. Bei langen Stringssys_write()
können die High-Bytes von eax ungleich Null bleiben, so dass nur die Verwendung leider ausgeschlossen istmov al, SYS_WRITE
.mov al, 1
fremd. -2 Bytes jetzt, danke.PHP , 117 Bytes
Ich füge zu Beginn ein zusätzliches Leerzeichen hinzu, damit das Original ohne zusätzlichen Code angezeigt wird.
Das ist ein bisschen neu ... Würden das <? Php und der Speicherplatz am Anfang der PHP-Datei 6 zusätzliche Bytes hinzufügen oder bekomme ich das kostenlos?
Probieren Sie es online!
quelle
php -r "echo 1;"
Wenn Sie jedoch so etwas verwenden möchten, müssen<?=1;
Sie das Tag in die Byteanzahl aufnehmen.Pyth , 28 Bytes
Probieren Sie es hier aus! oder Überprüfen Sie alle Testfälle!
Erläuterung
quelle
Python 2 , 79 Bytes
-1 Byte dank @JonathanFrech
Probieren Sie es online!
Der Testanzug ersetzt
"."
mit," "
bevor die Funktion aufgerufen wird, und ersetzt" "
mit"."
, bevor die Ergebnisse für Klarheit zu drucken.quelle
'!'*i and
->i*'!'and
.C # - noch einmal 125 Bytes
Prost!
Probieren Sie es online!
quelle
Oktave , 89 Bytes
Probieren Sie es online!
Ich werde später eine Erklärung hinzufügen, wenn ich Zeit habe. Ich könnte in der Lage sein, einige Bytes abzuspielen, wenn ich den Ansatz komplett ändere, aber ich kann leider nicht sehen, wie.
In den letzten Buchstaben steht "sendendendend". Ich wünschte, es gäbe eine Möglichkeit,
end
als Variable zu speichern und diese zu verwenden, aber raten Sie mal, was ...quelle
s = ...
? (Die übliche Frage, die ich kenne)Bash,
9894 Bytes4 Bytes mit Subshell anstelle von Sequenzen gespeichert (schlechte Leistung)
Erste Antwort
Beachten Sie,
!
dass im interaktiven Modus ein Escapezeichen gesetzt werden mussquelle