世界以ed结尾


21

直接取自2013年ACM冬季编程竞赛。您是一个喜欢从字面上看事物的人。因此,对您而言,《世界的尽头》已编辑。“ The”和“ World”的最后一个字母串联在一起。

编写一个包含句子的程序,并以尽可能小的空间(最小字节)输出该句子中每个单词的最后一个字母。单词之间用字母以外的字母分隔(ASCII表上的65-90、97-122)。这意味着下划线,波浪号,坟墓,花括号等是分隔符。每个单词之间可以有多个分隔符。

asdf jkl;__zxcv~< vbnm,.qwer| |uiop-> flvmrp
pigs, eat dogs; eat Bob: eat pigs-> ststbts
looc si siht ,gnitirw esreveR-> citwR
99_bottles_of_beer_on_the_wall->sfrnel


您可以添加一个包含数字和下划线的测试用例吗?
grc

10
世界以ed结尾?我知道 vim和Emacs无法衡量!
Joe Z.

嗯,据我所知,“真正的男人使用ed”文章一直是Emacs发行版的一部分。
JB

输入将仅是ASCII吗?
Phil H

Answers:


16

Perl 5,18个字节

s/\pL*(\pL)|./$1/g

需要-p命令行开关。named属性L仅匹配字母字符A-Za-z。有几百个这样的命名属性,但是当处理ASCII文本时,很少有它们是有趣的。此外\pL,任何真实音符中唯一的另一个是\pP,它与标点符号匹配。

在线尝试!


Perl 5,17个字节

Dom Hastings改进了一个字节

print/\pL*(\pL)/g

需要-n(并-l支持多个输入)。

在线尝试!


样品用法

$ more in.dat
asdf jkl;__zxcv~< vbnm,.qwer| |uiop
pigs, eat dogs; eat Bob: eat pigs
looc si siht ,gnitirw esreveR
99_bottles_of_beer_on_the_wall

$ perl -p ends-in-ed.pl < in.dat
flvmrp
ststbts
citwR
sfrnel

我认为\w还可以匹配数字和下划线。
grc 2013年

嗯,的确如此。那将需要更新。
2013年

2
辉煌。正则表达式是一个显而易见的解决方案,但|.并不明显(至少对我而言)。
彼得·泰勒

1
只是注意到-1print/\pL*(\pL)/g,似乎输出同样为你的测试用例!
Dom Hastings

18

ed,35个字符

s/[a-zA-Z]*\([a-zA-Z]\)\|./\1/g
p
Q

因此,世界以ed结尾。就像我太直白了一样,我决定用ed编写解决方案,显然这实际上是一种编程语言。即使考虑到该线程中已经存在许多更短的解决方案,它也很短。如果我可以使用以外的其他[a-zA-Z]语言,那就更好了,但是考虑到ed不是一种编程语言,它实际上已经足够好了。

首先,我想说这仅解析文件的最后一行。可以解析更多内容,只需,在两个第一行(此指定的“所有”范围,而不是标准的最后一行范围)的开头键入内容,但是这会将代码大小增加到37个字符。

现在进行解释。第一行与Perl解决方案完全一样(不支持Unicode字符除外)。我没有复制Perl解决方案,我只是偶然地发明了类似的东西。

第二行显示最后一行,因此您可以看到输出。第三行强制退出-我必须这样做,否则ed会打印出来?以提醒您您尚未保存文件。

现在介绍如何执行它。好吧,这很简单。ed像这样通过管道运行我的程序时,只需运行包含测试用例的文件即可。

ed -s testcase < program

-s保持沉默。这样可以防止ed在开始时输出难看的文件大小。毕竟,我将其用作脚本,而不是编辑器,因此不需要元数据。如果我不这样做,ed将显示我无法避免的文件大小。


我安装ed只是为了尝试这个。
2013年

6

Javascript,49

alert(prompt().replace(/.(?=[a-z])|[^a-z]/gi,''))

它使用正则表达式删除字母前面的所有字符以及所有非字母字符。然后剩下每个单词的最后一个字母。

感谢tomsmeding进行了很好的改进。


