谁有一个中间名逗号?


18

您的挑战是将名称(字符串)作为输入,例如

Albert Einstein

并输出:

Einstein, Albert

伪代码:

set in to input
set arr to in split by " "
set last to the last element of arr
remove the last element of arr
set out to arr joined with " "
prepend ", " to out
prepend last to out
output out

更多测试用例:

John Fitzgerald Kennedy => Kennedy, John Fitzgerald
Abraham Lincoln => Lincoln, Abraham

规则

  • 输入将始终与正则表达式匹配^([A-Z][a-z]+ )+([A-Z][a-z]+)$
  • 您不需要处理奇怪的名称,即使输出在技术上不正确,也可以在此处使用。
  • 尾随空格/换行符可以。
  • 任何问题?在下面发表评论!

是否允许尾随空格?
价值墨水

我闭口不谈,因为解决方案几乎可以le用sip替换,,并且您有这个问题
Downgoat

2
@Downgoat挑战指定了两个单词,而对此的解决方案必须适用于任意多个单词。据我所知,与TIO链接的答案,只有认真解决方案给出了这个问题,用正确的答案le,
ngenisis

7
@Downgoat有-4。至少将其关闭,以作为其欺骗手段。
斯蒂芬

1
尾随行吗?
汤姆·卡彭特

Answers:


10

05AB1E,7个字节

码:

',ì#Áðý

使用05AB1E编码。在线尝试!

说明:

',ì         # Prepend the input to ","
   #        # Split on spaces
    Á       # Rotate every element one position to the right (wrapping)
     ðý     # Join the array by spaces

1
顶一下!我知道必须有一种方法可以以列表形式进行。
Emigna '17

9

JavaScript(ES6),34个字节

s=>s.replace(/(.+) (.+)/,'$2, $1')

演示:

let f = s=>s.replace(/(.+) (.+)/,'$2, $1')

;[ 'Albert Einstein', 'John Fitzgerald Kennedy', 'Abraham Lincoln' ].forEach(
  s => console.log(`${s} => ${f(s)}`)
)



7

果冻,7个字节

;”,Ḳṙ-K

在线尝试!

我不太了解Jelly,但在阅读其他答案时,似乎他们没有使用最佳算法...所以这里是:

说明

;”,Ḳṙ-K
;”,        Append a comma to the end of the string
   Ḳ       Split on spaces
    ṙ-     Rotate the array by -1 (1 time towards the right)
      K    Join with spaces

7

Vim,10个字节/击键

v$F dA, <esc>p

在线尝试!


不错,但我一直努力使其无法正常工作,<esc>但未在您的代码中显示。注意:假设该名称是在编辑器中编写的,并且当前位于正常模式下的文件开头,请注意。
sigvaldm '17

7

V / vim,9 8字节

$bD0Pa, 

在线尝试!

由于节省了一个字节

请注意有一个尾随空格字符。留下尾随空格,这是规则允许的。

说明:

$       " move the cursor to the end of the line
 b      " move the cursor to the beginning of the current word
  D     " delete to the end of the line
   0    " move the cursor to the start of the line
    P   " paste in front of the cursor.
     a  " append (enter insert mode with the cursor one character forward)
      , " Literal text, ", "

好一个!最好将插入模式放在最后以避免需要<esc>。您可以通过$bD代替来保存一个字节$diw。:)
DJMcMayhem

谢谢。$bD但是不处理一个字符的名称,我问过OP是否允许。
凯文

看起来是这样,所以更新。
凯文




5

C,45个字节

编辑:我刚才注意到输入的要求可能有两个以上的单词。我将保留原样,并留意这仅适用于两个单词。

编辑:删除了\n。如果您认为有必要,请添加2个字节。

main(a,b)int**b;{printf("%s, %s",b[2],b[1]);}

使用gcc name.c,GCC 6.3.1进行编译。忽略警告。用法:

$./a.out Albert Einstein
Einstein, Albert

滥用语言:

  • 的隐式返回类型intmain不返回任何内容。
  • 的隐式声明printf。无论如何,GCC都会包含它。
  • 错误的类型b。没关系%s

感谢@ Khaled.K提供了使用main(a,b)int**b;而不是的提示main(int a, int **b)


不错的第一场高尔夫球main(a,**b){printf("%s, %s",b[2],b[1]);}
比赛

谢谢:)我实际上考虑过完全省略类型,但是由于某种原因它无法编译。
sigvaldm

1
这有效main(a,b)int**b;{printf("%s, %s\n",b[2],b[1]);}
Khaled.K


