You are given a string. Output the string with one space per words.
Challenge
Input will be a string (not null
or empty), surrounded with quotes("
) sent via the stdin
. Remove leading and trailing spaces from it. Also, if there are more than one space between two words (or symbols or whatever), trim it to just one space. Output the modified string with the quotes.
Rules
- The string will not be longer than 100 characters and will only contain ASCII characters in range (space) to
~
(tilde) (character codes 0x20 to 0x7E, inclusive) except"
,i.e, the string will not contain quotes("
) and other characters outside the range specified above. See ASCII table for reference. - You must take input from the
stdin
( or closest alternative ). - The output must contain quotes(
"
). - You can write a full program, or a function which takes input (from
stdin
), and outputs the final string
Test Cases
"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 -"
Scoring
This is code golf, so the shortest submission (in bytes) wins.
43 Answers 43
CJam, 7 bytes
q~S%S*p
Code Explanation
CJam has reserved all capital letters as inbuilt variables. So S
has a value of a space here.
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.
This removes the trailing and leading spaces as well
///: 18 characters
/ / //" /"// "/"/
Sample run:
(Using faubiguy's interpreter from his Perl answer for Interpret /// (pronounced 'slashes').)
bash-4.3$ ( echo -n '/ / //" /"// "/"/'; echo '" foo * bar "'; ) | slashes.pl
"foo * bar"
-
13\$\begingroup\$ Haven't I seen this program somewhere before? \$\endgroup\$r3mainer– r3mainer2015年05月20日 17:48:59 +00:00Commented May 20, 2015 at 17:48
-
\$\begingroup\$ Technically you're not taking input though. ;) There's this language but reading input is still quite a pain I think. \$\endgroup\$Martin Ender– Martin Ender2015年05月20日 22:00:52 +00:00Commented May 20, 2015 at 22:00
Perl, 22
(20 bytes of code, plus 2 command line switches)
s/ +/ /g;s/" | "/"/g
Needs to be run with the -np
switch so that $_
is automatically filled via stdin and printed to stdout. I'm going to assume this adds 2 to the byte count.
-
1\$\begingroup\$ same solution:
sed -E 's/ +/ /g;s/" | "/"/g'
\$\endgroup\$izabera– izabera2015年05月20日 16:01:33 +00:00Commented May 20, 2015 at 16:01 -
3\$\begingroup\$ The same thing is 12 bytes in Retina. :) \$\endgroup\$Martin Ender– Martin Ender2015年05月20日 16:24:30 +00:00Commented May 20, 2015 at 16:24
-
\$\begingroup\$
-p
implies-n
, so you only have to take a +1 penalty here (assuming you don't just switch to a different language, like the other commenters suggest). \$\endgroup\$user62131– user621312016年12月18日 08:44:43 +00:00Commented Dec 18, 2016 at 8:44
Bash, (削除) 36 (削除ここまで) 32 bytes
As a function, a program, or just in a pipe:
xargs|xargs|xargs -i echo '"{}"'
Explanation
The first xargs
strips the quotation marks.
The second xargs
trims the left side and replaces multiple adjacent spaces in the middle of the string with one space by taking each "word" and separating each with a space.
The xargs -i echo '"{}"'
trims the right side and rewraps the resulting string in double quotes.
-
2\$\begingroup\$ Wow! That is tricky. Unfortunately not handles test case 4, but still impressing. \$\endgroup\$manatwork– manatwork2015年05月21日 07:46:09 +00:00Commented May 21, 2015 at 7:46
-
-
\$\begingroup\$ Can you do something like this?
x=xargs;$x|$x|$x -i echo '"{}"'
\$\endgroup\$Cyoce– Cyoce2017年09月01日 05:09:57 +00:00Commented Sep 1, 2017 at 5:09 -
\$\begingroup\$ @Cyoce: You could indeed do that to save one byte at the cost of losing pipe functionality. Still not as short as this solution and still doesn't satisfy the fourth test case. \$\endgroup\$Deltik– Deltik2017年09月01日 07:44:21 +00:00Commented Sep 1, 2017 at 7:44
Ruby, (削除) 31 (削除ここまで) (削除) 29 (削除ここまで) (削除) 25 (削除ここまで) 23 Bytes
p$*[0].strip.squeeze' '
Code Explanation:
p
outputs string within double quotes toSTDOUT
(There's more to it though...)$*
is an array ofSTDIN
inputs,$*[0]
takes the first onestrip
removes starting and ending spacessqueeze ' '
replaces>1 space characters with a single space
Test Cases:
enter image description here
-
1\$\begingroup\$ You can replace
ARGV
with$*
saving two bytes.gsub /\s+/, ' '
can be replaced withsqueeze ' '
for another 4 bytes \$\endgroup\$DickieBoy– DickieBoy2015年05月22日 09:57:41 +00:00Commented May 22, 2015 at 9:57 -
\$\begingroup\$ @DickieBoy, thank you for
$*
, I didn't know that. But we can't replacegsub /\s+/, ' '
withsqueeze
because they are not the same. \$\endgroup\$Sheharyar– Sheharyar2015年05月22日 10:09:40 +00:00Commented May 22, 2015 at 10:09 -
\$\begingroup\$ What do you mean by "are not the same"? The outputs are the same. \$\endgroup\$DickieBoy– DickieBoy2015年05月22日 10:16:01 +00:00Commented May 22, 2015 at 10:16
-
1\$\begingroup\$
squeeze ' '
will only squeeze spaces."yellow moon".squeeze "l" => "yelow moon"
\$\endgroup\$DickieBoy– DickieBoy2015年05月22日 10:24:09 +00:00Commented May 22, 2015 at 10:24 -
2\$\begingroup\$ Personally I am. And some of other answerers too. But as I see, neither you are alone with your interpretation... A clarification from the question owner would be welcome. By the way, both the space between
p
and its parameter andsqueeze
and its parameter are unnecessary. \$\endgroup\$manatwork– manatwork2015年05月22日 10:42:53 +00:00Commented May 22, 2015 at 10:42
Pyth, (削除) 17 (削除ここまで) (削除) 15 (削除ここまで) (削除) 11 (削除ここまで) 10 bytes
(thanks to Ypnypn and FryAmTheEggman)
pjd-cQdkNN
Could probably be golfed more.
If the output can use '
instead of "
then I only need 8 bytes:
`jd-cQdk
-
\$\begingroup\$ You can use
N
instead of\"
\$\endgroup\$Ypnypn– Ypnypn2015年05月21日 00:23:36 +00:00Commented May 21, 2015 at 0:23 -
\$\begingroup\$ Welcome to Pyth, Tylio. The second program could be shorterned by the use of
d
. \$\endgroup\$izzyg– izzyg2015年05月21日 07:29:10 +00:00Commented May 21, 2015 at 7:29 -
\$\begingroup\$ @isaacg haven't I already used
d
for everything it can be used for? \$\endgroup\$Tyilo– Tyilo2015年05月22日 23:38:04 +00:00Commented May 22, 2015 at 23:38 -
\$\begingroup\$ @Tyilo I think you made an edit at about the same time I commented. It's all good now. \$\endgroup\$izzyg– izzyg2015年05月22日 23:48:36 +00:00Commented May 22, 2015 at 23:48
-
\$\begingroup\$ You can use
p
to save a few bytes on string concatenation instead of many+
es.pjd-cQdkNN
\$\endgroup\$FryAmTheEggman– FryAmTheEggman2015年05月23日 03:38:29 +00:00Commented May 23, 2015 at 3:38
Haskell, (削除) 31 (削除ここまで) 25 bytes
fmap(unwords.words)readLn
words
splits the string into a list of strings with spaces as delimiters and unwords
joins the list of strings with a single spaces in-between. The quotes "
are stripped of and put back by Haskell's read
and show
(implicitly via the REPL) functions on strings.
Outputting by the function itself is three bytes longer, i.e. 28 bytes:
print.unwords.words=<<readLn
Edit: @Mauris pointed to the readLn
function, which saved some bytes.
-
-
\$\begingroup\$ @CoolGuy: rextester.com expects whole programs, not functions, so try
main=interact$show.unwords.words.read
. There's an online REPL at the frontage of haskell.org (requires cookies enabled) where you can tryfmap(unwords.words.read)getLine
. \$\endgroup\$nimi– nimi2015年05月21日 14:19:55 +00:00Commented May 21, 2015 at 14:19 -
1\$\begingroup\$
fmap(unwords.words)readLn
andprint.unwords.words=<<readLn
are a bit shorter. \$\endgroup\$lynn– lynn2015年05月23日 01:38:33 +00:00Commented May 23, 2015 at 1:38
JavaScript (ES6), 49 (削除) 52 58 (削除ここまで)
Edit 6 bytes shorter, thanks to @Optimizer
Edit 2 -3, thanks to @nderscore
Input/output via popup. Using template string to cut 1 byte in string concatenation.
Run snippet to test in Firefox.
alert(`"${prompt().match(/[^ "]+/g).join(" ")}"`)
-
\$\begingroup\$
alert(`"${eval(prompt()).match(/\S+/g).join(" ")}"`)
- 52 \$\endgroup\$Optimizer– Optimizer2015年05月20日 15:50:45 +00:00Commented May 20, 2015 at 15:50 -
\$\begingroup\$ @Optimizer thx. Note, that just works after the last clarification about the quotes: eval('" " "') would crash. \$\endgroup\$edc65– edc652015年05月20日 15:55:43 +00:00Commented May 20, 2015 at 15:55
-
\$\begingroup\$ When I tested the fourth test case (using chrome), no popup (which shows the result) is seen. Why? \$\endgroup\$Spikatrix– Spikatrix2015年05月21日 08:42:36 +00:00Commented May 21, 2015 at 8:42
-
\$\begingroup\$ @CoolGuy maybe because Chrome does not run ES6? I never test ES6 with Chrome. Anyway I tried it now in my Chrome (42.0.2311.152) and works for me. \$\endgroup\$edc65– edc652015年05月21日 10:49:46 +00:00Commented May 21, 2015 at 10:49
-
\$\begingroup\$ -3:
alert(`"${prompt().match(/[^ "]+/g).join(" ")}"`)
\$\endgroup\$nderscore– nderscore2015年05月23日 15:54:35 +00:00Commented May 23, 2015 at 15:54
R, 45 bytes
cat('"',gsub(" +"," ",readline()),'"',sep="")
The readline()
function reads from STDIN, automatically stripping any leading and trailing whitespace. Excess space between words is removed using gsub()
. Finally, double quotes are prepended and appended and the result is printed to STDOUT.
Examples:
> 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 -"
-
\$\begingroup\$ Not sure if it complies totally with the rules, but the cat may not be totally required, just the gsub. The output from that is
[1] "This is a string"
\$\endgroup\$MickyT– MickyT2015年05月20日 19:26:26 +00:00Commented May 20, 2015 at 19:26 -
\$\begingroup\$ @MickyT: Thanks for the suggestion. My interpretation based on the OP's comment (first on the post) was that it had to be printed to stdout. I'll ask for clarification. \$\endgroup\$Alex A.– Alex A.2015年05月20日 19:28:43 +00:00Commented May 20, 2015 at 19:28
-
\$\begingroup\$ Ahhh ... didn't see that comment or requirement \$\endgroup\$MickyT– MickyT2015年05月20日 19:30:34 +00:00Commented May 20, 2015 at 19:30
Python2, 37
Reduced by 1 byte thanks to @ygramul.
print'"%s"'%' '.join(input().split())
Original version:
print'"'+' '.join(input().split())+'"'
Test cases:
Test cases screenshot
-
\$\begingroup\$ I really wanted to use
print" ".join(raw_input().split())
, but it would have a trailing space inside the last quotation mark if there were spaces after the last word... \$\endgroup\$mbomb007– mbomb0072015年05月20日 19:24:09 +00:00Commented May 20, 2015 at 19:24 -
\$\begingroup\$ You can shave off an extra byte using % formatting: print'"%s"'%' '.join(input().split()) \$\endgroup\$ygramul– ygramul2015年05月22日 15:26:28 +00:00Commented May 22, 2015 at 15:26
05AB1E, 9 bytes
#õKðý'".ø
# | Split on spaces.
õK | Remove empty Strings.
ðý | Join with spaces.
'".ø | Surround with quotes.
Java 8, 40 bytes
s->'"'+s.replaceAll(" +"," ").trim()+'"'
Explanation:
s-> // Method with String as parameter and return-type
'"' // Return a leading quote
+s.replaceAll(" +", // + Replace all occurrences of multiple spaces in the input
" ") // with a single space
.trim() // and remove all leading and trailing spaces
+'"' // + a trailing quote
Mathematica, 75 bytes
a=" ";b=a...;Print[InputString[]~StringReplace~{b~~"\""~~b->"\"",a..->a}]
KDB(Q), 28 bytes
" "sv except[;enlist""]" "vs
Explanation
" "vs / cut string by space
except[;enlist""] / clear empty strings
" "sv / join back with space
Test
q)" "sv except[;enlist""]" "vs"12 34 ~5 6 (7, 8) - 9 - "
"12 34 ~5 6 (7, 8) - 9 -"
Powershell, 40 bytes
"`"$(($args-Replace' +'," ").trim())`""
Pretty straight forward and not very impressive.
Explanation
Take input parameter via (predfined) args-variable, replace all multiple spaces with one, trim leading and trailing spaces using trim()-method, add quotes. Powershell will print strings to console as default behavior.
Jq 1.5, 42 bytes
split(" ")|map(select(length>0))|join(" ")
Sample Run
$ 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
-
\$\begingroup\$ I caught the output issue earlier (see edit 5) but didn't notice the input issue. The command is fixed now. Thanks! \$\endgroup\$jq170727– jq1707272017年09月22日 14:30:33 +00:00Commented Sep 22, 2017 at 14:30
Tcl, 69 bytes
puts [string map {{ "} \" {" } \"} [regsub -all \ + [gets stdin] \ ]]
(削除)
Tcl, 79 bytes
puts \"[string trim [regsub -all \ + [string range [gets stdin] 1 end-1] \ ]]\"
(削除ここまで)
-
\$\begingroup\$ @KevinCruijssen Fixed. unfortunately, at the expense of many bytes. Tks for telling me. \$\endgroup\$sergiol– sergiol2017年09月22日 22:25:54 +00:00Commented Sep 22, 2017 at 22:25
Zsh, 15 bytes
<<<\"${(Qz)1}\"
Input string contains embedded quotes. Remove the Q
for 14 bytes if the input string does not contain embedded quotes, as is done in some of the other answers here.
Parameter expansion flags: Q
dequotes, then z
splits into words as the shell does. The words are then implicitly joined by spaces.
GolfScript, 8 bytes
' '%' '*
Explanation
The logic is quite simple:
' '% # Split on spaces, remove empty results
' '* # Join on spaces
Nim, 72 bytes
import strutils
echo'"',stdin.readAll[1..^2].splitWhitespace.join" ",'"'
Ignoring the IO restrictions as many answers do, 58 bytes:
import strutils
echo stdin.readAll.splitWhitespace.join" "
C (gcc), 82 bytes
char*s=&s+9;main(t){for(gets(s);*s;s++)*s>32|(s[1]>32&&s[2]&&t)&&putchar(*s,--t);}
K (ngn/k), (削除) 21 (削除ここまで) (削除) 18 (削除ここまで) (削除) 16 (削除ここまで) 15 bytes
" "/(~#:')_" "\
" "\
split (implicit) input on spaces(~#:')_
drop empty strings" "/
join remaining items with spaces
Fortran, 113 bytes
character(99)S;read(*,'(A)')S;S='"'//trim(adjustl(S))//'"'
do i=1,99;if(S(i:i+1)>' ')call fput(S(i:i));enddo;end
Per wikibooks, "It should be remembered that Fortran is designed for scientific computing and is probably not a good choice for writing a new word processor."
Fortran doesn't have a regex concept either. This just makes string challenges more interesting!
In this solution, we trim the string S
, then iterate over it. Print each character unless it's a space followed by another space.
Previously: (削除) 127 bytes (削除ここまで), (削除) 147 bytes (削除ここまで)
-
\$\begingroup\$ Other ideas failed!
print*
always prints a leading space and a new line. Writing to a new string (avoiding formatting directives) is annoying because gfortran fills it with garbage! Sigh \$\endgroup\$roblogic– roblogic2020年12月08日 12:47:28 +00:00Commented Dec 8, 2020 at 12:47 -
\$\begingroup\$ ...but
fput
is awesome. \$\endgroup\$roblogic– roblogic2021年03月12日 10:00:17 +00:00Commented Mar 12, 2021 at 10:00
ARBLE, 26 bytes
join(explode(s,"%S+")," ")
explode
groups by non-spaces, and then join
re-concatenates them.
golfua, 42 bytes
L=I.r():g('%s*\"%s*','"'):g('%s+',' ')w(L)
Simple pattern matching replacement: find any double quotes (\"
) surrounded by 0 or more spaces (%s*
) & return the single quote, then replace all 1 or more spaces (%s+
) with a single space.
A Lua equivalent would be
Line = io.read()
NoSpaceQuotes = Line:gsub('%s*\"%s*', '"')
NoExtraSpaces = NoSpaceQuotes:gsub('%s+', ' ')
print(NoExtraSpaces)
Cobra - 68
As an anonymous function:
do
print'"[(for s in Console.readLine.split where''<s).join(' ')]"'
must take input from stdin
, and later you say...or a function which takes input, and outputs the final string
. Does this mean the function must take input fromstdin
as well? \$\endgroup\$" "aa" "
-->""aa""
(are quotes valid inside the input string?) \$\endgroup\$" this "
, others process a once double quoted string which reaches the code with the double quotes already stripped off: ` this `. This way the answers and the languages'/authors' efficiencies are not really comparable. @CoolGuy, could you firmly clarify the requirement on this? \$\endgroup\$