Membalikkan kalimat

15

Tujuan dari tantangan ini adalah untuk menerima input dan output input tersebut tetapi dengan urutan kalimat terbalik. Input Contoh:

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

Contoh Output:

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

Seperti yang dapat Anda katakan dari contoh, program Anda harus berurusan dengan tanda tanya, poin seru, dan titik. Anda dapat menganggap setiap kalimat memiliki tanda baca dan spasi sebelum kalimat berikutnya. Trailing spasi / baris baru ok, asalkan bisa dibaca. Kode terpendek menang.

Semoga berhasil!

EDIT: Anda dapat mengasumsikan kalimat tidak memiliki tanda kutip atau tanda kurung, tetapi jika Anda membuat kode Anda dapat menangani keduanya, maka Anda mendapatkan -5 byte Contoh output untuk paren / kutipan:

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

sumber
Bisakah kita berasumsi bahwa tidak akan ada tanda kutip atau tanda kurung? Jika tidak, bagaimana kita menanganinya?
BrainSteel
Edit pos yang membersihkan itu.
Bisakah Anda memberikan contoh hasil yang diharapkan untuk kalimat yang berisi kutipan atau parens?
mbomb007
6
Jika sebuah kalimat memiliki tanda baca dalam tanda kutip atau paren, bagaimana seharusnya kita menghadapinya?
isaacg
2
@Simonster Maksudmu "yaitu", dll, kan? Oh, dan tolong ubah kutipan uji saya menjadi:"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.
Bukan berarti Charles

Jawaban:

9

Julia, 45 42 byte - 5 bonus = 37

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

Ini menciptakan fungsi anonim yang menerima string sebagai input dan mengembalikan string dengan kalimatnya terbalik. Ini menangani setiap karakter khusus dengan tepat, meskipun tanda kutip ganda dan tanda dolar harus diloloskan, jika tidak mereka tidak memiliki string yang valid di Julia.

Penjelasan + tidak dikumpulkan:

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

Contoh:

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

Dan jika Anda tidak suka melihat kutipan yang keluar di output:

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.

Disimpan 3 byte pada ekspresi reguler berkat Martin Büttner! Sebelumnya ini digunakan lookbehind a: (?<=[.?!]).

Alex A.
sumber
Saya tidak berpikir ini memenuhi syarat untuk bonus ...
Pengoptimal
@ Opptizer: Bagaimana tidak? Ini berfungsi seperti yang diharapkan dengan tanda kurung, tanda kutip, dll. Seperti yang diberikan dalam pos.
Alex A.
Dapatkah Anda memberikan tautan online untuk menguji, dengan contoh dari bagian bonus dari pertanyaan.
Pengoptimal
@Optimizer: Satu-satunya cara untuk menjalankan versi terbaru online Julia memerlukan pendaftaran dan tidak mendukung permalinks. Apakah cukup memasukkan input dan output di sini di postingan?
Alex A.
Tentu, saya kira ..
Pengoptimal
7

CJam, 23 22 byte

Saya tidak yakin apakah ini memenuhi syarat untuk bonus atau tidak, tapi begini solusinya:

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

Ekspansi Kode (sedikit kedaluwarsa) :

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

Cobalah online di sini

Pengoptimal
sumber
Ah, Anda membuat posting ini tepat setelah saya mengeditnya terlebih dahulu. Anda mendapatkan bonus -5 sekarang (Hanya untuk membuatnya sedikit lebih sulit) Jadi bonus -5 untuk Anda! 18 byte, wow, tidak yakin apakah itu bisa dikalahkan: P
5

J, 35 32

Ini hampir menangani input bonus, kecuali saya harus lolos dari tanda kutip tunggal, jadi saya kira itu tidak masuk hitungan. (Juga, pengiriman pertama saya di sini)

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

Pemakaian:

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

Perl, 27/25

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

Atau dari baris perintah:

$perl -nE'say reverse/ |[^.!?]*./g'
nutki
sumber
Bagus! Anda bisa mendapatkan bonus -5 dengan perl -nE 'say reverse/ |[^.?!]*.\)?/g', sehingga jumlah total Anda menjadi 23.
ThisSuitIsBlackNot
2

