Entfernen Sie zusätzliche Leerzeichen von einer Zeichenfolge

12

Sie erhalten eine Zeichenfolge. Geben Sie die Zeichenfolge mit einem Leerzeichen pro Wort aus.

Herausforderung

Die Eingabe ist eine Zeichenfolge (nicht nulloder leer), die von Anführungszeichen ( ") umgeben ist, die über das Symbol gesendet werden stdin. Entfernen Sie führende und nachfolgende Leerzeichen. Wenn sich zwischen zwei Wörtern (oder Symbolen oder was auch immer) mehr als ein Leerzeichen befindet, kürzen Sie es auf nur ein Leerzeichen. Geben Sie den geänderten String mit den Anführungszeichen aus.

Regeln

  • Die Zeichenfolge darf nicht länger als 100 Zeichen sein und enthält nur ASCII-Zeichen im Bereich (Leerzeichen) bis ~(Tilde) (Zeichencodes 0x20 bis 0x7E, einschließlich), mit der Ausnahme ", dass die Zeichenfolge keine Anführungszeichen ( ") und andere Zeichen außerhalb von enthält Bereich oben angegeben. Siehe ASCII-Tabelle als Referenz.
  • Sie müssen Eingaben von der stdin(oder der nächstgelegenen) Alternative nehmen.
  • Die Ausgabe muss Anführungszeichen ( ") enthalten.
  • Sie können ein vollständiges Programm oder eine Funktion schreiben, die Eingaben (von stdin) entgegennimmt und die endgültige Zeichenfolge ausgibt

Testfälle

"this  is  a    string   "         --> "this is a string"

"  blah blah    blah "             --> "blah blah blah"

"abcdefg"                          --> "abcdefg"

"           "                      --> ""

"12 34  ~5 6   (7, 8) - 9 -  "     --> "12 34 ~5 6 (7, 8) - 9 -" 

Wertung

Dies ist Codegolf, daher gewinnt die kürzeste Übermittlung (in Byte).

Spikatrix
quelle
1
Sie sagen must take input from stdin, und später sagen Sie ...or a function which takes input, and outputs the final string. Bedeutet das, dass die Funktion auch Eingaben von nehmen muss stdin?
blutorange
@ Blutorange, ja. Bearbeitet, um es zu klären.
Spikatrix
2
" "aa" "-> ""aa""(
Sind
@ edc65, Guter Punkt. Die Antwort darauf ist nein. Bearbeitet, um es zu klären.
Spikatrix
Bitte beachten Sie MickeyTs Kommentar zu meiner Antwort. Ist das, was er vorschlägt, gültig? In R werden zurückgegebene Ergebnisse implizit gedruckt, aber in meiner Antwort habe ich explizit auf stdout gedruckt.
Alex A.

Antworten:

12

CJam, 7 Bytes

q~S%S*p

Code Erklärung

CJam hat alle Großbuchstaben als eingebaute Variablen reserviert. Hat also Shier den Wert eines Raumes.

q~          e# Read the input (using q) and evaluate (~) to get the string
  S%        e# Split on running lengths (%) of space
    S*      e# Join (*) the splitted parts by single space
      p     e# Print the stringified form (p) of the string.

Dadurch werden auch die nachgestellten und führenden Leerzeichen entfernt

Probieren Sie es hier online aus

Optimierer
quelle
10

/// : 18 Zeichen

/  / //" /"// "/"/

Probelauf:

(Verwenden des Interpreters von faubiguy aus seiner Perl-Antwort für Interpret /// (ausgesprochene 'Schrägstriche') .)

bash-4.3$ ( echo -n '/  / //" /"// "/"/'; echo '"   foo  *  bar   "'; ) | slashes.pl
"foo * bar"
Mann bei der Arbeit
quelle
Technisch gesehen nehmen Sie jedoch keine Eingaben vor. ;) Es gibt diese Sprache, aber das Lesen von Beiträgen ist immer noch ein ziemlicher Schmerz, denke ich.
Martin Ender
6

Perl, 22

(20 Byte Code plus 2 Befehlszeilenoptionen)

s/ +/ /g;s/" | "/"/g

Muss mit dem -npSwitch ausgeführt werden, $_damit er automatisch über stdin gefüllt und auf stdout gedruckt wird. Ich gehe davon aus, dass dies die Byteanzahl um 2 erhöht.

r3mainer
quelle
1
gleiche Lösung:sed -E 's/ +/ /g;s/" | "/"/g'
izabera
3
Das Gleiche gilt für 12 Bytes in der Retina . :)
Martin Ender
-pimpliziert -n, so dass Sie nur eine +1 Strafe hier nehmen müssen (vorausgesetzt, Sie wechseln nicht nur in eine andere Sprache, wie die anderen Kommentatoren vorschlagen).
4

Ruby, 31 29 25 23 Bytes

p$*[0].strip.squeeze' '

Code Erklärung:

  • pgibt einen String in doppelten Anführungszeichen aus zu STDOUT( es steckt aber noch mehr dahinter ...)
  • $*ist ein Array von STDINEingaben, $*[0]nimmt die erste
  • strip Entfernt Start- und End-Leerzeichen
  • squeeze ' ' ersetzt> 1 Leerzeichen durch ein einzelnes Leerzeichen

Testfälle:

Bildbeschreibung hier eingeben

Sheharyar
quelle
1
Sie können ersetzen ARGVmit $*Spar zwei Bytes. gsub /\s+/, ' 'kann durch squeeze ' 'weitere 4 Bytes ersetzt werden
DickieBoy
@DickieBoy, danke $*, das wusste ich nicht. Aber wir können nicht ersetzen gsub /\s+/, ' 'mit , squeezeweil sie nicht gleich sind .
Sheharyar
Was meinst du mit "sind nicht gleich"? Die Ausgänge sind gleich.
DickieBoy
1
squeeze ' 'drückt nur Leerzeichen. "yellow moon".squeeze "l" => "yelow moon"
DickieBoy
2
Persönlich bin ich. Und einige andere Antwortende auch. Aber wie ich sehe, sind weder Sie noch Ihre Interpretation allein ... Eine Klärung durch den Fragesteller wäre willkommen. Übrigens ist der Abstand zwischen pund seinem Parameter und squeezeund seinem Parameter nicht erforderlich.
manatwork
4

Pyth, 17 15 11 10 Bytes

(Dank an Ypnypn und FryAmTheEggman )

pjd-cQdkNN

Könnte wahrscheinlich mehr Golf gespielt werden.

Wenn die Ausgabe 'statt "dann verwenden kann, benötige ich nur 8 Bytes:

`jd-cQdk
Tyilo
quelle
Sie können Nanstelle von\"
Ypnypn
Willkommen in Pyth, Tylio. Das zweite Programm könnte durch die Verwendung von verkürzt werden d.
isaacg
@isaacg habe ich nicht schon dfür alles verwendet, wofür es verwendet werden kann?
Tyilo
@ Tyilo Ich glaube, Sie haben ungefähr zur selben Zeit, als ich einen Kommentar abgegeben habe, eine Änderung vorgenommen. Es ist jetzt alles gut.
isaacg
Sie können verwenden p, um ein paar Bytes bei der Verkettung von Zeichenfolgen anstelle von vielen zu speichern +. pjd-cQdkNN
FryAmTheEggman
3

Bash, 36 32 Bytes

Als eine Funktion, ein Programm oder einfach in einer Pipe:

xargs|xargs|xargs -i echo '"{}"'

Erläuterung

Der Erste xargs die Anführungszeichen.

Der Zweite xargs Option schneidet die linke Seite ab und ersetzt mehrere benachbarte Leerzeichen in der Mitte der Zeichenfolge durch ein Leerzeichen, indem jedes "Wort" durch ein Leerzeichen getrennt wird.

Das xargs -i echo '"{}"'schneidet die rechte Seite und fügt die resultierende Zeichenfolge in doppelte Anführungszeichen ein.

Deltik
quelle
2
Beeindruckend! Das ist knifflig. Leider nicht mit Testfall 4 fertig, aber trotzdem beeindruckend.
Manatwork
Ja, dieser Code erfüllt den vierten Testfall und ist kürzer.
Deltik
Kannst du so etwas machen? x=xargs;$x|$x|$x -i echo '"{}"'
Cyoce
@Cyoce: Sie könnten das in der Tat tun, um ein Byte auf Kosten des Verlusts der Pipe-Funktionalität zu sparen. Immer noch nicht so kurz wie diese Lösung und erfüllt immer noch nicht den vierten Testfall.
Deltik
3

Haskell, 31 25 Bytes

fmap(unwords.words)readLn

wordsTeilt die Zeichenfolge in eine Liste von Zeichenfolgen mit Leerzeichen als Trennzeichen auf und unwordsfügt der Liste der Zeichenfolgen ein einzelnes Leerzeichen dazwischen hinzu. Die Anführungszeichen "werden von Haskells readund show(implizit über die REPL) -Funktionen für Zeichenfolgen entfernt und zurückgesetzt.

Die Ausgabe durch die Funktion selbst ist drei Bytes länger, dh 28 Bytes:

print.unwords.words=<<readLn

Edit: @ Mauris zeigte auf die readLnFunktion, die einige Bytes sparte.

nimi
quelle
Ich bekomme Parse error: naked expression at top levelals ich beide Codes hier
Spikatrix
@CoolGuy: rextester.com erwartet ganze Programme, keine Funktionen. Versuchen Sie es also main=interact$show.unwords.words.read. Es gibt eine Online-REPL an der Front von haskell.org (erfordert aktivierte Cookies), wo Sie es versuchen können fmap(unwords.words.read)getLine.
nimi
1
fmap(unwords.words)readLnund print.unwords.words=<<readLnsind etwas kürzer.
Lynn
@ Mauris: Danke für den Hinweis auf readLn.
nimi
2

R, 45 Bytes

cat('"',gsub(" +"," ",readline()),'"',sep="")

Die readline()Funktion liest aus STDIN und entfernt automatisch alle führenden und nachfolgenden Leerzeichen. Überschüssiger Abstand zwischen Wörtern wird mit entferntgsub() . Schließlich werden doppelte Anführungszeichen vorangestellt und angehängt, und das Ergebnis wird an STDOUT ausgegeben.

Beispiele:

> cat('"',gsub(" +"," ",readline()),'"',sep="")
    This   is     a   string  
"This is a string"

> cat('"',gsub(" +"," ",readline()),'"',sep="")
12 34  ~5 6   (7, 8) - 9 -  
"12 34 ~5 6 (7, 8) - 9 -"
Alex A.
quelle
Ich bin mir nicht sicher, ob es den Regeln entspricht, aber die Katze wird möglicherweise nicht unbedingt benötigt, nur die gsub. Die Ausgabe davon ist[1] "This is a string"
MickyT
@ MickyT: Danke für den Vorschlag. Meine Interpretation basierend auf dem Kommentar des OP (zuerst auf dem Post) war, dass es auf Standard gedruckt werden musste. Ich werde um Klärung bitten.
Alex A.
Ahhh ... habe diesen Kommentar oder diese Anforderung nicht gesehen
MickyT
2

Python2, 37

Reduziert um 1 Byte dank @ygramul.

print'"%s"'%' '.join(input().split())

Originalfassung:

print'"'+' '.join(input().split())+'"'

Testfälle:

Testfälle Screenshot

user12205
quelle
Ich wollte wirklich verwenden print" ".join(raw_input().split()), aber es würde ein Leerzeichen nach dem letzten Anführungszeichen haben, wenn es Leerzeichen nach dem letzten Wort
gäbe
Sie können ein zusätzliches Byte mit% Formatierung abschneiden: print '"% s"'% '' .join (input (). Split ())
ygramul
2

JavaScript (ES6), 49 52 58

Bearbeiten Sie dank @Optimizer 6 Bytes kürzer

Bearbeite 2 -3, danke an @nderscore

Eingabe / Ausgabe über Popup. Verwenden der Vorlagenzeichenfolge zum Ausschneiden von 1 Byte in der Zeichenfolgenverkettung.

Führen Sie das Snippet aus, um es in Firefox zu testen.

alert(`"${prompt().match(/[^ "]+/g).join(" ")}"`)