4

sed,19 + 1表示-E = 20字节

s/(.*) (.*)/\2, \1/

必须使用-r(GNU)或-E(BSD,最近的GNU),以避免必须转义分组括号。

如果在命令行上编写,则必须用引号引起来,以避免被shell解析为多个标记:

sed -E 's/(.*) (.*)/\2, \1/'

4

C,68字节

希望添加另一篇文章没错,但这是与我先前发布的C解决方案稍有不同的解决方案。此名称可以接受任意数量的名称。

main(a,b)int**b;{for(printf("%s,",b[--a]);--a;printf(" %s",*++b));}

编译为gcc name.c(GCC 6.3.1)并忽略警告。用法:

$./a.out John Fitzgerald Kennedy
Kennedy, John Fitzgerald

感谢@ Khaled.K提供的提示 main(a,b)int**b;

感谢您对@Alkano的for循环的提示。


1
您可以使用for而不是while来获得2个字节 main(a,b)int**b;{for(printf("%s,",b[--a]);++b,--a;printf(" %s",*b));}
Alkano

这听起来很疯狂,但您可以执行此操作main(a,b)int**b;{a&&printf("%s,"b[a-1])&&main(a-1,b);}
Khaled.K,2017年

非常棒的技巧:)我从未想过要递归调用main。但这并不完全有效。输出为“ Kennedy,Fitzgerald,John,。/ a.out”,部分解决方案是main(a,b)int**b;{--a&&printf("%s, ",b[a])&&main(a,b);}。它短了2个字节,并确保您不打印程序名称,但每个名称之间仍使用逗号。
sigvaldm '17

3

Mathematica,45个字节

#/.{a__,s=" ",b__}/;{b}~FreeQ~s->{b,",",s,a}&

通过将输入作为字符列表而不是字符串,可以在ngenisis的答案上节省几个字节。使用模式替换规则的纯函数。

Mathematica,49个字节

#~Join~{","," "}~RotateLeft~Last@Position[#," "]&

另一个纯函数,将字符列表作为输入并返回字符列表。这将追加","并添加" "到输入,然后旋转字符列表,直到最后一个空格在末尾。(因此,与上面的第一个函数不同,输出具有尾随空格。)


#/.{a__,s=" ",b:Except@s..}->{b,",",s,a}&4字节数要短一些,但是我发现Except对于字符串模式而言,这是不必要的,可以节省12字节。
ngenisis

嗯,它会自动选择x答案中最长的吗?
格雷格·马丁

是的,字符串模式匹配是贪婪的,但是常规模式匹配是懒惰的。
ngenisis

不错的<波浪白旗>
格雷格·马丁

3

C#,76 72字节

s=>System.Text.RegularExpressions.Regex.Replace(s,"(.+) (.+)","$2, $1");

在@KevinCruijssen的帮助下保存了4个字节

旧版本使用76个字节的子字符串:

s=>s.Substring(s.LastIndexOf(' ')+1)+", "+s.Substring(0,s.LastIndexOf(' '));

1
太糟糕了System.Text.RegularExpressions.Regex,这在C#中太长s=>new System.Text.RegularExpressions.Regex("(.+) (.+)").Replace(s,"$2, $1");了。
凯文·克鲁伊森

1
@KevinCruijssen是的,但是我可以使用静态方法Regex来保存4个字节
TheLethalCoder

3

Awk,18个字符

{$1=$NF", "$1}NF--

样品运行:

bash-4.4$ awk '{$1=$NF", "$1}NF--' <<< 'John Fitzgerald Kennedy'
Kennedy, John Fitzgerald

在线尝试!



2

05AB1E,9个字节

#`',«.Áðý

在线尝试!

说明

