Flippign Lettesr Aroudn


33

在聊天时,我们往往快typers和真的不看顺序字母发布消息前。由于我们很懒,因此我们需要一个程序来自动交换单词中的最后两个字母,但是由于我们不想响应太晚,因此代码必须简短。

您的任务(如果希望接受它)是编写一个程序,该程序翻转给定字符串中每个单词的最后两个字母(因此单词Thansk变成Thanks)。一个是在英文字母的分隔的两个或多个字母序列的单一空间。

  • 您确保输入的字符串/ 字符列表仅包含字母字符和空格(ASCII [97-122],[65-90]和32)。

  • 您可以使用任何编程语言,通过任何标准方法输入和提供输出,同时请注意,默认情况下,这些漏洞是禁止的。

  • 输出可能有一个尾随空格和/或一个尾随换行符。

  • 输入将始终仅包含单词(和相应的空格),并将至少包含一个单词。

这是代码高尔夫,因此每种语言的最短提交(以字节计)将获胜!

测试用例

请注意,字符串用引号引起来,以提高可读性。

输入->输出

“谢谢”->“谢谢”
“ Youer welcoem”->“不客气”
“这是一个苹果”->“这是苹果”
“ Flippign Lettesr Aroudn”->“翻转字母”
“具有可互换字母的奇制”->“具有可互换字母的奇制”

或者,为了方便测试套件,以下分别是输入及其对应的输出:

坦斯克
Youer welcoem
这是一个苹果
Flippign Lettesr Aroudn
带有可替换字母的胆小包
谢谢
别客气
思娜娜·阿佩尔
翻转字母
交换字母的奇特挑战

感谢DJMcMayhem的标题。这最初是CMC


我们可以输出一组单词吗?
毛茸茸的

@Shaggy不,输出必须为字符串(或默认情况下为字符列表)
Xcoder先生17年

我们可以在每个输入上请求一个尾随空格吗?
FlipTack

@FlipTack它 在初始版本中允许这样做,但是在发布任何要使用的答案之前,我已经删除了该规则。(部分原因是聊天中的一些用户告诉我,否则我将使其变得太简单了,我同意他们的观点)。不,这是不允许的。
Xcoder先生

1
@Fabian 一个词是一个序列两个或两个以上字母
Xcoder先生,2017年

Answers:


16

V,4 5字节

òeXp

在线尝试!

|| 表示光标

缓冲区以开头,|w|ord and more words光标位于第一个字符上。

递归地 ò

去到e一个单词的第二

wor|d| and more words

删除X光标左侧的字符

wo|d| and more words

p把它放在下一个字符上

wod|r| and more words

隐式结束ò,对其他单词重复相同的过程,直到到达缓冲区的末尾


2
正确的任务语言:)
DJMcMayhem

您的意思是“重复”而不是“递归”吗?
NieDzejkob

@NieDzejkob V维基使用“递归”一词来描述ò命令github.com/DJMcMayhem/V/wiki/Normal-Mode-Commands
Kritixi Lithos

10

果冻,7 个字节

Ḳœ?@€2K

单子链接,用于获取和返回字符列表

在线尝试!

怎么样?

Ḳœ?@€2K - Link: list of characters
Ḳ       - split at spaces
     2  - literal two
    €   - for €ach:
   @    -   with sw@pped arguments:
 œ?     -     nth permutation (the 2nd permutation has the rightmost elements swapped)
      K - join with spaces

这是对排列的一种很好的滥用。另类
Xcoder先生17年

@ Mr.Xcoder Ḳ2œ?ЀK也可以使用并使用单个快捷键。
丹尼斯

7

Brain-Flak,122字节

{(({})[((((()()){}){}){}){}])((){[()](<{}>)}{}){{}<>(({}({}))[({}[{}])])(<>)}{}({}<>)<>}<>(({}({}))[({}[{}])]){({}<>)<>}<>

在线尝试!

最糟糕的工作语言:)

可读稍微更可读的版本:

{
    (({})[((((()()){}){}){}){}])((){[()](<{}>)}{})

    {
        {}
        <>

        (({}({}))[({}[{}])])

        (<>)
    }
    {}

    ({}<>)<>

}<>