edc65
quelle
alert(`"${eval(prompt()).match(/\S+/g).join(" ")}"`) - 52
Optimierer
@Optimizer thx. Beachten Sie, dass nur nach der letzten Klärung der Anführungszeichen funktioniert: eval ('"" "') würde abstürzen.
edc65
Als ich den vierten Testfall (mit Chrome) getestet habe, wird kein Popup (das das Ergebnis anzeigt) angezeigt. Warum?
Spikatrix
@CoolGuy vielleicht, weil Chrome ES6 nicht ausführt? Ich habe ES6 nie mit Chrome getestet. Jedenfalls habe ich es jetzt in meinem Chrome (42.0.2311.152) probiert und funktioniert bei mir.
edc65
-3:alert(`"${prompt().match(/[^ "]+/g).join(" ")}"`)
nderscore
2

05AB1E , 9 Bytes

#õKðý'".ø

Probieren Sie es online!


#         | Split on spaces.
 õK       | Remove empty Strings.
   ðý     | Join with spaces.
     '".ø | Surround with quotes.
Magic Octopus Urn
quelle
1

Mathematica, 75 Bytes

a=" ";b=a...;Print[InputString[]~StringReplace~{b~~"\""~~b->"\"",a..->a}]
LegionMammal978
quelle
1