3
您可以通过使正则表达式不区分大小写来改善此效果,例如:alert(prompt().replace(/.(?=[a-z])|[^a-z]/gi,''))
修改

6

C,78

打高尔夫球:

main(int c,char**s){for(;c=*s[1]++;)isalpha(c)&&!isalpha(*s[1])?putchar(c):0;}

带空格:

main(int c,char**s)
{
  for(;c=*s[1]++;)
    isalpha(c)&&!isalpha(*s[1])?putchar(c):0;
}

输出:

在此处输入图片说明


1
您可以使用K&R声明和默认设置来保存4个字节cmain(c,s)char**s;{for
Toby Speight,

5

GNU Sed,40 38 37

s/[a-z]\b/&\n/g; s/[^\n]*\(.\)\n/\1/g

测试中

cat << EOF > data.txt
asdf jkl;__zxcv~< vbnm,.qwer| |uiop
pigs, eat dogs; eat Bob: eat pigs
looc si siht ,gnitirw esreveR
EOF

运行sed:

sed 's/[A-Za-z]\b/&\n/gi; s/[^\n]*\(.\)\n/\1/g' data.txt

输出:

flvmrp
ststbts
citwR

说明

第一次替换用换行符替换所有单词边界,在该单词边界之前是所需的匹配组。这样可以轻松删除第二个替换中的所有多余字符。

编辑

  • 使用不区分大小写的标志(-2),感谢manatwork
  • 不要计算空格(-1)。

seds命令具有i用于不区分大小写匹配的标志:s/[a-z]\b/&\n/gi
manatwork 2013年

@manatwork:好点,这只会使它成为GNU sed,但似乎已经是,谢谢。
2013年

\b认为_s到是字母,所以如果在测试中的任何字END_,这个词的最后一个字母不包括在输出
马蒂·尼尔

3

Grep and Paste,36 34 28

> echo 'asdf jkl;__zxcv~< vbnm,.qwer| |uiop' | grep -io '[a-z]\b' | tr -d \\n
flvmrp

> echo 'pigs, eat dogs; eat Bob: eat pigs'   | grep -io '[a-z]\b' | tr -d \\n
ststbts

echo 'looc si siht ,gnitirw esreveR'         | grep -io '[a-z]\b' | tr -d \\n
citwR

如果需要最后一个换行符,请替换tr -d \\npaste -sd ''

编辑

  • 使用不区分大小写的grep(-2),感谢manatwork
  • 使用tr代替paste(-4),谢谢manatwork
  • 不要计算管道(-2)周围的空格。

颇具创意paste -sd '',但tr -d \\n更短。至于grep,它具有-i开关,意思是“忽略大小写”,它可以使短:grep -io '[a-z]\b'
manatwork

@manatwork,tr也删除最后的换行符。不区分大小写的模式当然要短一些,谢谢。
2013年

没有规则要求最后换行。
manatwork 2013年

@manatwork:我可以同意这个最新答案。
2013年

3

sed,37个字符

Thor的回答长度相等,但我认为更简单。

s/[a-z]*\([a-z]\)/\1/ig;s/[^a-z]*//ig

逻辑很简单-用最后一个字母替换字母序列,然后删除所有非字母。


3

Mathematica,39岁

""<>StringCases[#,(__~~x_)?LetterQ:>x]&

测试:

""<>StringCases[#,(__~~x_)?LetterQ:>x]& /@
 {"asdf jkl;__zxcv~< vbnm,.qwer| |uiop",
  "pigs, eat dogs; eat Bob: eat pigs",
  "looc si siht ,gnitirw esreveR",
  "99_bottles_of_beer_on_the_wall"}
{"flvmrp", "ststbts", "citwR", "sfrnel"}

好一个 LetterQ应该叫做LettersQ:)我还没有考虑过要测试整个字符串。
belisarius博士13年

@belisarius实际上,通过此构造,它是按字符应用的,因此它可以是字面的“ LetterQ”,并且仍然有效。
威兹德先生

2

K,49

{last'f@&"b"$#:'f:"|"\:@[x;&~x in,/.Q`a`A;:;"|"]}

k){last'f@&"b"$#:'f:"|"\:@[x;&~x in,/.Q`a`A;:;"|"]}"asdf jkl;__zxcv~< vbnm,.qwer| |uiop"
"flvmrp"
k){last'f@&"b"$#:'f:"|"\:@[x;&~x in,/.Q`a`A;:;"|"]}"pigs, eat dogs; eat Bob: eat pigs"
"ststbts"
k){last'f@&"b"$#:'f:"|"\:@[x;&~x in,/.Q`a`A;:;"|"]}"looc si siht ,gnitirw esreveR"
"citwR"

