Các dấu chấm than và dấu chấm hỏi bình thường và đảo ngược


13

Thử thách

Chúng tôi sẽ đưa ra dấu chấm than và dấu chấm hỏi cho bạn bè!

Cho một phần văn bản chứa các câu kết thúc bằng ., ?hoặc !, đặt trước các dấu hỏi đảo ngược ¿, cho các câu hỏi (câu kết thúc bằng ?) và dấu chấm than ngược ¡, để cảm thán (câu kết thúc bằng !). Các câu kết thúc bằng .được bỏ qua.

Các câu sẽ được phân tách bằng khoảng trắng (dấu cách, tab và / hoặc dòng mới) và sẽ chỉ chứa chữ và số, dấu phẩy, dấu nháy đơn và dấu cách. Mỗi câu sẽ có ít nhất một từ. Từ đầu tiên của mỗi câu được đảm bảo viết hoa. Đầu vào có thể bắt đầu và kết thúc với bất kỳ khoảng trắng nào.

Thí dụ

Đầu vào:

  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.

Đầu ra:

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

Quy tắc

  • Tất cả các quy tắc Code Golf mặc định được áp dụng.
  • Chương trình có số lượng byte ngắn nhất sẽ thắng.

Tiền thưởng (giảm 17%) - Phân tích nhiều điểm

Một câu cũng có thể kết thúc bằng nhiều dấu chấm than / dấu hỏi. Đặt cho mỗi dấu này một dấu chấm than / câu hỏi ngược được ghép nối để giảm thêm 17% số byte của bạn.

Thí dụ

Đầu vào:

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

Đầu ra:

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

Đầu ra không chính xác :

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

Chúng ta có thể chọn loại khoảng trắng nào phân tách các câu hoặc chúng ta phải hỗ trợ cả 3 loại?
Mego

@Mego Cả ba loại nên được hỗ trợ.
usandfriends

Không, một câu sẽ luôn có ít nhất một từ trong đó và sẽ kết thúc bằng một trong ba ký tự dấu chấm câu được phép. Tôi sẽ thêm điều đó vào thử thách.
usandfriends

Câu trả lời:


5

Võng mạc , 39 37 34 byte

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

Hãy thử trực tuyến.

Giải trình

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

Điều này khớp với một câu kết thúc bằng dấu chấm than hoặc dấu chấm hỏi và thêm ký tự dấu chấm câu đó vào câu. Bây giờ chúng ta biết rằng tất cả !hoặc ?ngay lập tức được theo sau bởi một ký tự không phải khoảng trắng phải là những ký tự chúng ta chèn vào, bởi vì các ký tự gốc phải được phân tách khỏi ký tự tiếp theo bởi một khoảng trắng.

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

Giai đoạn chuyển ngữ này biến tất cả !?thành ¡¿, tương ứng, miễn là chúng được tìm thấy trong một trận đấu \S\b, chỉ áp dụng cho những gì chúng ta vừa chèn. Thay thế cả hai trong hai thay thế riêng biệt trong cùng một số byte, nhưng tôi thích ngữ nghĩa của giai đoạn chuyển ngữ ở đây.


3

Toán học 137 byte

Không phải là ngắn nhất, nhưng đó là niềm vui để làm.

TextSentenceschia văn bản đầu vào thành câu và StringPositiontìm vị trí bắt đầu và kết thúc của mỗi câu trong văn bản. Dấu câu lộn ngược được chèn vào đầu mỗi câu theo yêu cầu.

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,"!","¡"],"?","¿"]&

Cách sử dụng, giả sử văn bản là đầu vào tại t,

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

đầu ra


1
Thật tuyệt, một giải pháp không sử dụng RegExp!
tôi

3

Sed, 61 byte

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

Chạy thử nghiệm :

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

1
Về mặt kỹ thuật, đây là 61 byte khi các ký tự đảo ngược được tính là 2 byte.
tôi

@usandfriends đúng, đã sửa
Aaron

Nếu bạn sử dụng -rcờ thành (GNU) sed, bạn không cần phải thoát ()điều này sẽ giúp bạn tiết kiệm 8. Bạn cần phải thêm một điểm phụ để sử dụng tùy chọn không mặc định này.
Chấn thương kỹ thuật số

@DigitalTrauma Tôi biết mẹo đó và đã thử nó nhưng nó không trả lại cùng một đầu ra: "Xin chào! Name Tên bạn là gì? ¿" Thay vì "¡Xin chào!" Tên bạn là gì? "
Aaron

3

Javascript (ES6), 86 79 66 63 byte

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

Ung dung:

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

Sử dụng:

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.`))

Sẽ triển khai giải pháp thưởng sớm.

Cảm ơn:
@ user81655 , 86 => 79 byte


1
Một vài cải tiến giúp tiết kiệm 9 byte:i=>i.replace(/[A-Z][^.!?]*[.!?]/g,k=>(r=k.slice(-1))<'.'?'¡'+k:r>'.'?'¿'+k:k)
user81655

@ user81655 Có vẻ như nó tiết kiệm 7 byte thay vì 9, nhưng bất kể, cảm ơn vì điều đó! Đã có thể loại bỏ nhiều byte hơn bằng cách bỏ qua kiểm tra các câu kết thúc bằng ..
usandfriends

3

Toán học, 101 92 91 byte

StringReplace[#,RegularExpression@"[A-Z][^.]*?([?!])":><|"?"->"¿","!"->"¡"|>@"$1"<>"$0"]&

Bạn sẽ giải thích làm thế nào điều này hoạt động?
DavidC

1
@DavidC Thật khó khăn.
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())

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.