KDB (Q), 28 Bytes

" "sv except[;enlist""]" "vs

Erläuterung

                       " "vs    / cut string by space
      except[;enlist""]         / clear empty strings
" "sv                           / join back with space

Prüfung

q)" "sv except[;enlist""]" "vs"12 34  ~5 6   (7, 8) - 9 -  "
"12 34 ~5 6 (7, 8) - 9 -"
WooiKent Lee
quelle
1

Java 8, 43 Bytes

s->'"'+s.replaceAll(" +|\""," ").trim()+'"'

Erläuterung:

Probieren Sie es hier aus.

s->                           // Method with String as parameter and return-type
  '"'                         //  Return a leading quote
  +s.replaceAll(" +           //  + Replace all occurrences of multiple spaces
                   |\"",      //     and all quotes
                        " ")  //    with a single space
    .trim()                   //  And remove all leading and trailing spaces
  +'"'                        //  And add the trailing quote
                              // End of method (implicit / single-line return statement)
Kevin Cruijssen
quelle
1

Jq 1,5 , 42 Bytes

split(" ")|map(select(length>0))|join(" ")

Probelauf

$ jq -M 'split(" ")|map(select(length>0))|join(" ")' < data
"this is a string"
"blah blah blah"
"abcdefg"
""
"12 34 ~5 6 (7, 8) - 9 -"

