คู่ของเครื่องหมายอัศเจรีย์และเครื่องหมายคำถามปกติและคว่ำ


13

ท้าทาย

¡เราจะให้เครื่องหมายตกใจและเครื่องหมายคำถามกลับหัว!

ได้รับร่างของข้อความที่มีประโยคที่ลงท้ายด้วย., ?หรือ!, ย่อหน้าฤๅษีเครื่องหมายคำถาม¿เพื่อประโยคคำถาม (ประโยคที่ลงท้ายด้วย?) และเครื่องหมายอัศเจรีย์คว่ำ¡เพื่ออุทาน (ประโยคในตอนจบ!) ประโยคที่ลงท้ายด้วย.จะถูกละเว้น

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

ตัวอย่าง

การป้อนข้อมูล:

  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.

เอาท์พุท:

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

กฎระเบียบ

  • ใช้กฎของรหัสกอล์ฟเริ่มต้นทั้งหมด
  • โปรแกรมที่มีจำนวนไบต์สั้นที่สุดชนะ

โบนัส (ลด 17%) - แยกวิเคราะห์หลายเครื่องหมาย

ประโยคสามารถลงท้ายด้วยเครื่องหมายอัศเจรีย์ / คำถามได้หลายรายการ ให้แต่ละเครื่องหมายเหล่านี้มีเครื่องหมายอัศเจรีย์ / ผกผันผกผันจับคู่เพื่อรับส่วนลด 17% เพิ่มเติมจากการนับไบต์ของคุณ

ตัวอย่าง

การป้อนข้อมูล:

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

เอาท์พุท:

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

เอาต์พุตไม่ถูกต้อง :

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

เราต้องเลือกช่องว่างเรียงประโยคหรือไม่หรือเราต้องสนับสนุนทั้ง 3 ประเภท?
Mego

@Mego ทั้งสามประเภทควรได้รับการสนับสนุน
usandfriends

ไม่ประโยคหนึ่งประโยคจะมีอย่างน้อยหนึ่งคำในนั้นและจะลงท้ายด้วยหนึ่งในสามของเครื่องหมายวรรคตอนที่อนุญาต ฉันจะเพิ่มมันเข้าไปในการท้าทาย
usandfriends

คำตอบ:


5

Retina , 39 37 34 ไบต์

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

ลองออนไลน์

คำอธิบาย

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

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

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

ขั้นตอนการทับศัพท์นี้จะเปิดทั้งหมด!และ?เข้าไปใน¡และ¿ตามลำดับให้พวกเขากำลังพบได้ในการแข่งขัน\S\bซึ่งใช้เฉพาะกับคนที่เราเพียงแค่แทรก การแทนที่ทั้งสองในการแทนที่สองแบบแยกกันในจำนวนไบต์เดียวกัน แต่ฉันชอบซีแมนทิกส์ของสเตจการถอดเสียงที่นี่


3

Mathematica 137 ไบต์

ไม่ใช่สั้นที่สุด แต่ก็สนุกที่จะทำ

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

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

การใช้งานสมมติว่าข้อความที่เป็นการป้อนข้อมูลที่t,

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

เอาท์พุต


1
เยี่ยมเลยโซลูชันที่ไม่ได้ใช้ RegExp!
usandfriends

3

Sed, 61 ไบต์

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

ทดสอบการทำงาน:

$ 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
เทคนิคนี้มี 61 ไบต์เนื่องจากอักขระที่กลับด้านนับเป็น 2 ไบต์
usandfriends

@usandfriends ถูกต้องแก้ไขแล้ว
Aaron

หากคุณใช้การ-rตั้งค่าสถานะเพื่อ (GNU) คุณไม่จำเป็นต้องหลบหนี(และ)ควรช่วยคุณ 8 คุณต้องเพิ่มจุดพิเศษสำหรับการใช้ตัวเลือกที่ไม่ใช่ค่าเริ่มต้นนี้
Digital Trauma

@DigitalTrauma ฉันรู้เคล็ดลับและลองมัน แต่มันก็ไม่ได้ส่งออกผลลัพธ์เดียวกัน: "¿¡สวัสดีที่นั่น! ¿คุณชื่ออะไร? ¿" แทนที่จะเป็น "¡สวัสดีที่นั่น! ¿ชื่อของคุณคืออะไร"
แอรอน

3

Javascript (ES6), 86 79 66 63 ไบต์

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

Ungolfed:

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

การใช้งาน:

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

จะใช้โซลูชันโบนัสในไม่ช้า

ขอบคุณ:
@ user81655 , 86 => 79 ไบต์


1
การปรับปรุงเล็ก ๆ น้อย ๆ ซึ่งประหยัดได้ 9 ไบต์:i=>i.replace(/[A-Z][^.!?]*[.!?]/g,k=>(r=k.slice(-1))<'.'?'¡'+k:r>'.'?'¿'+k:k)
user81655

@ user81655 ดูเหมือนว่าจะช่วยประหยัด 7 ไบต์แทน 9 แต่ไม่ว่าจะเป็นเช่นไรขอบคุณสำหรับสิ่งนั้น! สามารถลบไบต์ได้มากขึ้นโดยข้ามการตรวจสอบประโยคที่ลงท้าย.ด้วย
usandfriends

3

Mathematica, 101 92 91 ไบต์

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

คุณจะอธิบายวิธีการทำงานนี้ได้อย่างไร
DavidC

1
@DavidC มันยุ่งยาก
LegionMammal978

1

Python 2, 127.82 (154-17%) ไบต์

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())

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.