(({}({}))[({}[{}])])

{

    ({}<>)
    <>
}<>

我不敢相信这比Brainfuck版本更长……
Pureferret

@pureferret脑筋要比脑筋要长。主要是因为每个原始命令需要两个字节,而“ flask”需要两个字节。
DJMcMayhem



6

Python 3,50个字节

print(*(w[:-2]+w[:-3:-1]for w in input().split()))

在线尝试!

这个答案滥用了Python 3的打印行为:打印了多个参数,它们之间有一个空格。当然,我们不能只给它多个参数,因为我们不知道输入中将有多少个单词。因此,我们使用splat运算符。基本上

print(*[a,b,c])

与...完全一样

print(a,b,c)

滥用使得完整的程序比我们必须使用的函数/ lambda ' '.join或类似函数短。


看起来Python 2通过写入节省了2个字节for w in input().split():print w[:-2]+w[:-3:-1],。在Python 3中,提取最后两个字符非常适合,print(*(''.join(a)+c+b for*a,b,c in input().split()))a需要将其重新制成字符串。
xnor

5

Matlab(R2016b),51 50字节

@Giuseppe 节省了49个 50(!)字节。

function s(a),regexprep(a,'(\w)(\w)( |$)','$2$1 ')

和我以前的答案:

Matlab(R2016b),100字节

(只是为了乐趣:P)

function s(a),a=regexp(a,' ','split');for i=1:length(a),fprintf('%s ',a{i}([1:end-2 end end-1])),end

说明:

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
一个字符的单词不能出现,因为一个单词被定义为至少两个字符。
朱塞佩

regexprep在这里工作吗?像regexprep(a,'(\w*)(\w)(\w)','\1\3\2')什么?
朱塞佩

D =这个。是。史诗!我认为您应该发布此答案,因为它与我的完全不同。唯一的事情是Matlab使用$1而不是引用匹配项\1,所以是regexprep(a,'(\w*)(\w)(\w)','$1$3$2')
Thiago Oleinik

1
您应该将其作为单独的答案发布在此答案中;总是很高兴看看正则表达式是否可以帮助您解决字符串挑战!此外,我显然不了解MATLAB的正则表达式引擎,因此对我来说值得称赞是不公平的。
朱塞佩

1
function s(a),regexprep(a,'(\w)(\w)( |$)','$2$1 ')还短一个字节!
朱塞佩

5

C, 62   58  54字节

感谢@Dennis节省了 四个 八个字节!

f(char*s){s[1]>32||(*s^=s[-1]^=*s^=s[-1]);*++s&&f(s);}

在线尝试!


啊,基于异或的交换
Snowbody

4

Prolog(SWI),60字节

[A,B]+[B,A].
[A,B,32|U]+[B,A,32|Y]:-U+Y,!.
[A|U]+[A|Y]:-U+Y.

在线尝试!

说明

首先,我们定义基本情况:

p([A,B],[B,A]).

这意味着最后两个字母将始终被交换。

然后定义如果我们紧挨一个空格会发生什么:

p([A,B,32|U],[B,A,32|Y]):-p(U,Y),!.

如果两个字符串恰好在空格之前匹配,则交换该空格之前的字母,如果字符串匹配,则其余部分互换。然后!,我们使用削减。

最后一种情况是,如果我们不在空格旁边,则前两个字母需要匹配。

p([A|U],[A|Y]):-p(U,Y).

4

Wolfram语言,117字节

StringReplace[RegularExpression["\\b[[:alpha:]]{2,}\\b"]:>StringDrop[StringInsert["$0",StringTake["$0",{-1}],-3],-1]]

在线尝试!

应用于测试字符串。

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
欢迎来到PPCG!
Steadybox

@Steadybox谢谢。
Edmund

4

R111 51 41字节

由@Giuseppe提供,这是一种正则表达式方法,可将我的旧方法彻底抛弃。

cat(gsub("(.)(.)\\b",'\\2\\1',scan(,"")))

1
regex在这里效率更高:在线试用!
朱塞佩

(不是我不欣赏在R中执行纯字符串操作方法所需要的勇气)
Giuseppe


