Pasangan tanda seru dan tanda tanya yang terbalik dan normal

13

Tantangan

¡Kami akan memberikan tanda seru dan tanda tanya teman terbalik!

Diberikan teks berisi kalimat yang diakhiri dengan .,, ?atau !, dipertanyakan tanda tanya terbalik ¿,, untuk kalimat interogatif (kalimat berakhiran ?) dan tanda seru terbalik ¡,, hingga seruan (kalimat berakhiran !). Kalimat yang diakhiri .harus diabaikan.

Kalimat akan dipisahkan oleh spasi putih (spasi, tab, dan / atau baris baru) dan hanya akan berisi alfanumerik, koma, apostrof, dan spasi. Setiap kalimat memiliki setidaknya satu kata. Kata pertama dari setiap kalimat dijamin menjadi huruf besar. Input dapat dimulai dan diakhiri dengan spasi putih apa pun.

Contoh

Memasukkan:

  Hello there!      What is your name?
My name is Ron. What's your name?
My name is Alex.  Nice to meet you!
Nice to meet you to!  How was your break?
It was great, I spent all my time code golfing!
What's that?
        Wow, you're such a n00b! Here, let me show you.

Keluaran:

  ¡Hello there!      ¿What is your name?
My name is Ron. ¿What's your name?
My name is Alex.  ¡Nice to meet you!
¡Nice to meet you to!  ¿How was your break?
¡It was great, I spent all my time code golfing!
¿What's that?
        ¡Wow, you're such a n00b! Here, let me show you.

Aturan

  • Semua aturan Golf Code default berlaku.
  • Program dengan jumlah byte terpendek akan menang.

Bonus (diskon 17%) - Mengurai banyak nilai

Sebuah kalimat juga dapat diakhiri dengan beberapa tanda seru / tanda tanya. Berikan masing-masing tanda ini tanda seru terbalik / tanda tanya untuk tambahan 17% dari jumlah byte Anda.

Contoh

Memasukkan:

I am a man in a can doing a dance?? Maybe...
              Doing it for the views??!???!

Keluaran:

¿¿I am a man in a can doing a dance?? Maybe...
              ¡¿¿¿¡¿¿Doing it for the views??!???!

Output salah :

¿¿I am a man in a can doing a dance?? Maybe...
              ¿¿¡¿¿¿¡Doing it for the views??!???!
kita dan teman
sumber
Apakah kita bisa memilih spasi apa yang memisahkan kalimat, atau apakah kita harus mendukung ketiga jenis?
Mego
@Mego Ketiga jenis ini harus didukung.
usandfriends
Tidak, sebuah kalimat akan selalu memiliki setidaknya satu kata di dalamnya dan akan berakhir dengan salah satu dari tiga karakter tanda baca yang diizinkan. Saya akan menambahkan itu ke tantangan.
usandfriends

Jawaban:

5

Retina , 39 37 34 byte

\w[^.]*?([!?])
$1$0
T`?!`¿¡`\S\b

Cobalah online.

Penjelasan

\w[^.]*?([!?])
$1$0

Ini cocok dengan kalimat yang berakhir dengan tanda seru atau tanda tanya, dan menambahkan karakter tanda baca itu ke kalimat. Sekarang kita tahu bahwa semua !atau ?yang segera diikuti oleh karakter non-spasi harus yang kita masukkan, karena yang asli harus dipisahkan dari karakter selanjutnya oleh spasi.

T`!?`¡¿`\S\b

Tahap transliterasi ini mengubah semua !dan ?menjadi ¡dan ¿, masing-masing, asalkan mereka ditemukan dalam kecocokan \S\b, yang hanya berlaku untuk yang baru saja kita masukkan. Mengganti keduanya dalam dua substitusi terpisah dalam jumlah byte yang sama, tetapi saya lebih suka semantik dari tahap transliterasi di sini.

Martin Ender
sumber
3

Mathematica 137 byte

Bukan yang terpendek, tapi itu menyenangkan untuk dilakukan.

TextSentencesmemecah teks input menjadi kalimat dan StringPositionmenemukan posisi awal dan akhir dari setiap kalimat dalam teks. Tanda baca terbalik dimasukkan pada awal setiap kalimat seperti yang diperlukan.

