ใช้กฎเครื่องหมายวรรคตอนภาษาอังกฤษ


11

คุณได้รับการว่าจ้างให้เขียนรหัสบางส่วนสำหรับแอปที่เขียนตามคำบอกซึ่งใช้การป้อนข้อมูลด้วยเสียงจากแหล่งพูดพูดแยกเป็นคำและเขียนลงบนหน้าจอ

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

  1. ประโยคเป็นสตริงของอินพุต Word เป็นกลุ่มของอักขระที่ไม่ใช่ช่องว่างที่ต่อเนื่อง ^เครื่องหมายวรรคตอนเป็นคำที่มีตัวอักษรตัวแรกคือ

  2. คำจะเป็นตัวพิมพ์ใหญ่หากตัวอักษรตัวแรกของ Word ไม่ใช่ตัวพิมพ์เล็ก (คำที่เป็นตัวพิมพ์ใหญ่จะตรงกับ regex /[^a-z].*/)

  3. คำแรกของประโยคจะต้องเป็นตัวพิมพ์ใหญ่

  4. A ^COMMAคืออักขระเครื่องหมายจุลภาค,และมีช่องว่างหลัง แต่ไม่นำหน้า จะกลายเป็นaaa ^COMMA bbbaaa, bbb

  5. เป็นเครื่องหมายจุลภาคที่มีลักษณะเหมือน^COLON:

  6. เป็นเครื่องหมายจุลภาคที่มีลักษณะเหมือน^SEMICOLON;

  7. เป็นเครื่องหมายจุลภาคที่มีลักษณะเหมือน^PERIOD .คำต่อไปนี้^PERIODจะต้องเป็นตัวพิมพ์ใหญ่

  8. เป็นช่วงเวลาที่ดูเหมือนว่า^BANG!

  9. A ^DASHคืออักขระเส้นประ-และมีช่องว่างทั้งก่อนหน้าและถัดไป

  10. A ^HYPHENเป็นอักขระเส้นประ-แต่ไม่มีที่ว่างในการติดตามหรือนำหน้า

  11. ^EMDASHคือยัติภังค์ (ไม่รีบ!) --ที่จะสะกด

  12. An ^OPENQUOTEเป็นอักขระเครื่องหมายคำพูด"ที่มีช่องว่างนำหน้า แต่ไม่ได้ติดตาม คำต่อไปนี้^OPENQUOTEจะต้องเป็นตัวพิมพ์ใหญ่ หาก^OPENQUOTEจะนำหน้าด้วยคำที่ไม่ได้เป็นเครื่องหมายวรรคตอนเพิ่มระหว่างคำว่าและ^COMMA ^OPENQUOTEหาก a ^OPENQUOTEนำหน้าด้วยเครื่องหมายวรรคตอนที่ทำให้คำถัดไปเป็นตัวพิมพ์ใหญ่คำนี้จะข้าม^OPENQUOTEไปที่คำถัดไป

  13. A ^CLOSEQUOTEคือ digraph ,"ที่มีช่องว่างตามหลัง แต่ไม่นำหน้า หาก^CLOSEQUOTEนำโดย^COMMA, ^PERIODหรือ^BANGที่เครื่องหมายวรรคตอนหายไปและ^CLOSEQUOTEถูกสะกด,", ."หรือ!"ตามลำดับ หากเครื่องหมายวรรคตอนที่หายไประบุการใช้อักษรตัวพิมพ์ใหญ่การใช้อักษรตัวพิมพ์ใหญ่นั้นจะต้องเกิดขึ้นกับคำถัดไปที่มีอยู่

  14. ช่องว่างเริ่มต้นหรือต่อท้ายในผลลัพธ์สุดท้ายเต็มรูปแบบจะต้องถูกลบออกและสตริงใด ๆ ของสองหรือมากกว่าช่องว่างในแถวจะต้องถูกยุบลงในอักขระช่องว่างเดียว

  15. กรณีใด ๆ ที่ไม่ได้กล่าวถึงข้างต้น (เช่น^COMMA ^COMMAหรือ^SEMICOLON ^CLOSEQUOTEหรือ^UNDEFINEDPUNCTUATION) จะไม่เกิดขึ้นในอินพุตที่มีรูปแบบที่เหมาะสมและเป็นพฤติกรรมที่ไม่ได้กำหนดไว้