PHP, 60

echo join(' ',array_reverse(preg_split('/(?<=[?!.])/',$s)));
romaninsh
sumber
Bisakah Anda menggunakan regex [?!.]\Ksaja?
Martin Ender
Juga bukankah ini menambahkan spasi tambahan ke dalam string kecuali jika Anda memasukkan spasi dalam pola untuk dibagi?
Martin Ender
@ MartinBüttner, tidak, saya tidak akan dapat mengembalikan tanda yang tepat ketika bergabung kembali dengan data, jadi kami membutuhkan sesuatu yang tidak akan mengkonsumsi karakter.
romaninsh
2

Bash + coreutils, 40 byte

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

Ini berbunyi dari STDIN sehingga masukan dapat saya arahkan kembali dari file, atau cukup pip, misalnya:

$ 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. 
$ 
Trauma Digital
sumber
Apakah ini benar-benar berfungsi untuk tanda kurung, yang (foo bar.)ditukar sebagai satu unit?
Martin Ender
@ MartinBüttner Sepertinya pertanyaannya sudah diedit, jadi saya tidak bisa lagi mengklaim bonus :(
Digital Trauma
2

Pip , 25 byte

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

Setelah menambahkan ruang untuk string input, kita menemukan semua indeks ., ?dan !, tambahkan 2, dan menggunakan^@ split-pada operator untuk memecah string menjadi kalimat (masing-masing dengan ruang tambahan). Membalikkan daftar, dan dicetak secara otomatis di akhir program. Voa!

Contoh yang menunjukkan tahapan perhitungan utama dengan input 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! 
DLosc
sumber
Tidak, kamu tidak :)
Pengoptimal
2

Retina , 61 34 33 30 byte

Kredit ke nutki untuk memotong ini sebanyak 24 byte.

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

Dimana <empty> singkatan dari baris kosong. Ini mengasumsikan bahwa #itu bukan bagian dari input, tetapi jika itu tidak sah, saya dapat menukar dengan karakter lain, termasuk "(yang saya hanya perlu menangani untuk bonus) atau sesuatu yang tidak patut dicetak. Anda dapat menjalankan kode seperti itu dalam satu file jika menggunakan -sflag, atau Anda dapat meletakkan setiap baris dalam file terpisah dan meneruskannya ke Retina.

Membalikkan ini dengan penggantian regex tunggal adalah mungkin, tetapi benar-benar rumit. Bahkan dengan grup .NET balancing, saya membutuhkan sekitar 90 byte, jadi saya mencoba melakukannya dalam beberapa langkah.

Di Retina, setiap pasangan garis adalah satu tahap penggantian, di mana garis pertama adalah pola dan garis kedua adalah penggantian.

^
#

Tahap ini hanya menyiapkan string untuk diproses lebih lanjut. Ini menambahkan a# sebagai penanda. Marker ini menunjukkan bahwa semua yang ada di depannya telah diletakkan di tempat yang tepat, dan semua yang setelah itu masih perlu diproses.

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

Tahap ini bertukar kalimat, dengan berulang kali menggerakkan kalimat terakhir di depan #(yang bergerak maju melalui string dalam proses). The +`menginstruksikan Retina mengulangi tahap ini sampai output berhenti berubah. Sebagai contoh, berikut adalah bagaimana input foo. bar! blah?akan diproses:

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

Dan akhirnya kita cukup menghapus penanda:

#
<empty>
Martin Ender
sumber
Mengapa tidak hanya .+=> $0 #dan diulang (.*?[.!?] )(.*#)=> $2$1?
nutki
@ Kacki Oh, itu jauh lebih baik, terima kasih. :)
Martin Ender
1

Jawa, 113

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

JavaScript (ES6) 47 45

Seperti yang dinyatakan, ini adalah latihan regex sederhana. Dalam javascript:

// 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!"))
 

