세계는 에드로 끝납니다


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는 측정 할 수 없었다!
Joe Z.

글쎄,“실제 남성용 에드”에세이는 내가 기억할 수있는 한 이맥스 배포판의 일부였습니다.
JB

입력이 ASCII 만입니까?
Phil H

답변:


16

펄 5, 18 바이트

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

-p명령 행 스위치가 필요합니다 . 명명 된 속성 L은 문자 만 일치합니다 A-Za-z. 있습니다 수백 명명 된 속성이 있지만, ASCII 문자를 처리 할 때, 그들 중 거의 재미 있습니다. 또한 \pL실제 메모 중 다른 하나는 \pP구두점과 일치합니다.

온라인으로 사용해보십시오!


펄 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

흠. 업데이트가 필요합니다.
primo

2
훌륭한. 정규식은 확실한 해결책 이었지만 |.(나에게는 적어도) 분명하지 않았습니다.
피터 테일러

1
그냥주의 -1의를 print/\pL*(\pL)/g, 테스트 케이스에 대해 동일한 출력에 보인다!
Dom Hastings

18

ed, 35 자

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

그래서 세상은 에드로 끝납니다. 나는 문자 그대로 너무 좋아하기 때문에 ed로 솔루션을 작성하기 위해 작성하기로 결정했으며 실제로는 실제로 프로그래밍 언어 입니다. 이 스레드에 많은 더 짧은 솔루션이 이미 존재한다고해도 놀랍게도 짧습니다. 내가 아닌 다른 것을 사용할 수 있다면 더 좋을 [a-zA-Z]것이지만, ed가 프로그래밍 언어가 아니라는 것을 고려하면 실제로 충분합니다.

먼저 파일의 마지막 줄만 구문 분석한다고 말하고 싶습니다. ,두 개의 첫 번째 줄의 시작 부분 (표준 마지막 줄 범위와 달리 "모든 항목"범위)을 입력하기 만하면 더 구문 분석 할 수 있지만 코드 크기는 37 자로 늘어납니다.

이제 설명을하겠습니다. 첫 번째 줄은 Perl 솔루션의 기능을 정확하게 수행합니다 (유니 코드 문자를 지원하지 않는 경우 제외). 나는 Perl 솔루션을 복사하지 않았으며 우연의 일치로 비슷한 것을 발명했습니다.

두 번째 줄은 마지막 줄을 인쇄하므로 출력을 볼 수 있습니다. 세 번째 라인의 힘은 종료 - 내가해야 할, 그렇지 않으면 ed인쇄 할 ?파일을 저장하지 않은 있음을 알려.

이제 그것을 실행하는 방법에 대해. 아주 간단합니다. ed내 프로그램을 파이핑하는 동안 테스트 케이스가 들어있는 파일로 실행 하십시오.

ed -s testcase < program

-s조용합니다. 이렇게하면 ed처음에 못생긴 파일 크기가 출력되지 않습니다. 결국, 나는 편집기가 아닌 스크립트로 사용하므로 메타 데이터가 필요하지 않습니다. 그렇게하지 않으면 ed는 달리 막을 수없는 파일 크기를 보여줍니다.


나는 이것을 시도하기 위해 ed를 설치했다.
primo

6

자바 스크립트, 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 바이트를 절약 할 수 있습니다 c.main(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

@manatwork : 좋은 지적이다. 이것은 GNU sed만을 만들지 만, 그것은 이미 고마워 보인다.
Thor

\b고려 _의 것은 테스트의 단어 그렇다면, 자 이내 여야합니다 END가_그 단어의 마지막 문자가 출력에 포함되지 않습니다
마티 닐

3

그렙 앤 페이스트, 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 \\n와 함께 paste -sd ''.

편집하다

  • 대소 문자를 구분하지 않는 grep (-2)을 사용하십시오 . manatwork .
  • 고마워요 manatworktr 대신 paste(-4) 대신 사용하십시오 .
  • 파이프 (-2) 주위의 공백은 계산하지 마십시오.

그것으로 꽤 창의적 paste -sd ''이지만 tr -d \\n짧습니다. 에 관해서는 grep, -i“대소 문자 무시”를 의미하는 스위치를 가지고 있어 더 짧아 질 수 있습니다 : grep -io '[a-z]\b'.
manatwork

@manatwork, tr마지막 줄 바꿈도 삭제하십시오. 대소 문자를 구분하지 않는 모드는 물론 더 짧습니다.
Thor

최종 개행을 요구하는 규칙은 없습니다.
manatwork

@ manatwork : 나는 그 대답에 동의 할 수 있습니다.
Thor

3

sed, 37 자

Thor의 대답 과 길이는 같지만 더 간단합니다.

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

논리는 매우 사소합니다. 문자 순서를 마지막 문자로 바꾼 다음 문자가 아닌 문자를 모두 삭제하십시오.


3

매스 매 티카, 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:) 나는 전체 문자열을 테스트하기 위해 그것을 생각하지 않았습니다.
Dr. belisarius