ทีมพัฒนาแจ้งให้คุณทราบดังต่อไปนี้:

  • โครงการกำลังเขียนเป็นภาษา[ภาษาของคุณที่นี่]และควรสั้นที่สุดเท่าที่จะเป็นไปได้เพื่อให้ใช้พื้นที่น้อยที่สุดเมื่อเป็นแอพสำหรับ Android / iPhone คุณพยายามอธิบายว่านั่นไม่ใช่วิธีการพัฒนาแอป แต่พวกเขาไม่ฟัง แต่เดี๋ยวก่อนช่างเป็นเรื่องบังเอิญ! คุณเป็นนักกอล์ฟที่ยอดเยี่ยมใน[ภาษาของคุณที่นี่] !

  • แอปจะไม่มีสิทธิ์การเข้าถึงเว็บใด ๆ และจะไม่มีห้องสมุดใด ๆ ที่ติดตั้งซึ่งจัดรูปแบบนี้ให้คุณ คุณอาจโน้มน้าวให้ทีมนำไปสู่การอนุญาตให้คุณใช้ไลบรารี regex หากมีอยู่ในภาษาของคุณ แต่ถ้าคุณคิดว่าคุณต้องการ

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

  • ฝ่ายบริหารเป็นแฟนตัวยงของการพัฒนาที่ขับเคลื่อนด้วยการทดสอบดังนั้นทีมนักพัฒนาจึงมีลิงคีย์บอร์ดที่โชคดีที่เขียนการทดสอบบางส่วนสำหรับโปรแกรมของคุณ: (เพิ่มบรรทัดใหม่เพื่อให้สามารถอ่านได้

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

    hello ^COMMA   world ^BANG
    

    เอาท์พุท:

    Hello, world!
    

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

    once upon a time ^COMMA there was a horse ^PERIOD that horse cost me $50
    ^PERIOD ^OPENQUOTE eat your stupid oats ^COMMA already ^BANG ^CLOSEQUOTE
    I told the horse ^PERIOD the horse neighed back ^OPENQUOTE no ^CLOSEQUOTE
    and died ^PERIOD THE END
    

    เอาท์พุท:

    Once upon a time, there was a horse. That horse cost me $50. "Eat your
    stupid oats, already!" I told the horse. The horse neighed back, "No,"
    and died. THE END
    

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

    begin a ^PERIOD b ^COMMA c ^COLON d ^SEMICOLON e ^BANG f ^HYPHEN g ^DASH h
    ^EMDASH i ^OPENQUOTE j ^PERIOD ^OPENQUOTE k ^SEMICOLON ^OPENQUOTE l
    ^CLOSEQUOTE m ^BANG ^CLOSEQUOTE n ^PERIOD 0x6C6F6C end
    

    เอาท์พุท:

    Begin a. B, c: d; e! F-g - h--i, "j. "K; "l," m!" N. 0x6C6F6C end
    

นี่คือรหัสกอล์ฟ: คะแนนต่ำสุดชนะ คุณสามารถเขียนฟังก์ชันของอาร์กิวเมนต์สตริงหนึ่งตัวหรือโปรแกรมอ่านจาก STDIN และเขียนไปยัง STDOUT


ถ้าฉันต้องการใช้จาวาสคริปต์ล่ะ ไม่มีอินพุตมาตรฐานอยู่ในนั้น ฉันสามารถใช้prompt()?
nicael

@nicael OP กล่าวถึงการใช้อาร์กิวเมนต์หนึ่งสตริงดังนั้นสำหรับตัวอย่าง JS ของฉันฉันเพิ่งสร้างฟังก์ชั่นที่รับหนึ่งอาร์กิวเมนต์และคิดว่าอาร์กิวเมนต์นั้นเป็นสตริงของคำที่คล้ายกับ STDIN
Eric Lagergren

1
ฉันสงสัยว่ามี esolang ชื่อ "[ภาษาของคุณที่นี่]"
Akangka

คำตอบ:


4

JavaScript: 653 611 547 514 487 ไบต์

โอวพระเจ้า. Brendan Eich ฉันขอโทษสำหรับสิ่งนี้

PS: ฉันได้เพิ่มพื้นที่สีขาวเพื่อให้อ่านได้ แต่การเปิดพื้นที่สีขาวที่อนุญาตทั้งหมดส่งผลให้เกิดการนับจำนวนไบต์ที่ระบุไว้

ในทางทฤษฎีฉันสามารถทำให้บางส่วนสั้นลงเช่น-e-สิ่งที่ต้องการ-eหรือ-eแต่อาจทำให้เกิดปัญหาหากคำก่อนหน้านี้ลงท้ายด้วยหรือคำต่อไปนี้เริ่มต้นด้วยตัวอักษร 'e' (หรือคำใดก็ตามที่ฉันตัดสินใจที่จะใช้) ฉันคิดว่าฉันสามารถใช้อักขระ ASCII ได้ ฉันจะดูว่า

487 FF22 + เท่านั้น

R = "replace", C = "charAt", U = "toUpperCase";
alert(a[R](/\^((COMMA)|(SEMICOLON)|(COLON)|(PERIOD)|(BANG)|(DASH)|(HYPHEN)|(EMDASH)|(OPENQUOTE)|(CLOSEQUOTE))/g, ((m, _, a, b, c, d, e, f, g, h, i, j) => a ? "," : b ? ";" : c ? ":" : d ? "." : e ? "!" : f ? "-" : g ? "-h-" : h ? "-e-" : i ? ' "' : '" '))[R](/\s((\.)|(\!)|(\,)|(\;)|(\:)|(\-\h\-\s)|(\-\e\-\s))/g, ((k, l, v, n, o, p, q, r, s) => v ? "." : n ? "!" : o ? "," : p ? ";" : q ? ":" : r ? "-" : "--"))[R](/[^!,"'.]\"\s/g, '"')[R](/.+?[\.\?\!](\s|$)/g, (t => t[C](0)[U]() + t.substr(1)))[R](/\"[a-z]/g, (u => u[C](0) + u[C](1)[U]())))

514 FF22 + เท่านั้น

alert(function(z) {
    R = "replace", C = "charAt", U = "toUpperCase";
    return z[R](/\^((COMMA)|(SEMICOLON)|(COLON)|(PERIOD)|(BANG)|(DASH)|(HYPHEN)|(EMDASH)|(OPENQUOTE)|(CLOSEQUOTE))/g, ((m, _, a, b, c, d, e, f, g, h, i, j) => a ? "," : b ? ";" : c ? ":" : d ? "." : e ? "!" : f ? "-" : g ? "-h-" : h ? "-e-" : i ? ' "' : '" '))[R](/\s+((\.)|(\!)|(\,)|(\;)|(\:)|(\-\h\-\s+)|(\-\e\-\s+))/g, ((k, l, v, n, o, p, q, r, s) => v ? "." : n ? "!" : o ? "," : p ? ";" : q ? ":" : r ? "-" : "--"))[R](/[^!,"'.]\"\s/g, '"')[R](/.+?[\.\?\!](\s+|$)/g, (t => t[C](0)[U]() + t.substr(1)))[R](/\"[a-z]/g, (u => u[C](0) + u[C](1)[U]()))
}(a))

547 FF22 + เท่านั้น

alert(function(z) {
    R = "replace", C = "charAt", U = "toUpperCase";
    return z[R](/\^((COMMA)|(SEMICOLON)|(COLON)|(PERIOD)|(BANG)|(DASH)|(HYPHEN)|(EMDASH)|(OPENQUOTE)|(CLOSEQUOTE))/g, ((m, _, a, b, c, d, e, f, g, h, i, j) => a ? "," : b ? ";" : c ? ":" : d ? "." : e ? "!" : f ? "-" : g ? "-h-" : h ? "-e-" : i ? ' "' : '" '))[R](/\s+((\.)|(\!)|(\,)|(\;)|(\:)|(\-\h\-\s+)|(\-\e\-\s+))/g, ((xx, __, k, l, m, n, o, p, q) => k ? "." : l ? "!" : m ? "," : n ? ";" : o ? ":" : p ? "-" : "--"))[R](/[^!,"'.]\"\s/g, '"')[R](/.+?[\.\?\!](\s+|$)/g, function(r) {
        return r[C](0)[U]() + r.substr(1)
    })[R](/\"[a-z]/g, function(s) {
        return s[C](0) + s[C](1)[U]()
    })
}(a))

611 FF 22+ เท่านั้น

alert(function(c) {
    return c.replace(/\^((COMMA)|(SEMICOLON)|(COLON)|(PERIOD)|(BANG)|(DASH)|(HYPHEN)|(EMDASH)|(OPENQUOTE)|(CLOSEQUOTE))/g, ((x, _, a, b, c, d, e, f, g, h, i) = > a ? "," : b ? ";" : c ? ":" : d ? "." : e ? "!" : f ? "-" : g ? "-h-" : h ? "-e-" : i ? ' "' : '" ')).replace(/\s+\./g, ".").replace(/\s+\!/g, "!").replace(/\s+\,/g, ",").replace(/\s+\;/g, ";").replace(/\s+\:/g, ":").replace(/\s\-\h\-\s/g, "-").replace(/[^!,"'.]\"\s/g, '"').replace(/\s+\-\e-\s+/g, "--").replace(/.+?[\.\?\!](\s+|$)/g, function(b) {
        return b.charAt(0).toUpperCase() + b.substr(1)
    }).replace(/\"[a-z]/g, function(b) {
        return b.charAt(0) + b.charAt(1).toUpperCase()
    })
}(a))

653 cross-browser

alert(function(c) {
    return c.replace(/\^COMMA/g, ",").replace(/\^SEMICOLON/g, ";").replace(/\^COLON/g, ":").replace(/\^PERIOD/g, ".").replace(/\^BANG/g, "!").replace(/\^DASH/g, "-").replace(/\^HYPHEN/g, "h-h").replace(/\^EMDASH/g, "-e-").replace(/\^OPENQUOTE/g, ' "').replace(/\^CLOSEQUOTE/g, '" ').replace(/\s+\./g, ".").replace(/\s+\!/g, "!").replace(/\s+\,/g, ",").replace(/\s+\;/g, ";").replace(/\s+\:/g, ":").replace(/\s\h\-\h\s/g, "-").replace(/[^!,"'.]\"\s/g, '"').replace(/\s+\-\e-\s+/g, "--").replace(/.+?[\.\?\!](\s|$)/g, function(b) {
        return b.charAt(0).toUpperCase() + b.substr(1)
    }).replace(/\"[a-z]/g, function(b) {
        return b.charAt(0) + b.charAt(1).toUpperCase()
    })
}(a))

มันทำงานอย่างไร:

https://gist.github.com/ericlagergren/1a61b5d772ae49ab3aea

JSFiddle (สำหรับโซลูชันข้ามเบราว์เซอร์ 653 ไบต์)

JSFiddle (สำหรับโซลูชัน595 FF 22+ เท่านั้น )

JSFiddle (สำหรับโซลูชัน547 FF 22+ เท่านั้น )

JSFiddle (สำหรับโซลูชัน514 FF 22+ เท่านั้น )

JSFiddle (สำหรับโซลูชัน487 FF 22+ เท่านั้น )

นี่เป็นครั้งแรกที่ฉันต้องเขียน JS ที่ใช้มากกว่าหนึ่ง regex และโดยปกติ regex ของฉันจะถูกกำหนดไว้ล่วงหน้า

ฉันจะกำจัดไบต์ต่อไปให้ได้มากที่สุด


คุณสามารถย่อขนาดการแทนที่ครั้งแรกของคุณเช่นนี้: c.replace(/\^((COMMA)|(SEMICOLON)|(COLON)|(PERIOD)|(BANG))/g,(m,_,a,b,c,d,e)=>a?',':b?';':c?':':d?'.':'!'))... และอื่น ๆ Arrow sintax นั้นสั้น แต่แม้ 'ฟังก์ชั่น' ก็ควรประหยัด chars เดียวกัน
edc65

คุณถูก. ฉันทดสอบ regexp ด้วย Chrome และไม่รองรับลูกศรไขมัน ฉันกำลังพยายามทำให้มันตรงกับ FF ในขณะนี้ แต่ฉันเกลียดที่ regexps ไม่มีตัวดำเนินการ "และ" อย่างที่พวกเขาทำ "หรือ" @ edc65
Eric Lagergren

@ edc65 ดังนั้นฉันคิดว่าฉันจะต้องใช้สอง=>s เพื่อให้มันทำงานได้ แต่การใช้ลูกศรช่วยฉันด้วย 40 ไบต์!
Eric Lagergren

แทนที่แทนที่ด้วย R = 'แทนที่' ... [R] ;-)
edc65

แค่ทำอย่างนั้น :) ลงไปที่ 563 @ edc65
Eric Lagergren