@Giuseppe哇,辛苦了!我已经将它们编辑为我的答案,尽管如果您希望自己做出答案,请继续!
rturnbull

1
不,不用担心。我又打了10个字节:移植了另一个正则表达式方法,以及旧方法的70个字节
Giuseppe

4

APL(Dyalog Classic),28字节

1↓∊((¯2↓⊢),2↑⌽)¨' '(,⊂⍨⊣=,)⍞

⎕ML而且⎕IO都是1

在线尝试!

说明

  • ... (,⊂⍨⊣=,) ... 拆分(同时保留边框,并在开始处添加边框)...
  • ... ⍞ ...输入...
  • ... ' ' ... ...在太空。
  • ... ( ... )¨ ... 然后,对每个元素:
    • ... , ... 连接...
    • ... (¯2↓⊢) ... ...除了最后两个以外的所有项目...
    • ... 2↑⌽ ... ...与最后两个元素相反。
  • 1↓∊ ... 最后,返回除拼合结果的第一个元素以外的所有元素。

返回所有,但第一
亚当



3

J20 19 11字节

归功于@Bolce Bussiere

1&A.&.>&.;:

在线尝试!

       &.;:      on words
    &.>          on each
  A.             apply the permutation
1&               number 1, swap the last two elements

1
13字节,带(1&A.&.>)&.;:
Bolce Bussiere,

@BolceBussiere完美
FrownyFrog

你能补充一个解释吗?想知道是否可以将其移植到K上以减少解决方案中令人尴尬的字节数!
streetster '18

3

爱丽丝,24字节

/0RR'.%$1\' o
\ix*o ne@/

在线尝试!

说明

/...\' o
\.../

这形成一个循环,其中循环主体是线性序数片段,我们执行 ' o在每两次循环迭代之间以Cardinal模式。后者只是打印一个空格。

展开顺序代码的之字形结构,线性循环主体实际上如下所示:

iR*' %e10xRo.n$@

分解如下:

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.

刚刚注意到,字母交换可以用三个字节(h~Z)而不是四个(e10x)完成,但是我没有看到一种调整布局以实际节省整个字节的方法。
马丁·恩德

2

brainfuck109 100字节

编辑:不必处理一个字母的单词

,[>++++[-<-------->],]>+[-<[>++++[<++++++++>-]<[->>+<<]<]<<[->>+<<]>[[-<+>]>]<<[>+>+>]-<]>>>>>>>[.>]

在线尝试!

打印尾随空格

怎么运行的

,[>++++[-<-------->],] 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

先前版本,109字节

,[>++++[-<-------->],]>+[-<[>++++[<++++++++>-]<[->>+<<]<]<<[[->>+<<]>[[-<+>]>]<<[<]]>[>]<[>+>+>]-<]>>>>>>[.>]

在线尝试!



1

PHP119107字节

编辑:感谢totalhuman

<?php foreach(explode(" ",trim(fgets(STDIN)))as$w)echo substr($w,0,strlen($w)-2).strrev(substr($w,-2))," ";

在线尝试!


1
您不能创建$word一个字符变量名称吗?
totallyhuman

@totallyhuman是的!我编写了完整版本,然后进行了压缩,但没有注意到。谢谢。
Zerquix18年

答案中可以省略PHP开放标签,从而节省6个字节。
Daniel W.

我想知道是否fgets(STDIN)也可以省略或替换它$x,就像不是所有答案都将输入的内容都算进他们的答案中一样
Daniel W.

trim()应该没有必要。
泰特斯(Titus),

1

Haskell,41个字节

foldr(%)" "
a%(b:' ':r)=b:a:' ':r
a%s=a:s

在线尝试!

输出带有尾随空格。

重复' ':r看起来很浪费。但是a%(b:t@(' ':r))=b:a:t长度是一样的,并且长a%(b:t)|' ':_<-t=b:a:t一个字节。


Haskell,41个字节

f(a:b:t)|t<"A"=b:a:f t|1>0=a:f(b:t)
f e=e

在线尝试!


1

sed20 17 + 1(-r)= 18个字节

s/(.)(.)\b/\2\1/g

在线尝试!


TIO链接与您发布的代码不匹配。TIO链接长几个字节。
Xcali

