역문


15

이 과제의 목표는 입력을 받고 입력을 받지만 문장 순서는 반대로하는 것입니다. 입력 예 :

Hello friend. What are you doing? I bet it is something I want to do too!

출력 예 :

I bet it is something I want to do too! What are you doing? Hello friend.

예제에서 알 수 있듯이 프로그램은 물음표, 느낌표 및 마침표를 처리해야합니다. 각 문장에 문장 부호가 있고 다음 문장 앞에 공백이 있다고 가정 할 수 있습니다. 읽을 수있는 한 후행 공백 / 줄 바꾸기는 괜찮습니다. 가장 짧은 코드가 승리합니다.

행운을 빕니다!

편집 : 문장에 따옴표 나 괄호가 없다고 가정 할 수 있지만 코드에서 두 가지를 모두 처리 할 수 ​​있다면 -5 바이트 를 얻습니다 .

"Hello, " she said. (I didn't know what she was talking about.) --> (I didn't know what she was talking about.) "Hello, " she said.

따옴표 나 괄호가 없을 것이라고 가정 할 수 있습니까? 그렇지 않다면 어떻게 처리합니까?
BrainSteel

게시물을 수정하여 수정했습니다.

따옴표 나 괄호가 포함 된 문장에 대해 예상되는 결과의 예를들 수 있습니까?
mbomb007

6
문장이 따옴표 나 괄호 안에 구두점을 가지고 있다면 어떻게 처리해야합니까?
isaacg

2
@Scimonster "ie"등을 의미합니까? 아, 그리고 테스트 케이스 견적을 다음과 같이 수정하십시오."Hello!" she said. (I hesitated. How should I respond? This is too much!) I responded, "Hi there. How are you? What is your cat's name?" without thinking any more about it.
Charles가 아닙니다

답변:


9

줄리아, 45 42 바이트-5 보너스 = 37

s->join(reverse(split(s,r"[.?!]\K "))," ")

이것은 문자열을 입력으로 받아들이고 문장이 반대로 된 문자열을 반환하는 익명 함수를 만듭니다. 큰 따옴표와 달러 기호는 이스케이프 처리해야하지만 특수 문자를 올바르게 처리합니다. 그렇지 않으면 Julia에서 유효한 문자열이 아닙니다.

언 골프 + 설명 :

function f(s)
    # Get individual sentences by splitting on the spaces that
    # separate them. Spaces are identified by matching punctuation
    # then moving the position beyond that match and matching a
    # space. This is accomplished using \K.

    sentences = split(s, r"[.?!]\K ")

    # Reverse the order of the array of sentences.

    reversed_order = reverse(sentences)

    # Join the array elements into a string, separated by a space.

    join(reversed_order, " ")
end

예 :

julia> f("Hello friend. What are you doing? I bet it is something I want to do too!")
"I bet it is something I want to do too! What are you doing? Hello friend."

julia> f("\"Hello, \" she said. (I didn't know what she was talking about.)")
"(I didn't know what she was talking about.) \"Hello, \" she said."

그리고 출력에서 ​​이스케이프 된 따옴표를보고 싶지 않으면 :

julia> println(f("\"Hello, \" she said. (I didn't know what she was talking about.)"))
(I didn't know what she was talking about.) "Hello, " she said.

Martin Büttner 덕분에 정규 표현식에서 3 바이트를 절약했습니다! 이전에는 lookbehind를 사용했습니다 (?<=[.?!]).


나는 이것이 보너스를받을 자격이 있다고 생각하지 않습니다 ...
Optimizer

@Optimizer : 어떻게하지 않습니까? 게시물에 주어진 괄호, 따옴표 등으로 예상대로 작동합니다.
Alex A.

질문의 보너스 섹션에있는 예와 함께 test에 온라인 링크를 제공 할 수 있습니까?
Optimizer

@Optimizer : Julia 온라인의 최신 버전을 실행하는 유일한 방법은 등록이 필요하며 영구 링크를 지원하지 않습니다. 게시물에 입력과 출력을 단순히 포함시키는 것으로 충분합니까?
Alex A.

물론, 나는 추측한다.
Optimizer

7

CJam, 23 22 바이트

이것이 보너스에 해당되는지 여부는 확실하지 않지만 여기에 해결책이 있습니다.

Sq{1$".?!"-{])[}|}%]W%

