世界はエドで終わる


21

ACM Winter Programming Contest 2013から直接取られました。あなたは文字通り物事を好む人です。したがって、あなたのために、世界の終わりが編集されます。「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
世界はエドで終わりますか?私 vim を知っていて、Emacsは測定できませんでした!
ジョーZ.

さて、「本物の男性がedを使用する」というエッセイは、私が覚えている限り、Emacsディストリビューションの一部でした。
JB

入力はASCIIのみですか?
フィルH

回答:


16

Perl 5、18バイト

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

-pコマンドラインスイッチが必要です。名前付きプロパティLは文字のみに一致しA-Za-zます。このような名前付きプロパティは数百ありますが、ASCIIテキストを扱う場合、興味深いものはほとんどありません。さらに\pL、実際の音符のもう1つは\pP、句読点に一致するのみです。

オンラインでお試しください!


Perl 5、17バイト

Dom Hastingsによる1バイトの改善

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

うーん、確かに。それを更新する必要があります。
プリモ

2
ブリリアント。正規表現は明らかな解決策でしたが、明らかで|.はありませんでした(少なくとも私には)。
ピーターテイラー

1
-1in print/\pL*(\pL)/gに気づいただけで、テストケースでも同じように出力されるようです!
ドムヘイスティングス

18

ed、35文字

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

それで、世界はエドで終わります。私はあまりにも文字通りになりたいので、私はソリューションをedで書くために書くことにしました- そして明らかにそれは実際にはプログラミング言語です。このスレッドには多くの短いソリューションがすでに存在していることを考えても、驚くほど短いです。以外の何かを使用できればもっといいと思いますが[a-zA-Z]、edはプログラミング言語ではないことを考えると、実際には十分です。

まず、これはファイルの最後の行のみを解析すると言いたいです。,最初の2行(標準の最終行範囲ではなく「すべて」の範囲を指定)の先頭に入力するだけで、さらに解析することも可能ですが、コードサイズが37文字に増加します。

説明のために。最初の行は、Perlソリューションが行うこととまったく同じです(Unicode文字のサポートがない場合を除く)。Perlソリューションをコピーしたわけではなく、偶然にも似たようなものを発明しただけです。

2行目は最終行を出力するため、出力を確認できます。3行目は強制終了します-そうしないed?、ファイルを保存していないことを思い出させるために印刷します。

次に、実行方法について説明します。まあ、それは非常に簡単です。そのedように私のプログラムをパイピングしながら、テストケースを含むファイルで実行するだけです。

ed -s testcase < program

-s黙っています。これによりed、開始時にいファイルサイズが出力されなくなります。結局のところ、エディターではなくスクリプトとして使用するため、メタデータは必要ありません。そうしないと、edはファイルサイズを表示します。


これを試すためだけにedをインストールしました。
primo

6

Javascript、49

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

正規表現を使用して、文字の前に来るすべての文字と、文字以外のすべての文字を削除します。その後、各単語の最後の文字が残ります。

tomsmedingに感謝します。


3
あなたは、おそらくのように、正規表現大文字と小文字を区別しないをすることによってこれを改善することができますalert(prompt().replace(/.(?=[a-z])|[^a-z]/gi,''))
tomsmeding

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;
}

出力:

enter image description here


1
あなたはK&R宣言を使用し、デフォルトによって4つのバイトを保存することができますcmain(c,s)char**s;{for
トビースパイツ

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番目の置換ですべての無関係な文字を簡単に削除できます。

編集

  • 大文字と小文字を区別しないフラグ(-2)を使用してください。manatworkに感謝します
  • 空白をカウントしないでください(-1)。

sedsコマンドにはi、大文字と小文字を区別しないマッチングのフラグがありs/[a-z]\b/&\n/giます:。
マナトワーク

@manatwork:良い点、これはGNU sedのみになりますが、すでにそうです、ありがとう。
トール

\b_sを文字と見なします。そのため、テスト内の単語がEND終わる場合_、その単語の最後の文字は出力に含まれません
Marty Neal 14

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、tr最後の改行も削除します。大文字と小文字を区別しないモードはもちろん短くなります、ありがとう。
トール

最終改行を必要とするルールはありません。
マナトワーク

@manatwork:更新された答えに同意できます。
トール

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:)文字列全体をテストするためにそれを考えていません。
ベリサリウス博士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出力を使用するのではなく、プロンプトから読み取って印刷する必要がある場合は、59に変換sreadLineてラップインprintln()します。


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

Xi、32

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

西はまだベータ段階の言語ですが、コードゴルフではうまく機能しているようですので、もう1つの短く機能的なソリューションを示すことができると考えました(言語を少し宣伝します:-))。


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.subre.IGNORECASEフラグを渡すことre.Iです。



1

Python 3.x、64バイト

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

2
最後の例は機能していません。ラインが開始またはセパレータで終わる場合も、エラーが発生
AMK

前にスペースを削除できforます。
バクリウ


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"
博士ベリサリウス

待っRow@StringTake[ StringCases[#, LetterCharacter ..], -1] &@"asdf jkl__zxcv~<vbnm,.qwer| |uiop"てくれますがflvmrp、ここに#~StringCases~RegularExpression@"\\w\\b" <> "" &@"asdf jkl__zxcv~<vbnm,.qwer| |uiop"戻りfvmrpます。同じ結果を得ていますか??
ベリサリウス博士

@belisariusあなたは私の以前のバージョンのエラーについて正しかった。間違った文字列でテストしていました!
DavidC

ふふ

@belisarius guys、私が投稿した答えをご覧ください。正しい場合は短くなります。
Mr.Wizard

1

Python 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>」を出力します。
マナトワーク

あなたが正しい。インストールしたことを完全に忘れていましたが、現在のRubyバージョンは2.0(ruby 2.0.0p0 (2013-02-24 revision 39474)です。バージョン1.8.7でプログラムを実行すると、ASCII値が出力されます!バージョン間に非常に多くの違いがあることを知りませんでした。
ダニエロ

おかげで、間違いなく私のRubyを更新する必要があります。(通訳者と知識の両方。)2番目のキャプチャグループは不要ですgsub(/(\w+)\W*/){$1[-1]}
マナトワーク

ああ、もちろんそうではありません。ありがとう、更新:)
daniero



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文字、このメソッドの従来の書式設定を文字列に追加:

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))@:({:@>)@;:。これはintervalインデックス動詞を使用します。これはinterval のセットとしてI.解釈さ64 90 96 122れ、(__, 64] (64, 90], (90, 96], (96, 122], (122, _)その引数であるcharのASCIIコードが属するitervalのインデックスを返します。このインデックスが奇数の場合、アルファベット順ではありません。
ボルチェビュシエール

@BolceBussiereは、何らかの理由でアンダースコアを処理しません(最後のテストケース)。
FrownyFrog

@FrownyFrogああ、その理由は、変数名にアンダースコアを含めることができるため、1つの単語として;:解釈さabc_れるからです。10バイトが追加され(#~~:&'_')、おそらく非効率的な修正
Bolce Bussiere

@BolceBussiereそれはちょうど'_'-.~または何か似ています。
FrownyFrog

0

それは中ですPHP197バイト:(私は初心者です

$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;
  }
}

EDITED 今はそれだ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
ゴルフの場合は、変数名を少なくとも1文字にできるだけ減らす必要があります。
ガフィ

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
タイタス

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"

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.