糟糕,修复了链接
Noskcaj

您可以删除|$。它什么也没做。(要执行您期望的操作(.)(.)(\b|$),但这不是必需的,因为它\b已经与字符串的末尾匹配了。)
Jordan

哎呀,打算摆脱它。谢谢,
Noskcaj

1

PHP,65字节

需要PHP 7.1(或更高版本)

for(;$s=$argv[++$i];$s[-1]=$s[-2],$s[-2]=$c,print"$s ")$c=$s[-1];

将句子作为单独的命令行参数。用运行-nr


在单个字符串上工作, 77 + 1个字节

foreach(explode(" ",$argn)as$s){$c=$s[-1];$s[-1]=$s[-2];$s[-2]=$c;echo"$s ";}

与一起作为管道运行-nR


...或在线尝试


1

Java 8,35字节

s->s.replaceAll("(.)(.)\\b","$2$1")

我打完两个字节后,@ TaylorScott的Google表格答案的端口。编辑:在我打完两个字节之后,我现在看到的是Neil的Retina应答端口。

说明:

在线尝试。

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

1

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)


Both (\w) can be golfed to (.) if I'm not mistaken. The \b is already an indication to look for words only. (Not entirely sure though, but it works in Java.)
Kevin Cruijssen

@KevinCruijssen - You are absolutely correct, it can be. Thank you!
Taylor Scott

1

JavaScript (Node.js), 38 36 32 bytes

s=>s.replace(/(.)(.)( |$)/g,"$2$1 ") 
s=>s.replace(/(.)(.)\b/g,"$2$1")

Try it online!

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


Doesn't matter if there are more spaces, I think
l4m2

@l4m2 But if there are more spaces then it will become a 38 for s=>s.replace(/(.)(.)( +|$)/g,"$2$1$3").
Shieru Asakoto

@l4m2 BTW my original answer was s=>s.replace(/(.)(.)(\s|$)/g,"$2$1$3")
Shieru Asakoto

ab abc abcd abcde abcdef does ab_, bc_, cd_, de_, ___, ef_, ___
l4m2

1
F=s=>s.replace(/(.)(.)(?!\w)/g,"$2$1") same length
l4m2

1

K (oK), 23 22 bytes

" "/{x@prm[!#x]1}'" "\

Try it online!

Example:

" "/{x@prm[!#x]1}'" "\"Hello World"
"Helol Wordl"

Explanation:

Port of FrownyFrog's solution to save 1 byte.

I'll come back to this.

" "/{prm[x]1}'" "\ / the solution
              " "\ / split input on " "
    {       }'     / apply lambda to each
     prm[x]        / permute input x
           1       / and take the 2nd result
" "/               / join with " "

Previous solution:

  • " "/-2{(x_y),|x#y}'" "\ 23 bytes

1

05AB1E, 7 bytes

#vy`sðJ

Try it online!

-1 thanks to Magic Octopus Urn.

Prints one trailing space.


This is 11 bytes
Daniel W.

2
@DanFromGermany No, 05AB1E has a code page in which this can be represented as 8 bytes.
Erik the Outgolfer

Can you run the program represented in 8 bytes?
Daniel W.

@DanFromGermany Yes, the 05AB1E interpreter can run this program from a file in the 05AB1E encoding.
Erik the Outgolfer

1
@MagicOctopusUrn It's not a list though, it's after `.
Erik the Outgolfer


0

SNOBOL4 (CSNOBOL4), 136 119 bytes

	I =INPUT
B	I SPAN(&LCASE &UCASE) . Y ARBNO(' ') =:F(O)
	Y RPOS(2) REM . Z =REVERSE(Z)
	O =O Y ' '	:(B)
O	OUTPUT =O
END

Try it online!

Prints with a trailing space. You know you've done something wrong when a language is a backronym for StriNg Oriented and symBOlic Language and your code is longer than Brain-Flak :( now it's slightly better.

Line B takes I and replaces (alphabetic characters saved as Y)(some number of spaces) with the empty string.

The following line extracts the last 2 characters of Y as Z and replaces them as Z reversed, then the next line concatenates O, Y, and a single space character.

Finally, it prints when I no longer matches the required pattern in line B.


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.