ประโยคกลับด้าน


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 ไบต์ตัวอย่างผลลัพธ์สำหรับ parens / คำพูด:

"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

Julia, 45 42 ไบท์ - 5 โบนัส = 37

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

สิ่งนี้จะสร้างฟังก์ชั่นที่ไม่ระบุชื่อที่ยอมรับสตริงเป็นอินพุตและส่งคืนสตริงที่มีประโยคที่กลับรายการ สิ่งนี้จะจัดการกับอักขระพิเศษใด ๆ ได้อย่างเหมาะสมแม้ว่าเครื่องหมายคำพูดคู่และเครื่องหมายดอลลาร์จะต้องได้รับการยกเว้น

คำอธิบาย Ungolfed +:

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.

บันทึก 3 ไบต์บนนิพจน์ทั่วไปด้วย Martin Büttner! ก่อนหน้านี้เคย lookbehind (?<=[.?!])นี้:


ฉันไม่คิดว่าสิ่งนี้มีคุณสมบัติเหมาะสมสำหรับโบนัส ...
เครื่องมือเพิ่มประสิทธิภาพ

@Optimizer: มันไม่ได้อย่างไร มันทำงานได้ตามที่คาดไว้กับวงเล็บเครื่องหมายคำพูด ฯลฯ ตามที่กำหนดในโพสต์
Alex A.

คุณสามารถให้ลิงค์ออนไลน์เพื่อทดสอบพร้อมตัวอย่างจากส่วนโบนัสของคำถาม
เครื่องมือเพิ่มประสิทธิภาพ

@Optimizer: วิธีเดียวในการเรียกใช้ Julia รุ่นล่าสุดต้องใช้การลงทะเบียนและไม่รองรับลิงก์ถาวร มันจะพอเพียงที่จะรวมอินพุตและเอาต์พุตที่นี่ในการโพสต์?
Alex A.


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 ไบต์ว้าวไม่แน่ใจว่าสามารถ

5

J, 35 32

มันเกือบจัดการกับการป้อนโบนัสยกเว้นว่าฉันต้องหนี apostrophes เดียวดังนั้นฉันเดาว่ามันจะไม่นับ (เช่นการส่งครั้งแรกของฉันที่นี่)

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

การใช้งาน:

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

4

Perl, 27/25

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

หรือจากบรรทัดคำสั่ง:

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

ดี! คุณสามารถได้รับโบนัส -5 ด้วยperl -nE 'say reverse/ |[^.?!]*.\)?/g'ทำให้นับรวมเป็น 23
ThisSuitIsBlackNot

2

PHP, 60

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

คุณสามารถใช้ Regex [?!.]\Kแทนได้หรือไม่?
Martin Ender

สิ่งนี้จะไม่เพิ่มช่องว่างเพิ่มเติมลงในสตริงเว้นแต่คุณจะรวมช่องว่างในรูปแบบที่จะแยกด้วยใช่ไหม
Martin Ender

@ MartinBüttnerไม่ฉันไม่สามารถกู้คืนสัญลักษณ์ที่ถูกต้องเมื่อเข้าร่วมข้อมูลกลับดังนั้นเราต้องการบางสิ่งที่จะไม่ใช้อักขระ
romaninsh

2

Bash + 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.)ได้รับการแลกเปลี่ยนเป็นหน่วย?
Martin Ender

@ MartinBüttnerดูเหมือนว่าคำถามจะได้รับการแก้ไขดังนั้นฉันจึงไม่สามารถรับโบนัสได้อีก :(
Digital Trauma

2

Pip , 25 ไบต์

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

หลังจากการผนวกพื้นที่ที่จะสายป้อนเราพบว่าดัชนีทั้งหมด., ?และ!เพิ่ม 2 และใช้^@แยกที่ผู้ประกอบการที่จะทำลายสตริงลงในประโยค (แต่ละคนมีพื้นที่ต่อท้าย) ย้อนกลับรายการและจะถูกพิมพ์อัตโนมัติเมื่อสิ้นสุดโปรแกรม Voila!

ตัวอย่างแสดงขั้นตอนของการคำนวณหลักด้วยอินพุต 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

Retina , 61 34 33 30 ไบต์

เครดิตสำหรับ nutki สำหรับการลดขนาดนี้ลง 24 ไบต์

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

<empty>บรรทัดที่ว่างเปล่าอยู่ที่ไหน สิ่งนี้จะถือว่า#ไม่ได้เป็นส่วนหนึ่งของอินพุต แต่ถ้ามันไม่ถูกต้องฉันสามารถสลับมันสำหรับตัวละครอื่น ๆ รวมถึง"(ซึ่งฉันแค่ต้องการจัดการเพื่อรับโบนัส) หรือสิ่งที่ไม่สามารถพิมพ์ได้ คุณสามารถเรียกใช้รหัสเช่นนี้ในไฟล์เดียวหากคุณใช้การ-sตั้งค่าสถานะหรือคุณสามารถวางแต่ละบรรทัดในไฟล์แยกต่างหากและส่งต่อทั้งหมดไปยัง Retina

การกลับรายการนี้ด้วยการเปลี่ยน regex เดียวเป็นไปได้ แต่ยุ่งยากจริงๆ แม้จะมี. NET balancing groups ฉันต้องการบางสิ่งบางอย่างประมาณ 90 ไบต์ดังนั้นฉันพยายามทำหลายขั้นตอนแทน

ใน Retina เส้นคู่ทุกคู่จะเป็นหนึ่งในระยะการแทนที่โดยที่บรรทัดแรกคือรูปแบบและบรรทัดที่สองคือการแทนที่

^
#

ขั้นตอนนี้เป็นการเตรียมสตริงสำหรับการประมวลผลเพิ่มเติม มันเป็นการ#รวมกันเป็นเครื่องหมาย เครื่องหมายนี้ระบุว่าทุกสิ่งที่อยู่ข้างหน้าถูกวางไว้ในที่ที่ถูกต้องแล้วและทุกอย่างหลังจากนั้นก็ยังต้องถูกประมวลผล

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

สเตจนี้สลับประโยคโดยการย้ายประโยคสุดท้ายที่อยู่ด้านหน้าของประโยคซ้ำ ๆ#(ซึ่งเคลื่อนที่ไปข้างหน้าผ่านสตริงในกระบวนการ) +`สั่ง Retina ที่จะทำซ้ำขั้นตอนนี้จนกว่าการส่งออกหยุดการเปลี่ยนแปลง ตัวอย่างนี่คือวิธีการfoo. bar! blah?ประมวลผลอินพุต:

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

และในที่สุดเราก็ลบเครื่องหมาย:

#
<empty>

ทำไมไม่เพียง.+=> $0 #และทำซ้ำ(.*?[.!?] )(.*#)=> $2$1?
nutki

@ nutki โอ้ดีกว่ามากขอบคุณ :)
Martin Ender