코드 확장 (비트 오래된) :

Sq+                      e# Read the input and prepend with a space
   {            }%       e# For each input character
    _".?!"&              e# Copy and check if its one of ., ? and !
           {][}&         e# If it is one of the above, wrap everything till now in an array
                         e# and start a new array to be wrapped next time we get one of those
                         e# three characters. We now have an array of strings, each having
                         e# a single sentence
                  W%     e# Reverse the ordering of these sentences
                    s(   e# Convert to string and remove the first space

여기에서 온라인으로 사용해보십시오


아, 처음에이 게시물을 편집 한 직후에 작성했습니다. 이제 -5 보너스를받습니다 (약간 더 어렵게 만들 수 있습니다). 따라서 -5 보너스가 주어집니다! 18 바이트, 와우, 그게 전부는 beatable하지 않도록 경우 : P

5

J, 35 32

단일 아포스트로피를 피해야한다는 점을 제외하고는 보너스 입력을 거의 처리하므로 계산되지 않습니다. (또한 여기에 첫 번째 제출)

f=.;@|.@(]<;.2~'.?!'e.~])@,~&' '

용법:

f 'Hello friend. What are you doing? I bet it is something I want to do too!'

4

펄, 27/25

#!perl -n
print reverse/ |[^.!?]*./g

또는 명령 행에서 :

$perl -nE'say reverse/ |[^.!?]*./g'

좋은! -5 보너스를 perl -nE 'say reverse/ |[^.?!]*.\)?/g'
받으면

2

PHP, 60

echo join(' ',array_reverse(preg_split('/(?<=[?!.])/',$s)));

[?!.]\K대신 정규식을 사용할 수 있습니까 ?
마틴 엔더

또한 패턴에 공백을 포함시키지 않으면 문자열에 공백을 추가하지 않습니까?
Martin Ender

@ MartinBüttner, 아니요, 데이터를 다시 연결할 때 적절한 부호를 복원 할 수 없으므로 문자를 소비하지 않는 것이 필요합니다.
romaninsh 2016 년

2

배쉬 + coreutils, 40 바이트

sed 's/\([?.!]\) */\1\n/g'|tac|tr \\n \ 

이것은 STDIN에서 읽으므로 입력이 파일에서 리디렉션되거나 단순히 파이프로 연결될 수 있습니다.

$ printf 'Hello friend. What are you doing? I bet it is something I want to do too!' | sed 's/\([?.!]\) */\1\n/g'|tac|tr \\n \ 
I bet it is something I want to do too! What are you doing? Hello friend. 
$ 

이것은 실제로 괄호에 효과적 (foo bar.)입니까? 단위로 바뀌 었습니까?
마틴 엔더

내가 :( 보너스를 주장 더 이상 할 수 있습니다 @ 질문 같은 MartinBüttner의 외모는 편집하지있어
디지털 외상

2

, 25 바이트

a.:sRV(a^@2+$ALa@*^".?!")

입력 문자열에 공백을 추가 한 후, 우리는 모든 인덱스를 찾아 ., ?그리고 !, 2를 추가하고 사용하는 ^@문장으로 문자열 (뒤에 공간 각)을 깰 운영자에 분할-. 목록을 바꾸면 프로그램이 끝날 때 자동으로 인쇄됩니다. oil!

입력으로 주 계산 단계를 보여주는 예 A! B? C. D!:

              ^".?!"     ["." "?" "!"]
           a@*           [[7] [4] [1 10]]
        $AL              [7 4 1 10]
      2+                 [9 6 3 12]
   a^@                   ["A! " "B? " "C. " "D! "]
RV(                 )    ["D! " "C. " "B? " "A! "]

                         D! C. B? A! 

아니 당신은하지 :)
옵티 마이저

2

망막 , 61 34 33 30 바이트

이것을 24 바이트 삭감 한 nutki의 공로입니다.