$ echo -n 'split(" ")|map(select(length>0))|join(" ")' | wc -c
  42

Probieren Sie es online aus

jq170727
quelle
Ich habe das Ausgabeproblem früher erkannt (siehe Bearbeiten 5), aber das Eingabeproblem ist mir nicht aufgefallen. Der Befehl ist jetzt behoben. Vielen Dank!
jq170727
1

Tcl , 69 Bytes

puts [string map {{ "} \" {" } \"} [regsub -all \ + [gets stdin] \ ]]

Probieren Sie es online!

Tcl , 79 Bytes

puts \"[string trim [regsub -all \ + [string range [gets stdin] 1 end-1] \ ]]\"

Probieren Sie es online!

Sergiol
quelle
@ KevinCruijssen Behoben. leider auf kosten vieler bytes. Tks, dass du es mir erzählt hast.
Sergiol
0

Golfua, 42 Bytes

L=I.r():g('%s*\"%s*','"'):g('%s+',' ')w(L)

Einfache Ersetzung durch Mustererkennung: Suchen Sie nach doppelten Anführungszeichen ( \"), die von 0 oder mehr Leerzeichen ( %s*) umgeben sind, und geben Sie das einfache Anführungszeichen zurück. Ersetzen Sie dann alle 1 oder mehr Leerzeichen (%s+ ) durch ein einzelnes Leerzeichen.

Ein Lua-Äquivalent wäre

Line = io.read()
NoSpaceQuotes = Line:gsub('%s*\"%s*', '"')
NoExtraSpaces = NoSpaceQuotes:gsub('%s+', ' ')
print(NoExtraSpaces)
Kyle Kanos
quelle
0

Cobra - 68

Als anonyme Funktion:

do
    print'"[(for s in Console.readLine.split where''<s).join(' ')]"'
Οurous
quelle
0

Ziel-C 215

-(NSString*)q:(NSString*)s{NSArray*a=[s componentsSeparatedByString:@" "];NSMutableString*m=[NSMutableString new];for(NSString*w in a){if(w.length){[m appendFormat:@"%@ ",w];}}return[m substringToIndex:m.length-1];}

Unkomprimierte Version:

-(NSString*)q:(NSString*)s{
    NSArray *a=[s componentsSeparatedByString:@" "];
    NSMutableString *m=[NSMutableString new];
    for (NSString *w in a) {
        if (w.length) {
            [m appendFormat:@"%@ ",w];
        }
    }
    return[m substringToIndex:m.length-1];
}
Fenchelouski
quelle
0

Bash, 14 Bytes

read f;echo $f       # assume f="this  is  a    string   "
michael501
quelle
1
Was ist mit der Annahme von "foo * bar" oder etwas anderem mit einem Platzhalterzeichen?
manatwork
0

Powershell, 40 Bytes

"`"$(($args-Replace' +'," ").trim())`""

Ziemlich direkt und nicht sehr beeindruckend.

Erläuterung

Eingabeparameter über (vordefinierte) args-Variable übernehmen, alle mehreren Leerzeichen durch eins ersetzen, führende und nachfolgende Leerzeichen mit trim () - Methode abschneiden, Anführungszeichen hinzufügen. Powershell druckt als Standardverhalten Zeichenfolgen an die Konsole.

was auch immer
quelle
0

k4, 23 Bytes

" "/:x@&~~#:'x:" "\:0:0

                    0:0  / read from stdin
             x:" "\:     / split string on spaces and assign to x
        ~~#:'            / boolean true where string len>0, bool false otherwise
     x@&                 / x at indices where true
" "/:                    / join with spaces
kritzeln
quelle
0

Zsh , 15 Bytes

<<<\"${(Qz)1}\"

Probieren Sie es online!

Eingabezeichenfolge enthält eingebettete Anführungszeichen. Entfernen Sie die Qfür 14 Bytes wenn die Eingabezeichenfolge keine eingebetteten Anführungszeichen enthält, wie dies in einigen anderen Antworten hier der Fall ist.

Parametererweiterungsflags: QEntzieht Anführungszeichen und zteilt sich dann wie die Shell in Wörter auf. Die Wörter werden dann implizit durch Leerzeichen verbunden.

GammaFunktion
quelle
0

Zaunkönig , 56 Bytes

Warten. Das Ersetzen macht es nur einmal ? Jetzt muss ich die Split-Join-Kombination verwenden.

Fn.new{|x|x.trim().split(" ").where{|i|i!=""}.join(" ")}

Probieren Sie es online!

Erläuterung

Fn.new{|x|                                             } // New anonymous function with the operand x
          x.trim()                                       // Trim out whitespace from both sides of the string
                  .split(" ")                            // Split the string into space-separated chunks
                             .where{|i|i!=""}            // Keep all of those that aren't the null string (due to two consecutive spaces)
                                             .join(" ")  // Join the replaced list together
ein'_'
quelle
-1

Python2, 28 Bytes

lambda s:" ".join(s.split())

Erläuterung

lambda s

Anonyme Funktion, die als Eingabe s nimmt.

s.split()

Gibt eine Liste der Wörter (die durch beliebige Zeichenfolgen mit Leerzeichen getrennt sind) der Zeichenfolge s zurück.

" ".join(...)

Verknüpft die Liste wieder zu einer Zeichenfolge, wobei jedes Wort durch ein Leerzeichen ("") getrennt ist.

Triggernometrie
quelle
2
Dies scheint zu falschen Ergebnissen in Bezug auf führende und nachfolgende Leerzeichen zu führen.Beachten Sie, dass Sie für den Challenge-Status die Eingabe in doppelten Anführungszeichen und die Ausgabe in doppelten Anführungszeichen vornehmen sollten. Ich hatte dies auch zuerst falsch, bis ich die Herausforderung erneut las.
Kevin Cruijssen