edc65
sumber
Saya akan melakukan javascript, tetapi Anda mengalahkan saya untuk itu.
BobTheAwesome
Ini menghasilkan spasi tambahan sebelum semua kecuali kalimat terakhir (awalnya yang pertama). Tidak yakin apakah itu OK, karena tugasnya tidak didefinisikan dengan baik.
nutki
@ Kacki ya, saya setuju. Diperbaiki
edc65
1

Python 2, 62

Tidak akan meningkatkan untuk bonus, karena itu mungkin tidak sebanding dengan biaya byte.

import re
print' '.join(re.split('(?<=[?!.]).',input())[::-1])
mbomb007
sumber
Ini tidak memenuhi syarat untuk bonus. Lihatlah contoh bonus dalam pertanyaan
Pengoptimal
@Optimizer Lihat di riwayat pertanyaan. Pada saat saya memperbarui pertanyaan saya untuk menambahkan bonus, hasil saya cocok dengan contoh. Tidak ada yang menunjukkan bahwa tanda kurung bisa berada di luar periode.
mbomb007
Saya pikir niatnya hanya ini sejak awal. Namun, sebuah contoh yang solid datang kemudian. Tidak berarti Anda masih mendapatkan bonus :) (Saya juga menghapus bonus saya)
Pengoptimal
1

Matlab (93 byte)

y=[32 input('','s')];y=sortrows([cumsum(ismember(y,'?!.'),'reverse');y]',1)';disp(y(4:2:end))
  • Ini mengasumsikan input tidak mengandung spasi di depan atau di belakang
  • Menggunakan input dan output standar
  • Diuji dalam Matlab 2014b
Luis Mendo
sumber
1

Ruby 41

Jawaban Ruby lainnya tidak memiliki cukup WTF.

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

Ini setidaknya berfungsi di Ruby 2. Jika adan Fswitch berfungsi di 1.8.7, saya kira Anda bisa drop$_= untuk menyimpan tiga karakter.

Membalikkan setiap baris di stdin dan mencetak ke stdout:

$ ruby foo.rb <<< "Hello. Hi. How are you? Good, you? fine, thanks."
fine, thanks. Good, you? How are you? Hi. Hello.
daniero
sumber
Bisakah Anda jelaskan jawabannya.
Mhmd
1

Ruby, 48 (42 tanpa put) byte

reverse_sentence.rb

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

Pemakaian:

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

Keluaran:

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

Criticism more than welcome.

DickieBoy
sumber
2
Criticism: You spelled "sentence" incorrectly.
Alex A.
save 6 characters: .join(" ") => *" "
daniero
@AlexA. Best feedback ever!
DickieBoy
@daniero thanks, nice to know
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."
tmartin
sumber
0

C# - LINQPAD - 93 - 5 = 88 bytes

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

C# Console App 189 - 5 = 184 bytes

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

regex shamelessly flogged from Alex A. :)

jzm
sumber
You can save 7 bytes by putting your application in namespace System then within that using Linq;usingText.RegularExpressions saving 2x system.
ldam
I don't think that this qualifies for the bonus. Look at the bonus example in the question
Optimizer
0

Clojure - 44 71 chars

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

Improved and simplified RE, eliminated unnecessary whitespace.

Output is a sequence of the sentences in the original string, with the order of the sentences reversed:

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

Bob Jarvis - Reinstate Monica
sumber
0

Ruby, 47

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

credits to Martin Büttner, for saving some characters.

Mhmd
sumber
1
You can read the input from STDIN with gets to save a byte, print it with $><< to save byte (no need for a space) and join the string with *'' to save two bytes.
Martin Ender
@MartinBüttner thanks for the suggestion, I wouldn't go with reading from the input from STDIN, though. Simply because there will be a trailing new line.
Mhmd
Actually, I think your code will currently result in a leading space.
Martin Ender
mmm, you're right. I'll see what should I do.
Mhmd
0

CJam, 21 bytes

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

This works by turning spaces after !s, .s and ?s into the number 1 (not the character 1 nor the character with code point 1, so the input can still contain those), splitting at 1's, reversing the order of the resulting chunks and joining by spaces.

Try it online in the CJam interpreter.

How it works

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)
Dennis
sumber