^
#
+`(#.*[.!?]) (.+)
$2 $1
#
<empty>

어디는 <empty>빈 줄을 의미합니다. 이것은 #입력의 일부가 아니라고 가정 하지만 그것이 합법적이지 않다면 "(보너스 만 처리 해야하는) 또는 인쇄 할 수없는 것을 포함하여 다른 캐릭터로 바꿀 수 있습니다. -s플래그 를 사용하는 경우 단일 파일에서 이와 같은 코드를 실행 하거나 각 행을 별도의 파일에 넣고 모두 Retina에 전달할 수 있습니다.

단일 정규식 대체로 이것을 되돌릴 수는 있지만 실제로 성가시다. .NET 밸런싱 그룹을 사용하더라도 약 90 바이트 정도가 필요했기 때문에 여러 단계로 시도했습니다.

Retina에서 모든 라인 쌍은 하나의 교체 단계이며, 첫 번째 라인은 패턴이고 두 번째 라인은 교체입니다.

^
#

이 단계는 단순히 추가 처리를 위해 문자열을 준비합니다. 앞에 붙습니다 #. 이 마커는 앞에있는 모든 항목이 이미 올바른 위치에 배치되었으며 그 이후의 모든 항목이 여전히 처리되어야 함을 나타냅니다.

+`(#.*[.!?]) (.+)
$2 $1

이 단계는 #( 문장에서 문자열을 통해 앞으로 이동하는) 앞의 마지막 문장을 반복해서 이동하여 문장을 교환합니다 . 는 +`출력이 변화 멈출 때까지이 단계를 반복 망막을 지시한다. 예를 들어, 입력 foo. bar! blah?을 처리 하는 방법은 다음과 같습니다.

#foo. bar! blah?
blah? #foo. bar!
blah? bar! #foo.

마지막으로 마커를 간단히 제거합니다.

#
<empty>

왜 그냥 .+=> $0 #하고 반복해서 (.*?[.!?] )(.*#)=>하지 $2$1않습니까?
nutki

@ nutki 오, 훨씬 좋습니다. 감사합니다. :)
Martin Ender

1

자바, 113

s->{String t[]=s.split("(?<=[\\.?!]) "),u="";for(int i=t.length;i-->0;)u+=t[i]+" ";return u.replaceAll(".$","");}

1

자바 스크립트 (ES6) 47 45

언급했듯이 간단한 정규식 운동입니다. 자바 스크립트에서 :

// ES6 - FireFox only
F=t=>t.match(/\S[^.!?]+./g).reverse().join(' ')

// ES5 - so much longer
function G(t){return t.match(/\S[^.!?]+./g).reverse().join(' ')}

// TEST

alert(G("Hello friend. What are you doing? I bet it is something I want to do too!"))
 


나는 자바 스크립트를하려고했지만 당신은 나를 이겼다.
BobTheAwesome

마지막 문장 (원래 첫 번째 문장)을 제외한 나머지 공간이 추가로 생성됩니다. 작업이 잘 정의되어 있지 않아서 정상인지 확실하지 않습니다.
nutki

@ nutki 예, 동의합니다. 수정
edc65 11:15에 15.15.

1

파이썬 2, 62

아마도 바이트 비용이 들지 않으므로 보너스를 향상시키지 않을 것입니다.

import re
print' '.join(re.split('(?<=[?!.]).',input())[::-1])

보너스는 해당되지 않습니다. 문제의 보너스 예를보십시오
Optimizer

@Optimizer 질문 내역을보십시오. 보너스를 추가하기 위해 질문을 업데이트했을 때 내 출력이 예제와 일치했습니다. 괄호가 마침표 밖에있을 수 있음을 나타내는 것은 없습니다.
mbomb007

나는 의도가 처음부터 시작되었다고 생각합니다. 그래도 확실한 예가 나왔습니다. 당신이 여전히 보너스를 얻는다는 것을 의미하지는 않습니다 :) (나도 제거했습니다)
Optimizer

1

MATLAB (93 바이트)