1

PHP, 412 ไบต์

(Ungolfed ที่นี่เพื่อความชัดเจนดู ideone สำหรับรุ่น golfed )

PHP preg_replace () ของฟังก์ชั่นจะยอมรับข้อโต้แย้งอาร์เรย์ซึ่งค่อนข้างมีประโยชน์ที่นี่ ฉันคิดว่ารหัสต่อไปนี้ทำทุกอย่างที่จำเป็น มันผ่านกรณีทดสอบทั้งหมดอย่างน้อย

function x($s) {
    $r='preg_replace';
    $s=$r('/ +/',' ',$s);
    $s=$r(array('/ \^COMMA/','/ \^COLON/','/ \^SEMICOLON/','/ \^PERIOD/','/ \^BANG/',
                '/\^DASH/','/ \^HYPHEN /','/ \^EMDASH /','/\^OPENQUOTE /','/ \^CLOSEQUOTE/'),
          array(',',':',';','.','!','-','-','--','"',',"'),
          $s);
    $s=$r('/(^\W*\w|([\.!]| ")\W+\w)/e','strtoupper("$0")',$s);
    $s=$r('/([,\.!]),/','\1',$s);
    $s=$r('/(\w)( "\w)/e','"$1,".strtoupper("$2")',$s);
    echo $s;
}

ทำงานได้อย่างสมบูรณ์แบบ! ideone.com/AYtTiIแม้ว่าสิ่งที่ฉันสับสนเกี่ยวกับคือเราควรจะมีเครื่องหมายจุลภาคก่อนที่จะเปิดราคา? เพราะการพูดทางไวยากรณ์เครื่องหมายคำพูดนั้นมีความหมายมากกว่าคำพูด แต่มีเพียงคำพูดเท่านั้นที่มีเครื่องหมายจุลภาคอยู่ข้างหน้าเครื่องหมายคำพูด ฉันสันนิษฐานว่ามี ^ COMMA เราต้องการให้ผู้ใช้ป้อนเครื่องหมายจุลภาค
Eric Lagergren
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.