w=StringPosition;f[x_,y_,q_]:=StringInsert[x,q,x~w~y/.{a_,a_}->a/.(x~w~#&/@TextSentences@#&@x/.{{c_,d_}}:>d->c)];f[f[t,"!","¡"],"?","¿"]&

Penggunaan, dengan asumsi teks dimasukkan pada t,

f[f[#,"!","¡"],"?","¿"]&[t]

keluaran

DavidC
sumber
1
Keren, solusi yang tidak menggunakan RegExp!
usandfriends
3

Sed, 61 byte

s/\(\s*\)\([^.!?]*!\)/\1¡\2/g;s/\(\s*\)\([^.!?]*?\)/\1¿\2/g

Uji coba:

$ echo """Hello there!      What is your name?
My name is Ron. What's your name?
My name is Alex.  Nice to meet you!
Nice to meet you to!  How was your break?
It was great, I spent all my time code golfing!
What's that?
        Wow, you're such a n00b! Here, let me show you.""" | sed 's/\(\s*\)\([^.!?]*!\)/\1¡\2/g;s/\(\s*\)\([^.!?]*?\)/\1¿\2/g'
¡Hello there!      ¿What is your name?
My name is Ron. ¿What's your name?
My name is Alex.  ¡Nice to meet you!
¡Nice to meet you to!  ¿How was your break?
¡It was great, I spent all my time code golfing!
¿What's that?
        ¡Wow, you're such a n00b! Here, let me show you.
Harun
sumber
1
Ini secara teknis 61 byte karena karakter terbalik dihitung sebagai 2 byte.
usandfriends
@penggunaanku benar, sudah diperbaiki
Aaron
Jika Anda menggunakan -rflag to (GNU) sed, Anda tidak perlu melarikan diri dari (dan )yang seharusnya menyelamatkan Anda 8. Anda perlu menambahkan poin tambahan untuk penggunaan opsi non-default ini.
Digital Trauma
@DigitalTrauma Saya tahu trik itu dan mencobanya tetapi tidak menghasilkan output yang sama: "¿¡Halo di sana! ¿Siapa namamu? ¿" Alih-alih "¡Halo di sana! ¿Siapa namamu?"
Aaron
3

Javascript (ES6), 86 79 66 63 byte

i=>i.replace(/\w[^.!?]*[!?]/g,k=>(k.slice(-1)>'>'?'¿':'¡')+k)

Tidak Disatukan:

func = inp => inp.replace(/\w[^.!?]*[!?]/g, sentence => (sentence.slice(-1) > '>' ? '¿' : '¡') + sentence)

Pemakaian:

console.log(func(`Hello there!      What is your name?
My name is Ron. What's your name?
My name is Alex.  Nice to meet you!
Nice to meet you to!  How was your break?
It was great, I spent all my time code golfing!
What's that?
            Wow, you're such a n00b! Here, let me show you.`))

Akan mengimplementasikan solusi bonus segera.

Terima kasih kepada:
@ user81655 , 86 => 79 byte

kita dan teman
sumber
1
Beberapa perbaikan yang menghemat 9 byte:i=>i.replace(/[A-Z][^.!?]*[.!?]/g,k=>(r=k.slice(-1))<'.'?'¡'+k:r>'.'?'¿'+k:k)
user81655
@ user81655 Sepertinya ini menghemat 7 byte, bukan 9, tapi terlepas dari itu, terima kasih untuk itu! Mampu menghapus lebih banyak byte dengan melewatkan memeriksa kalimat yang diakhiri ..
usandfriends
3

Mathematica, 101 92 91 byte

StringReplace[#,RegularExpression@"[A-Z][^.]*?([?!])":><|"?"->"¿","!"->"¡"|>@"$1"<>"$0"]&
LegionMammal978
sumber
Apakah Anda akan menjelaskan cara kerjanya?
DavidC
1
@ DavidC Ini rumit.
LegionMammal978
1

Python 2, 127,82 (154-17%) byte

import re
print re.sub("([A-Z][\w ,']*)([\.!\?]+)",lambda m:''.join({'!':'¡','?':'¿','.':''}[c]for c in m.group(2))[::-1]+m.group(1)+m.group(2),input())
TFeld
sumber