y=[32 input('','s')];y=sortrows([cumsum(ismember(y,'?!.'),'reverse');y]',1)';disp(y(4:2:end))
  • 이것은 입력에 선행 또는 후행 공백이 포함되지 않은 것으로 가정합니다.
  • 표준 입력 및 출력 사용
  • Matlab 2014b에서 테스트

1

루비 41

다른 루비 답변에는 WTF가 충분하지 않습니다.

#!ruby -apF(?<=[.!?])\s
$_=$F.reverse*" "

이것은 적어도 Ruby 2에서 작동합니다. aand and Fswitch가 1.8.7에서 작동 $_=하면 3 문자를 저장하기 위해 드롭 할 수 있다고 생각합니다 .

stdin의 모든 줄을 되돌리고 stdout으로 인쇄합니다.

$ ruby foo.rb <<< "Hello. Hi. How are you? Good, you? fine, thanks."
fine, thanks. Good, you? How are you? Hi. Hello.

답을 설명해 주시겠습니까?
Mhmd

1

루비, 48 (퍼팅이없는 42) 바이트

reverse_sentence.rb

puts $*[0].scan(/\S[^.!?]+./).reverse.join(" ")

용법:

ruby reverse_sentence.rb 'Hello friend. What are you doing? I bet it is something I want to do too!'

산출:

I bet it is something I want to do too! What are you doing? Hello friend.

환영보다 비판.


2
비판 : "문장"의 철자를 잘못 입력했습니다.
Alex A.

6 문자 저장 : .join(" ")=>*" "
daniero

@AlexA. 최고의 피드백!
DickieBoy

@daniero 덕분에 좋은 알아야 할
DickieBoy

1

k, 31

{1_,/|(0,1+&x in"?!.")_x:" ",x}

.

k){1_,/|(0,1+&x in"?!.")_x:" ",x} "Hello friend. What are you doing? I bet it is something I want to do too!"
"I bet it is something I want to do too! What are you doing? Hello friend."

0

LINQPAD-93-5 = 88 바이트

void Main(){string.Join(" ",Regex.Split(Console.ReadLine(),"(?<=[.?!]) ").Reverse()).Dump();}

C # 콘솔 앱 189-5 = 184 바이트

using System;using System.Linq;using System.Text.RegularExpressions;class P{static void Main(){Console.WriteLine(string.Join(" ",Regex.Split(Console.ReadLine(), "(?<=[.?!]) ").Reverse()));}}

알렉스 A.에서 부끄러운 정규식 :)


응용 프로그램 namespace Systemusing Linq;usingText.RegularExpressions저장 한 다음 2x 안에 7 바이트를 절약 할 수 있습니다 system.
ldam

나는 이것이 보너스를받을 자격이 없다고 생각합니다. 문제의 보너스 예를보십시오
Optimizer

0

클로저-44 71 문자

(defn rs[s](reverse(re-seq #"\S.+?[.!?]"s)))

RE를 개선하고 단순화하여 불필요한 공백을 제거했습니다.

출력은 문장의 순서가 반대로 원래 문자열의 문장 시퀀스입니다.

입력 : "안녕하세요 친구. 당신은 무엇을하고 있습니까? 나도하고 싶은 일입니다!" 출력 : ( "내가하고 싶은 일이다!" "무엇을하고 있니?" "안녕하세요 친구")


0

루비, 47

$><<gets.strip.split(/(?<=[.?!]) /).reverse*' '

일부 문자를 저장 한 것에 대해 Martin Büttner 에게 크레딧을 제공 합니다.


1
gets바이트를 저장하려면 STDIN에서 입력을 읽고, 바이트 $><<를 저장하려면 (공백 필요 없음) 인쇄 하고 문자열을 결합하여 *''2 바이트를 저장하십시오.
Martin Ender

@ MartinBüttner 제안에 감사드립니다.하지만 STDIN의 입력을 읽지 않아도됩니다. 단순히 새로운 줄이 있기 때문에 간단합니다.
Mhmd

실제로, 귀하의 코드는 현재 최고의 공간을 차지할 것이라고 생각합니다.
마틴 엔더

음, 네 말이 맞아 어떻게해야하는지 볼 수 있습니다.
Mhmd

0

CJam, 21 바이트

1q{1?_"!.?"-}%1a/W%S*

이것은 !s, .s 및 ?s 뒤 의 공백을 숫자 1 ( 문자 1 또는 코드 포인트 1의 문자가 아니므로 입력에 여전히 포함 할 수 있음)로 바꾸고 1에서 분할하여 결과 덩어리의 순서를 반대로하고 결합하여 작동합니다 공백으로.

CJam 통역사 에서 온라인으로 사용해보십시오 .

작동 원리

1                     e# B := 1
 q                    e# Q := input()
  {         }%        e# for each C in Q (map):
   1?                 e#   C := B ? C : 1
     _"!.?"-          e#   B := string(C).strip("!.?")
              1a/     e# Q := Q.split([1])
                 W%   e# Q := reverse(Q)
                   S* e# Q := Q.join(" ")
                      e# print(Q)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.