In chat, we are often fast-typers and don't really look at the order of letters before posting a message. Since we are lazy, we need a program that automatically swaps the last two letters in our words, but since we don't want to respond too late, the code must be short.
Your task, if you wish to accept it, is to write a program that flips the last two letters of each word in a given string (so the word Thansk turns into Thanks). A word is a sequence of two or more letters in the English alphabet delimited by a single space.
The string / list of characters you receive as input is guaranteed to only contain alphabetic characters and spaces (ASCII [97 - 122], [65 - 90] and 32).
You can take input and provide output through any standard method, in any programming language, while taking note that these loopholes are forbidden by default.
The output may have one trailing space and / or one trailing newline.
The input will always contain words only (and the corresponding whitespace) and will consist of at least one word.
This is code-golf, so the shortest submission (scored in bytes), in each language wins!
Test cases
Note that the strings are surrounded with quotes for readability.
Input -> Output "Thansk" -> "Thanks" "Youer welcoem" -> "Youre welcome" "This is an apple" -> "Thsi si na appel" "Flippign Lettesr Aroudn" -> "Flipping Letters Around" "tHe oDd chALlEneg wiht swappde lettesR" -> "teH odD chALlEnge with swapped letteRs"
Or, for test suite convenience, here are the inputs and their corresponding outputs separately:
Thansk Youer welcoem This is an apple Flippign Lettesr Aroudn tHe oDd chALlEneg wiht swappde lettesR
Thanks Youre welcome Thsi si na appel Flipping Letters Around teH odD chALlEnge with swapped letteRs
Thanks to DJMcMayhem for the title. This was originally a CMC.
-
\$\begingroup\$ May we output an array of words? \$\endgroup\$Shaggy– Shaggy2017年12月27日 22:03:51 +00:00Commented Dec 27, 2017 at 22:03
-
\$\begingroup\$ @Shaggy No, the output must be a string (or a list of characters by default) \$\endgroup\$Mr. Xcoder– Mr. Xcoder2017年12月27日 22:04:47 +00:00Commented Dec 27, 2017 at 22:04
-
\$\begingroup\$ May we request a trailing space on each input? \$\endgroup\$FlipTack– FlipTack2017年12月29日 12:23:21 +00:00Commented Dec 29, 2017 at 12:23
-
1\$\begingroup\$ Whta shoudl eb doen wiht oen lettre worsd liek "a"? \$\endgroup\$Fabian Röling– Fabian Röling2017年12月29日 14:08:09 +00:00Commented Dec 29, 2017 at 14:08
-
2\$\begingroup\$ @Fabian A word is a sequence of two or more letters \$\endgroup\$Mr. Xcoder– Mr. Xcoder2017年12月29日 14:12:13 +00:00Commented Dec 29, 2017 at 14:12
48 Answers 48
V, 4 (削除) 5 (削除ここまで) bytes
òeXp
|| denotes the cursor
The buffer starts with |w|ord and more words and the cursor being on the first character.
Recursively ò
go to the end of a word
wor|d| and more words
remove X the character to the left of the cursor
wo|d| and more words
paste it over the next character
wod|r| and more words
Implicit ending ò, repeat the same process for other words until the end of the buffer is reached
-
2\$\begingroup\$ The right language for the task :) \$\endgroup\$DJMcMayhem– DJMcMayhem2017年12月27日 22:52:26 +00:00Commented Dec 27, 2017 at 22:52
-
\$\begingroup\$ Do you mean "Repeatedly" instead of "Recursively"? \$\endgroup\$Maya– Maya2017年12月30日 15:09:36 +00:00Commented Dec 30, 2017 at 15:09
-
\$\begingroup\$ @NieDzejkob The V wiki uses the word "recursively" to describe the
òcommand github.com/DJMcMayhem/V/wiki/Normal-Mode-Commands \$\endgroup\$user41805– user418052017年12月30日 18:06:54 +00:00Commented Dec 30, 2017 at 18:06
Jelly, (削除) 7 (削除ここまで) 6 bytes
-1 with the May 2018 introduction of the Ɱ quick (previously it was only available as the two-byte Ѐ).
Ḳ2œ?ⱮK
A monadic link taking and returning lists of characters
How?
Ḳ2œ?ⱮK - Link: list of characters
Ḳ - split at spaces
2 - literal two
Ɱ - map with:
œ? - nth permutation (the 2nd permutation has the rightmost elements swapped)
K - join with spaces
-
\$\begingroup\$ That's a nice abuse of permutations. Alternative \$\endgroup\$Mr. Xcoder– Mr. Xcoder2017年12月27日 20:21:22 +00:00Commented Dec 27, 2017 at 20:21
-
\$\begingroup\$ @Mr.Xcoder
Ḳ2œ?ЀKalso works and uses a single quick. \$\endgroup\$Dennis– Dennis2017年12月28日 03:40:12 +00:00Commented Dec 28, 2017 at 3:40
Brain-Flak, 122 bytes
{(({})[((((()()){}){}){}){}])((){[()](<{}>)}{}){{}<>(({}({}))[({}[{}])])(<>)}{}({}<>)<>}<>(({}({}))[({}[{}])]){({}<>)<>}<>
The worst language for the job :)
(削除) Readable (削除ここまで) Slightly more readable version:
{
(({})[((((()()){}){}){}){}])((){[()](<{}>)}{})
{
{}
<>
(({}({}))[({}[{}])])
(<>)
}
{}
({}<>)<>
}<>
(({}({}))[({}[{}])])
{
({}<>)
<>
}<>
-
\$\begingroup\$ I can't believe this is longer than the Brainfuck version... \$\endgroup\$AncientSwordRage– AncientSwordRage2017年12月28日 12:46:12 +00:00Commented Dec 28, 2017 at 12:46
-
\$\begingroup\$ @pureferret Brain-flak tends to be longer than brainfuck. Mostly cause it requires two bytes per primitive command, where brain-flak requires two. \$\endgroup\$DJMcMayhem– DJMcMayhem2017年12月28日 13:21:40 +00:00Commented Dec 28, 2017 at 13:21
Python 3, 50 bytes
print(*(w[:-2]+w[:-3:-1]for w in input().split()))
This answer abuses Python 3's behavior of print: Multiple arguments are printed with a single space between them. Of course, we can't just give it multiple arguments because we don't know how many words will be in the input. So we use the splat operator. Basically
print(*[a,b,c])
is exactly the same thing as
print(a,b,c)
Abusing that makes a full program turn out shorter than a function/lambda where we'd have to use ' '.join or something similar.
-
\$\begingroup\$ Looks like Python 2 saves 2 bytes by writing
for w in input().split():print w[:-2]+w[:-3:-1],. In Python 3, extracting the last two characters would work well withprint(*(''.join(a)+c+b for*a,b,c in input().split()))except thataneeds to be remade into a string. \$\endgroup\$xnor– xnor2017年12月28日 04:01:29 +00:00Commented Dec 28, 2017 at 4:01
Haskell, 40 bytes
(f=<<).words
f[a,b]=b:a:" "
f(x:r)=x:f r
Try it online! Usage example: (f=<<).words $ "abc xyz" yields "acb xzy ".
-
\$\begingroup\$ So you're telling me the shortest approach is both the approaches combined? >_< \$\endgroup\$totallyhuman– totallyhuman2017年12月27日 21:16:54 +00:00Commented Dec 27, 2017 at 21:16
Matlab (R2016b), (削除) 51 (削除ここまで) 50 bytes
Saved (削除) 49 (削除ここまで) 50 (!) bytes thanks to @Giuseppe.
function s(a),regexprep(a,'(\w)(\w)( |$)','2ドル1ドル ')
And my previous answer:
Matlab (R2016b), 100 bytes
(Just for the fun of it :P)
function s(a),a=regexp(a,' ','split');for i=1:length(a),fprintf('%s ',a{i}([1:end-2 end end-1])),end
Explanation:
function s(a) % Defining as a function...
a=regexp(a,' ','split'); % Splits the input string at the spaces
for i=1:length(a) % Loops through each word
fprintf('%s ',a{i}([1:end-2 end end-1])) % And prints everything with the last two characters swapped.
end
-
1\$\begingroup\$ one character words can't happen, as a word is defined to be at least two characters. \$\endgroup\$Giuseppe– Giuseppe2017年12月27日 20:30:49 +00:00Commented Dec 27, 2017 at 20:30
-
\$\begingroup\$ would
regexprepwork here? Something likeregexprep(a,'(\w*)(\w)(\w)','1円3円2円')? \$\endgroup\$Giuseppe– Giuseppe2017年12月27日 20:53:50 +00:00Commented Dec 27, 2017 at 20:53 -
\$\begingroup\$ D= This. Was. Epic! I think you should post this answer, since it's totally different from mine. The only thing is that Matlab references the matches with
1ドル, and not1円, so it would beregexprep(a,'(\w*)(\w)(\w)','1ドル3ドル2ドル'). \$\endgroup\$Thiago Oleinik– Thiago Oleinik2017年12月27日 20:59:37 +00:00Commented Dec 27, 2017 at 20:59 -
1\$\begingroup\$ you should post it as a separate answer / in this answer; it's always good to see if a regex would help or not on a string challenge! Besides, I clearly don't understand MATLAB's regex engine, so it wouldn't quite be fair for me to take credit for it. \$\endgroup\$Giuseppe– Giuseppe2017年12月27日 21:02:16 +00:00Commented Dec 27, 2017 at 21:02
-
1\$\begingroup\$
function s(a),regexprep(a,'(\w)(\w)( |$)','2ドル1ドル ')is still another byte shorter! \$\endgroup\$Giuseppe– Giuseppe2017年12月27日 23:30:32 +00:00Commented Dec 27, 2017 at 23:30
C, (削除) 62 (削除ここまで) (削除) 58 (削除ここまで) 54 bytes
Thanks to @Dennis for saving (削除) four (削除ここまで) eight bytes!
f(char*s){s[1]>32||(*s^=s[-1]^=*s^=s[-1]);*++s&&f(s);}
-
\$\begingroup\$ ah, the xor-based swap \$\endgroup\$Snowbody– Snowbody2017年12月29日 14:52:30 +00:00Commented Dec 29, 2017 at 14:52
-
\$\begingroup\$ How is
s[-1]safe? I get how it works in the recursive runs (at the end after*++s), but on the first pass shouldn't it be undefined behavior? \$\endgroup\$Bbrk24– Bbrk242022年04月06日 01:48:39 +00:00Commented Apr 6, 2022 at 1:48 -
-
\$\begingroup\$ 49 bytes clang \$\endgroup\$jdt– jdt2025年08月22日 15:55:27 +00:00Commented Aug 22 at 15:55
Prolog (SWI), 60 bytes
[A,B]+[B,A].
[A,B,32|U]+[B,A,32|Y]:-U+Y,!.
[A|U]+[A|Y]:-U+Y.
Explanation
First we define the base case:
p([A,B],[B,A]).
This means that the last two letters will always be swapped.
Then we define what happens if we are right next to a space:
p([A,B,32|U],[B,A,32|Y]):-p(U,Y),!.
Two strings match if right before a space the letters before the space are swapped and the remainder if the strings match. We then use ! to cut.
Our last case is if we are not next to a space the first two letters need to match.
p([A|U],[A|Y]):-p(U,Y).
Wolfram Language, 117 bytes
StringReplace[RegularExpression["\\b[[:alpha:]]{2,}\\b"]:>StringDrop[StringInsert["0ドル",StringTake["0ドル",{-1}],-3],-1]]
Applied to the test strings.
StringReplace[
RegularExpression["\\b[[:alpha:]]{2,}\\b"] :>
StringDrop[StringInsert["0ドル", StringTake["0ドル", {-1}], -3], -1]] /@
{"Thansk", "Youer welcoem", "This is an apple",
"Flippign Lettesr Aroudn", "tHe oDd chALlEneg wiht swappde lettesR"} // Column
Thanks Youre welcome Thsi si na appel Flipping Letters Around teH odD chALlEnge with swapped letteRs
-
4\$\begingroup\$ Welcome to PPCG! \$\endgroup\$Steadybox– Steadybox2017年12月27日 21:06:31 +00:00Commented Dec 27, 2017 at 21:06
R, (削除) 111 (削除ここまで) (削除) 51 (削除ここまで) 41 bytes
Courtesy of @Giuseppe, a regex approach which blows my old method out of the water.
cat(gsub("(.)(.)\\b",'\2円\1円',scan(,"")))
-
1\$\begingroup\$ regex are much more efficient here: Try it online! \$\endgroup\$Giuseppe– Giuseppe2017年12月27日 20:48:12 +00:00Commented Dec 27, 2017 at 20:48
-
\$\begingroup\$ (not that I don't appreciate the guts it takes to do a pure string manipulation approach in R) \$\endgroup\$Giuseppe– Giuseppe2017年12月27日 20:50:47 +00:00Commented Dec 27, 2017 at 20:50
-
\$\begingroup\$ 84 byte golf of your approach \$\endgroup\$Giuseppe– Giuseppe2017年12月27日 23:22:11 +00:00Commented Dec 27, 2017 at 23:22
-
\$\begingroup\$ @Giuseppe Wow, nice work! I've edited them into my answer, although if you'd prefer to make your own answer please go ahead! \$\endgroup\$rturnbull– rturnbull2017年12月28日 01:10:54 +00:00Commented Dec 28, 2017 at 1:10
-
1\$\begingroup\$ nah, don't worry about it. I golfed down another 10 bytes: porting another regex approach, and a 70 byte of your old approach \$\endgroup\$Giuseppe– Giuseppe2017年12月28日 15:14:18 +00:00Commented Dec 28, 2017 at 15:14
J, (削除) 20 19 (削除ここまで) 11 bytes
Credit to @Bolce Bussiere
1&A.&.>&.;:
&.;: on words
&.> on each
A. apply the permutation
1& number 1, swap the last two elements
-
1\$\begingroup\$ 13 Bytes with
(1&A.&.>)&.;:\$\endgroup\$Bolce Bussiere– Bolce Bussiere2017年12月31日 19:24:44 +00:00Commented Dec 31, 2017 at 19:24 -
\$\begingroup\$ @BolceBussiere perfect \$\endgroup\$FrownyFrog– FrownyFrog2018年01月01日 18:27:23 +00:00Commented Jan 1, 2018 at 18:27
-
\$\begingroup\$ Could you add an explanation? Wondering if I can port it to K to reduce the embarrassing byte count of my solution! \$\endgroup\$mkst– mkst2018年01月01日 21:18:09 +00:00Commented Jan 1, 2018 at 21:18
APL (Dyalog Classic), 28 bytes
1↓∊(( ̄2↓⊢),2↑⌽) ̈' '(,⊂⍨⊣=,)⍞
⎕ML and ⎕IO are both 1,
Explanation
... (,⊂⍨⊣=,) ...Split (while keeping borders, and appending a border to the beginning) ...... ⍞... the input ...... ' ' ...... at spaces.... ( ... ) ̈ ...Then, to each element of that:... , ...Concatenate ...... ( ̄2↓⊢) ...... every item except the last two ...... 2↑⌽ ...... with the reverse of the last two elements.
1↓∊ ...Finally, return all but the first element of the flattened result.
-
\$\begingroup\$ return all but the first \$\endgroup\$Adám– Adám2018年02月01日 11:18:58 +00:00Commented Feb 1, 2018 at 11:18
Alice, 24 bytes
/0RR'.%1ドル\' o
\ix*o ne@/
Explanation
/...\' o
\.../
This forms a loop where the loop body is a linear Ordinal snippet and we execute ' o in Cardinal mode between every two loop iterations. The latter just prints a space.
Unfolding the zigzag structure of the Ordinal code, the linear loop body actually looks like this:
iR*' %e10xRo.n$@
Breaking this down:
i Read all input. On subsequent iterations, this will push an empty string.
R Reverse.
* Join. On the first iteration, this joins the input to an implicit empty string,
which does nothing. On subsequent iterations, it will join the empty string to
the word on top of the string, thereby getting rid of the empty string.
' % Split around spaces. On the first iteration, this will split the input
into individual words. On subsequent iterations, this does nothing.
e10 Push "10".
x Use this to permute the (reversed) word on top of the stack. In
particular, the word is rearranged with the same permutation that is
required to sort the string "10", which means the first two letters
get swapped (which correspond to the last two letters of the actual
word).
R Reverse the swapped word.
o Print it.
.n$@ If there are no words left on the stack, terminate the program.
-
\$\begingroup\$ Just noticed that the letter swap can be done in three bytes (
h~Z) instead of four (e10x), but I'm not seeing a way to adjust the layout to actually save a byte overall with that. \$\endgroup\$Martin Ender– Martin Ender2018年01月03日 13:52:32 +00:00Commented Jan 3, 2018 at 13:52
brainfuck, (削除) 109 (削除ここまで) 100 bytes
Edit: don’t have to handle one letter words
,[>++++[-<-------->],]>+[-<[>++++[<++++++++>-]<[->>+<<]<]<<[->>+<<]>[[-<+>]>]<<[>+>+>]-<]>>>>>>>[.>]
Prints a trailing space
How It Works
,[>++++[-<-------->],] Puts input on the tape and subtracts 32 from each character
This separates each word
>+[- Start the loop
<[>++++[<++++++++>-]<[->>+<<]<] Add 32 to each letter of the word
Skip this on the first iteration for the last word
<<[->>+<<]>[[-<+>]>] Swaps the last two letters of the word
<<[>+>+>]- If there is another word to the left continue loop
Also set up to add a space to the end of the word
<] End loop
>>>>>>>[.>] Print the modified string
Previous version, 109 bytes
,[>++++[-<-------->],]>+[-<[>++++[<++++++++>-]<[->>+<<]<]<<[[->>+<<]>[[-<+>]>]<<[<]]>[>]<[>+>+>]-<]>>>>>>[.>]
Google Sheets, 33 Bytes
Anonymous worksheet function that takes input from cell A1 and outputs to the calling cell
=RegExReplace(A1,"(.)(.)\b","2ドル1ドル
-2 Bytes Thanks to @KevinCruijssen for the use of (.) over (\w)
-
\$\begingroup\$ Both
(\w)can be golfed to(.)if I'm not mistaken. The\bis already an indication to look for words only. (Not entirely sure though, but it works in Java.) \$\endgroup\$Kevin Cruijssen– Kevin Cruijssen2018年02月01日 10:54:18 +00:00Commented Feb 1, 2018 at 10:54 -
\$\begingroup\$ @KevinCruijssen - You are absolutely correct, it can be. Thank you! \$\endgroup\$Taylor Raine– Taylor Raine2018年02月01日 17:52:38 +00:00Commented Feb 1, 2018 at 17:52
Curry, 33 bytes
Tested in both KiCS2 and PAKCS.
f(u++[x,y])=u++[y,x]
(>>=f).words
Curry's powerful patterns let it beat the Haskell answer!
To test it you can use Smap. Just select KiCS2 2.2.0 or PAKCS 2.2.0 and paste the following complete code:
f(u++[x,y])=u++[y,x]
g=(>>=f).words
main=f "Hello world an happy day"
-
\$\begingroup\$ The TIO link does not match your posted code. The TIO link is a few bytes longer. \$\endgroup\$Xcali– Xcali2017年12月28日 03:06:48 +00:00Commented Dec 28, 2017 at 3:06
-
\$\begingroup\$ Whoops, fixed the link \$\endgroup\$Noskcaj– Noskcaj2017年12月28日 03:14:46 +00:00Commented Dec 28, 2017 at 3:14
-
\$\begingroup\$ You can remove
|$. It's not doing anything. (For it to do what you expect you'd need(.)(.)(\b|$), but that's not necessary because\balready matches the end of the string.) \$\endgroup\$Jordan– Jordan2017年12月28日 19:42:36 +00:00Commented Dec 28, 2017 at 19:42 -
\$\begingroup\$ Whoops, meant to get rid of that. Thanks, \$\endgroup\$Noskcaj– Noskcaj2017年12月28日 19:58:54 +00:00Commented Dec 28, 2017 at 19:58
-
\$\begingroup\$ Nice solution! Came up with very similar (but using
-040). You can use(.)instead of(\w)as the input will only ever have letters to save 2. If using-040you can also reaplace\bwith$and, using;instead of/, drop/g: Try it online! \$\endgroup\$Dom Hastings– Dom Hastings2021年07月15日 11:10:50 +00:00Commented Jul 15, 2021 at 11:10
PHP, (削除) 119 (削除ここまで) 107 bytes
Edit: thanks to totallyhuman
<?php foreach(explode(" ",trim(fgets(STDIN)))as$w)echo substr($w,0,strlen($w)-2).strrev(substr($w,-2))," ";
-
1\$\begingroup\$ Can't you make
$worda single character variable name? \$\endgroup\$totallyhuman– totallyhuman2017年12月28日 00:33:47 +00:00Commented Dec 28, 2017 at 0:33 -
\$\begingroup\$ @totallyhuman Yup! I wrote the full version and then compressed it, but didn't notice that. Thanks you. \$\endgroup\$Zerquix18– Zerquix182017年12月28日 03:33:16 +00:00Commented Dec 28, 2017 at 3:33
-
\$\begingroup\$ PHP open tags can be omitted in the answer saving you 6 bytes. \$\endgroup\$Daniel W.– Daniel W.2017年12月28日 12:26:17 +00:00Commented Dec 28, 2017 at 12:26
-
\$\begingroup\$ I wonder if
fgets(STDIN)can be omitted or replaced by$xtoo, like not all answers do count the input to their answers \$\endgroup\$Daniel W.– Daniel W.2017年12月28日 12:32:02 +00:00Commented Dec 28, 2017 at 12:32 -
\$\begingroup\$
trim()should be unnecessary. \$\endgroup\$Titus– Titus2017年12月29日 08:55:28 +00:00Commented Dec 29, 2017 at 8:55
Haskell, 41 bytes
foldr(%)" "
a%(b:' ':r)=b:a:' ':r
a%s=a:s
Outputs with a trailing space.
The repeated ' ':r looks wasteful. But a%(b:t@(' ':r))=b:a:t is the same length and a%(b:t)|' ':_<-t=b:a:t is one byte longer.
Haskell, 41 bytes
f(a:b:t)|t<"A"=b:a:f t|1>0=a:f(b:t)
f e=e
Haskell, (削除) 53 (削除ここまで) 45 bytes
u[a,b]=[b,a]
u(a:b)=a:u b
unwords.map u.words
Explanation
u is a function that swaps the last two letters of a word. To apply it to all the words we use words to split the list, map it across all of the words and then use unwords to put it back together.
-
\$\begingroup\$ You seem to have included the
f=from TIO in your byte count, even though it's not included in your answer here. \$\endgroup\$Kritzefitz– Kritzefitz2017年12月27日 23:55:21 +00:00Commented Dec 27, 2017 at 23:55 -
\$\begingroup\$ How do you pass the input to your program? Does
main=print$f"Hello World"not count to the program? \$\endgroup\$Daniel W.– Daniel W.2017年12月28日 12:27:56 +00:00Commented Dec 28, 2017 at 12:27 -
\$\begingroup\$ @Kritzefitz Thanks! I've adjusted it. \$\endgroup\$2017年12月28日 18:26:44 +00:00Commented Dec 28, 2017 at 18:26
-
\$\begingroup\$ @DanFromGermany My program makes a point-free function
unwords.map u.words. You call it like any other Haskell function.main=print$f"Hello World"does not count because my submission is a function and not a program. \$\endgroup\$2017年12月28日 18:28:43 +00:00Commented Dec 28, 2017 at 18:28
Clean, (削除) 75 (削除ここまで) 59 bytes
-16 from Laikoni
@[a,b]=[b,a]
@[a,b,' ':c]=[b,a,' ': @c]
@[a:b]=[a: @b]
@e=e
-
\$\begingroup\$ This seems to work fine without
import StdEnv. \$\endgroup\$Laikoni– Laikoni2017年12月28日 13:28:18 +00:00Commented Dec 28, 2017 at 13:28 -
\$\begingroup\$ Also moving
@[]=[]to the bottom and replacing it by@e=esaves two more bytes: Try it online! \$\endgroup\$Laikoni– Laikoni2017年12月28日 13:32:52 +00:00Commented Dec 28, 2017 at 13:32
PHP, 65 bytes
requires PHP 7.1 (or later)
for(;$s=$argv[++$i];$s[-1]=$s[-2],$s[-2]=$c,print"$s ")$c=$s[-1];
takes sentence as separate command line arguments. Run with -nr.
working on a single string, 77+1 bytes:
foreach(explode(" ",$argn)as$s){$c=$s[-1];$s[-1]=$s[-2];$s[-2]=$c;echo"$s ";}
Run as pipe with -nR.
... or try them online.
Java 8, 35 bytes
s->s.replaceAll("(.)(.)\\b","2ドル1ドル")
Port of @TaylorScott's Google Sheets answer, after I golfed two bytes. EDIT: I see it's now a port of Neil's Retina answer after my two golfed bytes.
Explanation:
s-> // Method with String as both parameter and return-type
s.replaceAll("(.)(.) // Replace any two characters,
\\b", // with a word-boundary after it (space or end of String)
"2ドル1ドル") // With the two characters swapped
JavaScript (Node.js), (削除) 38 (削除ここまで) (削除) 36 (削除ここまで) 32 bytes
(削除) s=>s.replace(/(.)(.)( |$)/g,"2ドル1ドル ") (削除ここまで)
s=>s.replace(/(.)(.)\b/g,"2ドル1ドル")
RegExp approach courtesy @Giuseppe (although I thought of this independently), assuming words separated by only one space
-2 for only considering 1 space and add trailing space
-4 Thanks @Shaggy
-
\$\begingroup\$ Doesn't matter if there are more spaces, I think \$\endgroup\$l4m2– l4m22017年12月28日 09:48:12 +00:00Commented Dec 28, 2017 at 9:48
-
\$\begingroup\$ @l4m2 But if there are more spaces then it will become a 38 for
s=>s.replace(/(.)(.)( +|$)/g,"2ドル1ドル3ドル"). \$\endgroup\$Shieru Asakoto– Shieru Asakoto2017年12月28日 09:49:16 +00:00Commented Dec 28, 2017 at 9:49 -
\$\begingroup\$ @l4m2 BTW my original answer was
s=>s.replace(/(.)(.)(\s|$)/g,"2ドル1ドル3ドル")\$\endgroup\$Shieru Asakoto– Shieru Asakoto2017年12月28日 09:51:01 +00:00Commented Dec 28, 2017 at 9:51 -
\$\begingroup\$
ab abc abcd abcde abcdefdoesab_,bc_,cd_,de_,___,ef_,___\$\endgroup\$l4m2– l4m22017年12月28日 09:55:11 +00:00Commented Dec 28, 2017 at 9:55 -
1\$\begingroup\$
F=s=>s.replace(/(.)(.)(?!\w)/g,"2ドル1ドル")same length \$\endgroup\$l4m2– l4m22017年12月28日 10:08:14 +00:00Commented Dec 28, 2017 at 10:08