1

JavaScript (ES6) 47 45

ตามที่ระบุไว้มันเป็นแบบฝึกหัด regex ง่าย ๆ ในจาวาสคริปต์:

// 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

1

Python 2, 62

จะไม่ปรับปรุงสำหรับโบนัสเพราะอาจไม่คุ้มค่ากับค่าไบต์

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

สิ่งนี้ไม่มีคุณสมบัติที่จะได้รับโบนัส ดูตัวอย่างโบนัสในคำถาม
เครื่องมือเพิ่มประสิทธิภาพ

@Optimizer ดูในประวัติคำถาม ในขณะที่ฉันอัปเดตคำถามเพื่อเพิ่มโบนัสเอาต์พุตของฉันตรงกับตัวอย่าง ไม่มีอะไรบ่งชี้ว่าวงเล็บอาจอยู่นอกช่วงเวลาหนึ่ง
mbomb007

ฉันคิดว่าความตั้งใจนี้มาจากจุดเริ่มต้นเท่านั้น ตัวอย่างที่ชัดเจนมาในภายหลังว่า ไม่ได้หมายความว่าคุณยังคงได้รับโบนัส :) (ฉันลบของฉันด้วย)
เครื่องมือเพิ่มประสิทธิภาพ

1

Matlab (93 ไบต์)

y=[32 input('','s')];y=sortrows([cumsum(ismember(y,'?!.'),'reverse');y]',1)';disp(y(4:2:end))
  • สิ่งนี้ถือว่าอินพุตไม่มีช่องว่างนำหน้าหรือต่อท้าย
  • ใช้อินพุตและเอาต์พุตมาตรฐาน
  • ทดสอบใน Matlab 2014b

1

ทับทิม 41

คำตอบ Ruby อื่น ๆ มี WTF ไม่เพียงพอ

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

อย่างน้อยก็ใช้งานได้ใน Ruby 2 ถ้าaและFสวิตช์ทำงานใน 1.8.7 ฉันเดาว่าคุณสามารถวาง$_=เพื่อบันทึกอักขระสามตัว

ย้อนกลับทุกบรรทัดบน 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

Ruby, 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

C # - LINQPAD - 93 - 5 = 88 ไบต์

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

แอป C # Console 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()));}}

regex ลงคออย่างไร้ยางอายจาก Alex A. :)


คุณสามารถบันทึก 7 ไบต์โดยการวางใบสมัครของคุณnamespace Systemแล้วภายใน2xusing Linq;usingText.RegularExpressions ประหยัด system
ldam

ฉันไม่คิดว่านี่จะมีคุณสมบัติสำหรับโบนัส ดูตัวอย่างโบนัสในคำถาม
เครื่องมือเพิ่มประสิทธิภาพ

0

Clojure - 44 71ตัวอักษร

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

ปรับปรุงและลดความซับซ้อนของ RE ลดช่องว่างที่ไม่จำเป็น

เอาท์พุทเป็นลำดับของประโยคในสตริงเดิมโดยที่ลำดับของประโยคกลับด้าน:

อินพุต: "สวัสดีเพื่อนคุณกำลังทำอะไรฉันพนันว่ามันเป็นสิ่งที่ฉันอยากทำเช่นกัน!" ผลลัพธ์: ("ฉันพนันได้ว่ามันเป็นสิ่งที่ฉันต้องการจะทำเช่นกัน!" "คุณกำลังทำอะไรอยู่?" "สวัสดีเพื่อน")


0

ทับทิม, 47

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

เงินให้สินเชื่อแก่Martin Büttnerสำหรับบันทึกตัวละคร


1
คุณสามารถอ่านอินพุตจาก STDIN ด้วยgetsเพื่อบันทึกไบต์พิมพ์ด้วย$><<เพื่อบันทึกไบต์ (ไม่จำเป็นต้องเว้นวรรค) และเข้าร่วมสตริงด้วย*''เพื่อบันทึกสองไบต์
Martin Ender

@ MartinBüttnerขอบคุณสำหรับคำแนะนำฉันจะไม่ไปกับการอ่านจากข้อมูลจาก STDIN แม้ว่า เพียงเพราะจะมีการขึ้นบรรทัดใหม่
Mhmd

อันที่จริงฉันคิดว่ารหัสของคุณจะส่งผลให้พื้นที่นำ
Martin Ender

mmm คุณพูดถูก ฉันจะเห็นสิ่งที่ฉันควรทำ
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.