@belisarius 사실,이 구문에서는 문자 방식으로 적용되므로 문자 그대로 "LetterQ"일 수 있으며 여전히 작동합니다.
Mr.Wizard

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

스칼라, 59 (또는 43)

문자열이 이미 있다고 가정 s:

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

REPL 출력을 사용하지 않고 프롬프트에서 읽고 인쇄해야하는 경우 59 로 변환 s하여 readLine랩핑하십시오 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

사이, 32

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

Xi 는 아직 베타 단계의 언어이지만 코드 골프와 잘 작동하는 것 같습니다. 그래서 또 다른 짧고 기능적인 솔루션을 보여줄 것이라고 생각했습니다 (그리고 언어를 약간 광고합니다 :-)).


2

매스 매 티카 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.IGNORECASEre.I입니다.


2

파이썬, 76 자

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


뒤에 공백을 제거 할 수 있습니다 print.
flornquake

Python 3으로 포팅하여 단축 :import re;print(*re.findall("([a-zA-Z])(?=$|[^a-zA-Z])",input()),sep='')
Steven Rumbalski

1

파이썬 3.x, 64 바이트

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

2
마지막 예가 작동하지 않습니다. 또한 줄이 구분 기호로 시작하거나 끝나는 경우 오류가 발생합니다
AMK

전에 공백을 제거 할 수 있습니다 for.
Bakuriu


1

매스 매 티카 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"
Dr. belisarius

잠깐만 Row@StringTake[ StringCases[#, LetterCharacter ..], -1] &@"asdf jkl__zxcv~<vbnm,.qwer| |uiop"나에게 flvmrp주지만 여기로 #~StringCases~RegularExpression@"\\w\\b" <> "" &@"asdf jkl__zxcv~<vbnm,.qwer| |uiop"돌아온다 fvmrp. 우리는 같은 결과를 얻고 있습니까?
Dr. belisarius

@belisarius 당신은 내 이전 버전의 오류에 대해 옳았습니다. 잘못된 문자열로 테스트하고있었습니다!
DavidC

Hehe, 다시 +1
belisarius 박사

@ belisarius guys, 내가 게시 한 답변을 참조하십시오. 맞으면 짧아집니다.
Mr.Wizard

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

기음#

메서드, 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

루비 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 2016 년

네가 옳아. 설치 한 것을 완전히 잊었으나 현재 Ruby 버전은 2.0 ( ruby 2.0.0p0 (2013-02-24 revision 39474)입니다. 버전 1.8.7로 프로그램을 실행하면 ASCII 값이 출력됩니다! 버전간에 많은 차이가 있다는 것을 몰랐습니다.
daniero

감사합니다. 루비를 반드시 업데이트해야합니다. (통역자와 지식 모두) 두 번째 캡처 그룹은 필요하지 않습니다 gsub(/(\w+)\W*/){$1[-1]}.
manatwork 2016 년

물론 그렇지 않습니다. 감사합니다, 업데이트 :)
daniero



1

자바 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)깃발입니다.
Jakob

0

Smalltalk , Squeak / Pharo flavor
122 char이 메소드에 대한 기존 형식이 문자열에 추가되었습니다.

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))@:({:@>)@;:. 이것은 intervals 집합으로 I.해석되는 interval 인덱스 동사를 사용하고 char의 ASCII 코드 인 인수가 속하는 iterval의 인덱스를 반환합니다. 이 인덱스가 홀수이면 알파벳이 아닙니다. 64 90 96 122(__, 64] (64, 90], (90, 96], (96, 122], (122, _)
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
골프의 경우 가능한 한 변수 이름을 최소한 단일 문자로 줄여야합니다.
Gaffi

1
알려 주셔서 감사합니다. 저는 여기에 처음입니다.
Sasori

확실한. 또한보고 할 수 있습니다 여기에 몇 가지 추가 PHP 고유의 도움을.
Gaffi

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입니다.
매직 문어 Urn

\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"

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.