她w口渴了!


27

给定一个列表或定界字符串,输出一个列表或定界字符串,其中每个单词的第一个字符一个单词。

对于此挑战,“单词”仅包含所有可打印的ASCII字符,空格,换行符和制表符除外。

例如,使用字符串“世界下午好!”。(以空格分隔):

1. String
"Good afternoon, World!"

2. Get the first characters:
"[G]ood [a]fternoon, [W]orld!"

3. Move the characters over. The character at the end gets moved to the beginning.
"[W]ood [G]fternoon, [a]orld!"

4. Final string
"Wood Gfternoon, aorld!"

这是,所以最短的代码获胜!

测试用例:

Input -> output (space-delimited)

"Good afternoon, World!" -> "Wood Gfternoon, aorld!"
"This is a long sentence." -> "shis Ts i aong lentence."
"Programming Puzzles and Code Golf" -> Grogramming Puzzles Pnd aode Colf"
"Input -> output" -> "onput I> -utput"
"The quick brown fox jumped over the lazy dog." -> "dhe Tuick qrown box fumped jver ohe tazy log."
"good green grass grows." -> "good green grass grows."

输出中是否允许尾随空格?
Business Cat

我们可以假设单词之间最多有一个空格吗?
数学迷

根据一些字母可以相互遵循的规则,您将拥有一个spistererism生成器en.wikipedia.org/wiki/Spoonerism
显示名称为

@BusinessCat是的。
“ SparklePony同志” 17年

@mathjunkie是的。
“ SparklePony同志” 17年

Answers:



8

Japt11 10 9 8字节

利用了Japt的索引包装和负索引。

ËhUgEÉ g

在线尝试


说明

        :Implicit input of array U (each element is an individual word).
Ë       :Map over the array.
h       :Replace the first character of the current element (word) ...
Ug      :  with the word in the array at index ...
EÉ      :    current index (E) -1's ...
g       :  first character.
        :Implicit output of array of modified words

我认为您也可以将输入作为列表,在¸
ETHproductions中

@ETHproductions可能有点麻烦,但我会问。编辑:在这里
粗野的

1
是的,在帖子的开头,它说“给出列表或定界的字符串”,但不确定它已经存在多长时间了(我想这是自从首次发布挑战以来)。
ETHproductions's

好东西!使用h是个好主意。我想出了用您的技术£g´Y ¯1 +XÅ可以将它变成XhUg´Y 1的方法。
奥利弗·

5

Haskell,43个字节

p%((a:b):r)=(p:b):a%r
_%e=e
(%)=<<head.last

在线尝试!使用字符串列表进行输入和输出。

记住前一个单词的第一个字母p,并递归地将其作为当前单词的第一个字母,同时沿链发送新的第一个字母。前一个首字母被初始化为最后一个单词的首字母。


4

Ruby,85 77 63字节

可以肯定,这可能会更短。

编辑:感谢@manatwork的收集->地图

a=gets.split;$><<a.zip(a.rotate -1).map{|x,y|y[0]+x[1..-1]}*' '

您可以将.collect和都替换.each.map
manatwork '17

1
-p标记(+1字节)并i=-2;gsub(r=/\b\w/){$_.scan(r)[i+=1]}最终打球
Value Ink


4

CJam12 10 9字节

感谢jimmy23013,节省了1个字节

q~Sf+:()o

将输入作为单词列表。

在线尝试!

说明

     e# Example input: ["Good" "afternoon," "World!"]
q~   e# Read and eval the input.
     e# STACK: [["Good" "afternoon," "World!"]]
Sf+  e# Append a space to each word.
     e# STACK: [["Good " "afternoon, " "World! "]]
:(   e# Remove the first character from each substring.
     e# STACK: [["ood " 'G "fternoon, " 'a "orld! " 'W]]
)o   e# Remove and print the last element of the array.
     e# STACK: [["ood " 'G "fternoon, " 'a "orld! "]]
     e# Implicitly join the remaining array with no separator and output.

您可以将输入和输出作为列表。
SparklePony同志'17

@ComradeSparklePony您确认我回答后:P现在打高尔夫球
商务猫

)o1m>
jimmy23013

3

V,7个字节