2

Scala,59岁(或43岁)

假设字符串已经在s

s.split("[^a-zA-Z]+").map(_.last).mkString

如果你需要从一个提示,阅读和打印而不是使用REPL输出,转换sreadLine在包裹println()59。


2

x86:54个字节

假定一个带有签名的cdecl例程void world_end(char *input, char *output)

60 8b 74 24 24 8b 7c 24 28 33 d2 8a 0e 8a c1 24
df 3c 41 72 08 3c 5a 77 04 8a d1 eb 09 84 d2 74
05 88 17 47 33 d2 46 84 c9 75 e0 84 d2 74 03 88
17 47 88 0f 61 c3

1
顺便说一句,我意识到这个问题需要一个程序而不是一个例程,但是我想做些不同的事情。与问题陈述相反,我想我毕竟不是一个“喜欢从字面上看事情的人”。:P
user1354557

2

,32

println$ @{=>.-1}<>input re"\W+"

Xi是一种仍处于测试阶段的语言,但是它似乎可以与代码高尔夫一起很好地工作,因此我认为我不妨展示另一种简短且实用的解决方案(并稍微宣传一下该语言:-)。


2

Mathematica 62 57 52

Row@StringTake[StringCases[#,LetterCharacter..],-1]&

测试中

l = {"asdf jkl;__zxcv~<vbnm,.qwer| |uiop", 
     "pigs,eat dogs;eat Bob:eat pigs", 
     "looc si siht,gnitirw esreveR"}

Row@StringTake[StringCases[#,LetterCharacter..],-1]&/@ l
(*{flvmrp,ststbts,citwR}*)

我错误地编辑了您的内容,但后来又回滚了。哎呀
DavidC

2

Python3,59个字符

import re;print(re.sub('.(?=[a-z])|[^a-z]','',input(),0,2))

正确处理大写字母和下划线。2是通过re.sub所述re.IGNORECASE标志而不必使用re.I


2

Python,76个字符

import re;print "".join(re.findall("([a-zA-Z])(?=$|[^a-zA-Z])",raw_input()))


您可以在之后删除空格print
flornquake 2013年

通过移植到Python 3来缩短:import re;print(*re.findall("([a-zA-Z])(?=$|[^a-zA-Z])",input()),sep='')
Steven Rumbalski 2013年

1

Python 3.x,64字节

import re;print(''.join(a[-1] for a in re.split('\W+',input())))

2
最后一个示例不起作用。此外,如果行以分隔符开始或结束,则会发生错误
AMK 2013年

您可以在之前删除空格for
Bakuriu


1

Mathematica 71 47 45 61

@belisarius在代码中发现错误后,返回到绘图板。

StringCases[#, RegularExpression["[A-Za-z](?![A-Za-z])"]] <> "" &

测试中

l = {"asdf jkl;__zxcv~<vbnm,.qwer| |uiop", "asdf jkl__zxcv~<vbnm,.qwer| |uiop", 
"pigs,eat dogs;eat Bob:eat pigs", "looc si siht,gnitirw esreveR"};

StringCases[#, RegularExpression["[A-Za-z](?![A-Za-z])"]] <> "" & /@ l

{“ flvmrp”,“ flvmrp”,“ ststbts”,“ citwR”}


\\w匹配_,因此不适用于(例如)"asdf jkl__zxcv~<vbnm,.qwer| |uiop"
belisarius博士

等待Row@StringTake[ StringCases[#, LetterCharacter ..], -1] &@"asdf jkl__zxcv~<vbnm,.qwer| |uiop"给我flvmrp,但是#~StringCases~RegularExpression@"\\w\\b" <> "" &@"asdf jkl__zxcv~<vbnm,.qwer| |uiop"回到fvmrp这里。我们得到相同的结果吗?
belisarius博士2013年

@belisarius您对我的早期版本中的错误是正确的。我正在用错误的字符串进行测试!
DavidC

呵呵,再次+1
belisarius博士2013年

@belisarius伙计们,请参阅我发布的答案。如果正确,则较短。
威兹德先生

1

蟒蛇2,88 80 75 69 68

s=p=''
for c in raw_input()+' ':a=c.isalpha();s+=p[a:];p=c*a
print s

输入: 435_ASDC__uio;|d re;fG o55677jkl..f

输出: CodeGolf


如果允许输出在开始时包含退格字符(ASCII码8),则此解决方案可以缩短为67个字符。输出将在视觉上相同。

s=p='<BS>'
for c in raw_input()+p:a=c.isalpha();s+=p[a:];p=c*a
print s

相同的输入,(在视觉上)相同的输出。<BS>是指退格字符。


1

C#

方法,105字节:(假设对System,System.Text.RegularExpressions和System.Linq使用)

string R(string i){return string.Concat(Regex.Split(i,"[^a-zA-Z]").Where(x=>x!="").Select(n=>n.Last()));}

程序,211字节:

using System;using System.Text.RegularExpressions;using System.Linq;class A{static void Main(){Console.WriteLine(string.Concat(Regex.Split(Console.ReadLine(),"[^a-zA-Z]").Where(x=>x!="").Select(n=>n.Last())));}}

1

VBA,147 161

Sub a(s)
For n=0 To 255:m=Chr(n):s=Replace(s,IIf(m Like"[A-Za-z]","",m)," "):Next
For Each r In Split(s," "):t=t & Right(r,1):Next
MsgBox t
End Sub

1

Ruby 2.0,25(+1)个字符

gsub(/(\w+)\W*/){$1[-1]}

必须与-p开关一起运行:

 $ ruby -p ed.rb <<< "asdf jkl;__zxcv~< vbnm,.qwer| |uiop"
flvmrp

请指定ruby版本。1.9.2输出“#<Enumerator:0x9f65e10>#<Enumerator:0x9f65d98>#<Enumerator:0x9f65d34>#<Enumerator:0x9f65cd0>””。
manatwork 2013年

你是对的。我完全忘记了我已经安装了它,但是我当前的Ruby版本是2.0(ruby 2.0.0p0 (2013-02-24 revision 39474)。当运行版本1.8.7的程序时,它将输出ASCII值!不知道版本之间有太多差异。
daniero

谢谢,一定要更新我的Ruby。(口译人员和知识人员。)第二个捕获组不是必需的:gsub(/(\w+)\W*/){$1[-1]}
manatwork 2013年

哦,当然不是。谢谢,更新:)
daniero

1

视网膜,16字节

Li, -1|""`[a-z]+

在线尝试!

说明

Li, -1|""`[a-z]+
L         [a-z]+        List all the sequences of letters in the input
 i                      case insensitive
  ,                     Keep all the results
    -1                  but only the last character for each of them
      |""               Use the empty string as separator


1

Java 8,43字节

s->s.replaceAll("(?i).(?=[a-z])|[^a-z]","")

@ mbomb007的Retina端口。

说明:

在线尝试。

s->  // Method with String as both parameter and return-type
  s.replaceAll("(?i).(?=[a-z])|[^a-z]","")
     //  Remove every match of this regex, and return as result

正则表达式的其他说明:

"(?i).(?=[a-z])|[^a-z]"  // Main regex to match
 (?i)                    //  Case insensitive
     .                   //   Any character
      (?=[a-z])          //   Followed by a letter (as positive look-ahead)
               |[^a-z]   //   or a non-letter

""                       // Replace it with: nothing

1
这实际上是(?i)为标志。
雅各布

0

Smalltalk,Squeak / Pharo风味
122字符,具有此方法的传统格式,已添加到String中:

endOfWords
    ^(self subStrings: (CharacterSet allCharacters select: #isLetter) complement) collect: #last as: String

Pharo 1.4中有62个字符,带有正则表达式和奇怪的格式

endOfWords^''join:(self regex:'[a-zA-Z]+'matchesCollect:#last)

0

J:60个字符(对于较不正确的版本,则为38个字符)

(#~e.&(,26&{.&(}.&a.)"0(97 65))){:&>;:]`(' '"_)@.(e.&'_:')"0

如果我们愿意在出现以冒号或下划线结尾的单词时让程序中断,则可以将其简化为38个字符。

(#~e.&(,26&{.&(}.&a.)"0(97 65))){:&>;:

样品运行:

    (#~e.&(,26&{.&(}.&a.)"0(97 65))){:&>;:]`(' '"_)@.(e.&'_:')"0'asdf jkl;__zxcv~< vbnm,.qwer| |uiop'
flvmrp
    (#~e.&(,26&{.&(}.&a.)"0(97 65))){:&>;:]`(' '"_)@.(e.&'_:')"0'pigs, eat dogs; eat Bob: eat pigs'
ststbts
    (#~e.&(,26&{.&(}.&a.)"0(97 65))){:&>;:]`(' '"_)@.(e.&'_:')"0'99_bottles_of_beer_on_the_wall'
sfrnel

1
38个字节(一个正确的版本): (#~[:2&|64 90 96 122&I.@(u:inv)){:&>;:,或用于非显式版本43个字节:(#~[:2&|64 90 96 122&I.@(u:inv))@:({:@>)@;:。它使用间隔索引动词,I.它将解释64 90 96 122为间隔集合(__, 64] (64, 90], (90, 96], (96, 122], (122, _),并返回其参数char的ascii代码所属的iterval的索引。如果该索引为奇数,则不是字母顺序。
Bolce Bussiere

@BolceBussiere由于某些原因(最后一个测试用例)无法使用下划线。
FrownyFrog

@FrownyFrog啊,我明白为什么了,因为变量名可以包含下划线,所以;:解释abc_为一个单词。+10字节添加(#~~:&'_'),可能是无效的修复程序
Bolce Bussiere

@BolceBussiere就是这样'_'-.~或类似的东西。
FrownyFrog

0

PHP中197字节:(我是初学者

$l=$_GET['line'];
$l=preg_replace('/(\W|_)+/',' ',$l);
$s=explode(' ',$l);
foreach($s as $d){
$a=substr($d,-1,1);
$o=ORD($a);
if(($o>=97 && $o<=122) || ($o>=65 && $o<=90)){
echo $a;
  }
}

编辑 现在是171个字节

<?$l=$_GET['l'];$l=preg_replace('/(\W|_)+/',' ',$l);$s=explode(' ',$l);foreach($s as $d){$a=substr($d,-1,1);$o=ORD($a);if(($o>=97&&$o<=122)||($o>=65&&$o<=90)){echo$a;}}

1
对于高尔夫,您应尽可能将变量名至少减少到单个字符。
加菲2013年

1
编辑了。谢谢告诉我。我是新来的。
萨索里

当然。您可能还需要在这里寻找一些其他特定于PHP的帮助。
加菲

foreach((' ',preg_replace('/(\W|_)+/',' ',$_GET['line'])) as $d){$a=substr($d,-1,1);$o=ORD();if(($o>=97 && $o<=122) || ($o>=65 && $o<=90)){echo $a;}}如果有效,则为149。
魔术章鱼缸

\W|_排除数字;因此您应该添加\d到正则表达式或使用/[^a-z]+/i
Titus

0

K 30

q)k)f:{x@&-1=-':(1_x," ")in,/.Q`a`A}
q)f "asdf jkl;__zxcv~< vbnm,.qwer| |uiop"
"flvmrp"
q)f "pigs, eat dogs; eat Bob: eat pigs"
"ststbts"
q)f "looc si siht ,gnitirw esreveR"
"citwR"
q)f "99_bottles_of_beer_on_the_wall"
"sfrnel"

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.