#           # split input on spaces
 `          # push each name separately to stack
  ',«       # concatenate a comma to the last name
     .Á     # rotate stack right
       ðý   # join stack by spaces

是的,我可能应该通过空间命令加入连接:p
Adnan

@Adnan:很高兴看到它的使用频率:)
Emigna

2

Pyth,11个字节

jd.>c+z\,d1

说明:

jd.>c+z\,d1
     +z\,      Append the "," to the input
    c+z\,d     Split the string on " "
  .>c+z\,d1    Rotate the array one element right
jd.>c+z\,d1    Join the array on " "

在线测试!



2

MATLAB / 八度,37字节

@(a)regexprep(a,'(.+) (.+)','$2, $1')

在线尝试!

基于@ngenisis的Retina答案,我们还可以在Octave和MATLAB中玩正则表达式游戏,比我以前的答案节省了几个字节。


旧答案:

考虑到与简单的正则表达式相比,这是一种更独特的方式,我也将在这里留下这个答案。

八度49 47字节

@(a)[a((b=find(a==32)(end))+1:end) ', ' a(1:b)]

旧的在线试用!

匿名函数生成输出。

基本上,代码首先使用来查找字符串中的最后一个空格b=find(a==32)(end)。然后,使用来获取字符串的结尾部分(在空格之后)a(b+1:end),其中b是找到最后一个空格的输出。它还以开头字符串a(1:b-1),并将两者', '之间的a串联在一起。

与典型的相比,我已经节省了一些字节find(a==32,1,'last')。不太确定还有很多要节省。


2

果冻,9个字节

ḲµṪ;⁾, ;K

解释为:

ḲµṪ;⁾, ;K
Ḳ           # Split the input by spaces
 µ          # Separate the link into two chains. Essentially calls the right half with the split string monadically.
  Ṫ         # The last element, (The last name), modifying the array.
   ;        # Concatenated with...
    ⁾,      # The string literal; ", "
       ;    # Concatenated with...
        K   # The rest of the array, joined at spaces.

在线尝试!

尝试所有测试用例。


2

Python 3,52个字节

lambda s:s.split()[-1]+", "+" ".join(s.split()[:-1])

很简单,可以使用高尔夫帮助。只需将最后一个单词放在最前面,然后将它们与“,”连接起来。

测试用例:

>>> f=lambda s:s.split()[-1]+", "+" ".join(s.split()[:-1])
>>> f("Monty Python")
'Python, Monty'
>>> f("Albus Percival Wulfric Brian Dumbledore")
'Dumbledore, Albus Percival Wulfric Brian'


2

Java,110 62字节

String d(String s){return s.replaceAll("(.+) (.+)","$2, $1");}

非静态方法。

-48字节感谢Kevin Cruijssen


String c(String s){int i=s.lastIndexOf(' ');return s.substring(i+1)+", "+s.substring(0,i);}较短(91个字节)。
凯文·克鲁伊森

并且String d(String s){return s.replaceAll("(.+) (.+)","$2, $1");}甚至更短(62个字节)。
凯文·克鲁伊森

@KevinCruijssen哦,天哪。谢谢!我应该学会更好地使用正则表达式:P
HyperNeutrino

2

PHP 62 59字节

-3个字节,谢谢Jörg

$a=explode(' ',$argn);echo array_pop($a).', '.join(' ',$a);

在线尝试!

旧解决方案,63字节

如果此人有3个重复的名字,则此方法无效。

<?=($a=strrchr($argv[1]," ")).", ".str_replace($a,'',$argv[1]);

在线尝试


您可以使用$argn,而不是$argv[1]
约尔格Hülsermann

2

Excel中,174个 170 168字节

感谢Wernisch,节省了2个字节

=MID(A1,FIND("^",SUBSTITUTE(A1," ","^",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))+1,LEN(A1))&", "&LEFT(A1,FIND("^",SUBSTITUTE(A1," ","^",LEN(A1)-LEN(SUBSTITUTE(A1," ","")))))

这不是幻想或聪明。这是一个相当基本的方法。感觉数组公式应该有更短的方法,但是我找不到有效的方法。


解决方案仅适用于存在三个名称的情况。例如,不处理“爱因斯坦”。
Wernisch

@Wernisch谢谢!现在应该可以工作了。
Engineer Toast

根据问题允许尾随空格。认为您可以通过省略-1LEFT函数中的来节省2个字节。
Wernisch '17


1

MATL,10字节

44hYb1YSZc

在线尝试!

说明

44h    % Implicitly input a string. Postpend a comma
       % STACK: 'John Fitzgerald Kennedy,'
Yb     % Split on spaces
       % STACK: {'John', 'Fitzgerald', 'Kennedy,'}
1YS    % Circularly shift 1 step to the right
       % STACK: {'Kennedy,', 'John', 'Fitzgerald'}
Zc     % Join with spaces between. Implicitly display
       % STACK: 'Kennedy, John Fitzgerald'

1

Gema,23个字符

* =@append{s; *}
\Z=,$s

唯一值得注意的是,挑战如何克服了Gema模式非贪婪的弱点。

样品运行:

bash-4.4$ echo -n 'John Fitzgerald Kennedy' | gema '* =@append{s; *};\Z=,$s'
Kennedy, John Fitzgerald
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.