Îxjp
{P

在线尝试!

说明:

Î       " On every line:
 x      "   Delete the first character
  j     "   Move down a line
   p    "   And paste a character (into column 2)
{       " Move to the beginning of the input
 P      " And paste the last thing we deleted (into column 1)

3

JavaScript(ES6),46个字节

s=>s.map((k,i)=>s.slice(i-1)[0][0]+k.slice(1))

利用slice(-1)返回数组的最后一个元素的事实。

片段


您可以删除加入吗?问题指出您可以输出列表。这将节省8个字节
克雷格·艾尔

1
@CraigAyre,甜蜜,谢谢!
里克·希区柯克

3

VIM,16,9个字节

<C-v>GdjPGD{P

@Wossname节省了7个字节!

每行输入一个单词,例如

Hello
world
and
good
day
to
you

我认为应该没问题,因为允许将输入作为列表。

在线尝试!


如果您照原样手工操作,则只需12次按键即可完成。不知道如何在此处阐明该语法,或者不确定在此难题中这样做是否有效。^vGdjPGd$ggP (其中^ v是[control + v]键的组合,只需确保从光标在左上方开始并处于命令模式下)
Wossname

@Wossname啊,好主意!我添加了一些小东西来节省更多的字节(例如dd -> Dgg -> })。感谢您的提示!
DJMcMayhem

我不知道dd和gg的版本都较短!
太棒了

在代码中字母v周围使用“上标HTML标签”而不是“ <Cv>”怎么样?当在Answer中看到时,这将使代码看起来正确的长度。因此,您的代码看起来像... <sup> V </ sup> GdjPGD {P...。当stackexchange网页正确格式化它时,它看起来很整洁。
Wossname

1
我看到,花括号在各段之间跳来跳去,在这里起作用了,因为我们只处理一个段落。凉。哇,这使在大型代码文件中快速滚动变得非常容易!感谢您的提示。:)
Wossname

3

> <>44 45字节

90.f3+0.>&i&01.>~r&l0=?;o20.
 i:" "=?^:1+ ?!^

假设使用空格分隔的单词。

亚伦改正后加了1个字节


2

Python 2,74个字节

在线尝试

S=input().split()
print' '.join(b[0]+a[1:]for a,b in zip(S,S[-1:]+S[:-1]))

-5个字节,感谢@Rod


@Rod好建议,谢谢!
死负鼠

4
S[:-1]可以缩短为S; 不同长度的压缩列表会自动截断较长的
朱利安·沃尔夫

2

Haskell,50个字节

f=zipWith(:).((:).last<*>init).map head<*>map tail

输入和输出是单词列表。


1
函数可以是未命名的,因此可以省略f=
nimi

1
哦,很酷,我没有意识到Haskell可以使用在线编译器。由于我错了,我将删除自己的评论^^
Fund Monica的诉讼

2

PHP,62字节

$c=end($_GET);foreach($_GET as$g)echo$g|$g[0]=$c^$g^$c=$g,' ';

2

C#,78 77字节

using System.Linq;a=>a.Select((s,i)=>a[i-->0?i:a.Count-1][0]+s.Substring(1));

编译为Func<List<string>, IEnumerable<string>>完整/格式化版本:

using System;
using System.Collections.Generic;
using System.Linq;

class P
{
    static void Main()
    {
        Func<List<string>, IEnumerable<string>> f = a =>
                a.Select((s, i) => a[i-- > 0 ? i : a.Count - 1][0] + s.Substring(1));

        Console.WriteLine(string.Join(" ", f(new List<string>() { "Good", "afternoon,", "World!" })));
        Console.WriteLine(string.Join(" ", f(new List<string>() { "This", "is", "a", "long", "sentence." })));

        Console.ReadLine();
    }
}

2

Brachylog,12个字节

{hᵐ↻|bᵐ}ᶠzcᵐ

在线尝试!

说明

Example input: ["Good","afternoon,","World!"]

{      }ᶠ       Find: [["W","G","a"],["ood","fternoon,","orld!"]]
 hᵐ↻              Take the head of each string, cyclically permute them
    |             (and)
     bᵐ           Get the strings without their heads
         z      Zip: [["W","ood"],["G","fternoon,"],["a","orld!"]]
          cᵐ    Map concatenate on each list: ["Wood","Gfternoon,","aorld!"]

2

R,72 70字节

function(x)paste0(substr(x,1,1)[c(y<-length(x),2:y-1)],substring(x,2))

在线尝试

感谢Giuseppe,节省了2个字节。

输入和输出是列表。取一个由前几个字母组成的子字符串,将最后一个字母循环到最前面,并将其与每个单词其余部分的子字符串粘贴在一起。骑自行车是致命的杀手,但我想不出办法进一步减少骑车。


1
您可以使用2:y-1代替,1:(y-1)因为:优先级最高-可节省2个字节。
朱塞佩


2

Python 2 + Numpy,104个字节

from numpy import *
s=fromstring(input(),"b")
m=roll(s==32,1)
m[0]=1
s[m]=roll(s[m],1)
print s.tobytes()

1
您需要在字节数中包含import语句。很酷的答案!
SparklePony同志'17

同样,您需要输入和输出字节数的代码
Felipe Nardi Batista

1
我认为您可以将最后的换行符删除1个字节。
与Orjan约翰森

@ØrjanJohansen是的,也可以用“ b”代替“ u1”,所以-2个字节。
米哈伊尔诉V


1

Mathematica,59个字节

""<>#&/@Thread@{RotateRight@#~StringTake~1,#~StringDrop~1}&

在线尝试!

获取并返回单词列表。

如果您希望采用并返回字符串,则可以使用87个字节:

StringRiffle[Thread@{RotateRight@#~StringTake~1,#~StringDrop~1}&@StringSplit@#," ",""]&


1

kdb +,25 22字节

解:

rotate[-1;1#'a],'1_'a:

例:

q)rotate[-1;1#'a],'1_'a:("The";"quick";"brown";"fox";"jumped";"over";"the";"lazy";"dog.")
"dhe"
"Tuick"
"qrown"
"box"
"fumped"
"jver"
"ohe"
"tazy"
"log."

说明:

1_'a:             // (y) drop first character of each element of a
,'                // join each left with each right
rotate[-1;1#'a]   // (x) take first character of each element of a, rotate backwards 1 char

额外:

需要常规字符串(37个字节)的版本:

q){" "sv rotate[-1;1#'a],'1_'a:" "vs x}"The quick brown fox jumped over the lazy dog."
"dhe Tuick qrown box fumped jver ohe tazy log."



0

Mathematica,134个字节

(w=Characters@StringSplit@#;d=Drop[w,0,1];StringRiffle[StringJoin/@Table[PrependTo[d[[i]],RotateRight[First/@w][[i]]],{i,Length@w}]])&



0

C,106 77字节

i,a,b;f(char*o){a=*o;for(i=0;o[i++];)if(o[i]==32){b=o[++i];o[i]=a;a=b;}*o=a;}

来自scottinet的-29字节

就地修改字符串。

取消高尔夫:

char *f(char *o){
    char a=*o,b; // start with a as the first character of the first word
    for(int i=0;++i<strlen(o);){
        // iterate through the string with i as the index
        if(o[i]==32){ // if the current character is a space, 
                      // i.e. if a word begins after this character
            b=o[++i]; // store the beginning of the next word in b
            o[i]=a; // set the beginning of the next word to a
            a=b; // set a to what the beginning of the next work used to be
        }
    }
    *o=a; 
    // set the beginning of the first word to the old beginning of the last word
}

Golfier版本提案(完全相同的代码):- 29个字节
scottinet



0

外壳,11个字节

Foz:ṙ_1TmΓ,

输入和输出为字符串列表,请在线尝试!

(标题只是将输入转换为单词列表,并用空格将输出列表连接起来。)

说明

F(z:ṙ_1)TmΓ,  -- example input: ["Good" "afternoon,","World!"]
         m    -- map the following (example on "Good")
          Γ   -- | pattern match head & tail: 'G' "ood"
           ,  -- | construct tuple: ('G',"ood")
              -- : [('G',"ood"),('a',"fternoon,"),('W',"orld!")]
        T     -- unzip: ("GaW",["ood","fternoon,","orld!"])
F(     )      -- apply the function to the pair
    ṙ_1       -- | rotate first argument by 1 (to right): "WGa"
  z:          -- | zip the two by (example with 'W' and "ood")
              -- | | cons/(re)construct string: "Wood"
              -- :-: ["Wood","Gfternoon,","aorld!"]

备用,11个字节

§oz:ṙ_1m←mt

在线尝试!


0

AWK,63字节

{for(R=substr($NF,1,1);++j<=NF;R=r)sub(r=substr($j,1,1),R,$j)}1

在线尝试!

似乎应该有一种减少冗余的方法,但是我没有看到它。

注意:TIO链接有4个额外的字节,以允许多行输入。

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.