Áp dụng quy tắc chấm câu tiếng Anh


11

Bạn đã được thuê để viết một số mã cho một ứng dụng đọc chính tả, lấy đầu vào bằng giọng nói từ một nguồn nói, phân tích nó thành các từ và viết nó xuống trên màn hình.

Ban quản lý không thực sự tin tưởng bạn với tất cả sức mạnh của dự án mà bạn đã biết ngồi quanh và chơi golf cả ngày thay vì làm công việc của mình, thật không may, vì vậy họ chỉ giao cho bạn một nhiệm vụ thực sự đơn giản: thực hiện Câu có dấu chấm xen kẽ vào một câu được định dạng đúng, trong đó 'được định dạng đúng' được định nghĩa bên dưới.

  1. Câu là chuỗi đầu vào. Một từ là một nhóm các ký tự không phải không gian dự phòng. Dấu chấm câu là một từ có ký tự đầu tiên ^.

  2. Một từ được viết hoa nếu chữ cái đầu tiên của Word không phải là chữ cái viết thường (các từ viết hoa khớp với biểu thức chính quy /[^a-z].*/).

  3. Lời đầu tiên của câu phải được viết hoa.

  4. A ^COMMAlà ký tự dấu phẩy ,và có khoảng trắng theo sau nhưng không đứng trước. aaa ^COMMA bbbtrở thành aaa, bbb.

  5. A ^COLONlà một dấu phẩy trông giống như :.

  6. A ^SEMICOLONlà một dấu phẩy trông giống như ;.

  7. A ^PERIODlà một dấu phẩy trông giống như .. Các từ theo sau ^PERIODphải được viết hoa.

  8. A ^BANGlà một khoảng thời gian trông như thế !.

  9. A ^DASHlà ký tự gạch ngang -và có khoảng trắng ở cả trước và sau.

  10. A ^HYPHENcũng là ký tự gạch ngang -nhưng không có khoảng trắng theo sau hoặc trước.

  11. An ^EMDASHlà một dấu gạch nối (không phải dấu gạch ngang!) Được đánh vần --.

  12. An ^OPENQUOTElà một ký tự trích dẫn "có một khoảng trắng ở trước nhưng không theo sau. Các từ theo sau ^OPENQUOTEphải được viết hoa. Nếu một từ ^OPENQUOTEđứng trước một từ không có dấu chấm câu, hãy thêm một ^COMMAtừ giữa từ đó và ^OPENQUOTE. Nếu an ^OPENQUOTEđứng trước Dấu chấm câu làm cho từ tiếp theo được viết hoa, thì từ này sẽ bỏ qua ^OPENQUOTEtừ tiếp theo.

  13. A ^CLOSEQUOTElà sơ đồ ,"có không gian theo sau nhưng không có trước. Nếu ^CLOSEQUOTElà trước bởi một ^COMMA, ^PERIODhoặc ^BANG, đó Punctuation biến mất và ^CLOSEQUOTEđược đánh vần ,", ."hoặc !"tương ứng. Nếu Dấu chấm câu biến mất chỉ định viết hoa, thì viết hoa đó vẫn phải xuất hiện trên từ có sẵn tiếp theo.

  14. Các không gian ban đầu hoặc dấu trong kết quả cuối cùng phải được loại bỏ và bất kỳ chuỗi nào có hai hoặc nhiều khoảng trắng trong một hàng phải được thu gọn thành một ký tự khoảng trắng.

  15. Bất kỳ trường hợp nào không được đề cập ở trên (ví dụ ^COMMA ^COMMAhoặc ^SEMICOLON ^CLOSEQUOTEhoặc ^UNDEFINEDPUNCTUATION) sẽ không xảy ra trong đầu vào được định dạng tốt và do đó là hành vi không xác định.

Nhóm phát triển thông báo cho bạn về những điều sau đây:

  • Dự án đang được viết bằng ngôn ngữ [ ngôn ngữ của bạn ở đây] và nên càng ngắn càng tốt để nó chiếm ít không gian nhất có thể khi đó là một ứng dụng cho Android / iPhone. Bạn cố gắng giải thích rằng đó không phải là cách phát triển ứng dụng hoạt động, nhưng họ không lắng nghe. Nhưng này, thật là một sự trùng hợp! Bạn là một tay golf tuyệt vời trong [ngôn ngữ của bạn ở đây] !

  • Ứng dụng sẽ không có bất kỳ quyền truy cập web nào và sẽ không có bất kỳ thư viện nào được cài đặt thực hiện định dạng này cho bạn. Bạn có thể có thể thuyết phục nhóm trưởng cho phép bạn một thư viện regex nếu một ngôn ngữ tồn tại cho ngôn ngữ của bạn, tuy nhiên, nếu bạn nghĩ rằng bạn cần một thư viện.

  • Hỗ trợ cho các trích dẫn lồng nhau sử dụng các trích dẫn kép / đơn đúng cách được lên kế hoạch cho phiên bản mới hơn của ứng dụng, nhưng không phải là phiên bản mà bạn đang làm việc bây giờ, vì vậy đừng lo lắng về nó.

  • Ban quản lý là một fan hâm mộ lớn của sự phát triển dựa trên thử nghiệm, và vì vậy nhóm phát triển đã có một số khỉ bàn phím không may viết ra một số bài kiểm tra cho phần chương trình của bạn: (dòng mới được thêm vào để dễ đọc, coi chúng là khoảng trắng)

    Đầu vào:

    hello ^COMMA   world ^BANG
    

    Đầu ra:

    Hello, world!
    

    Đầu vào:

    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
    

    Đầu ra:

    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
    

    Đầu vào:

    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
    

    Đầu ra:

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

Đây là một mã golf: điểm thấp nhất sẽ thắng. Bạn có thể viết một hàm của một đối số chuỗi hoặc một chương trình đọc từ STDIN và ghi vào STDOUT.


Nếu tôi muốn sử dụng javascript thì sao? Không có đầu vào tiêu chuẩn trong đó. Tôi có thể sử dụng prompt()?
nicael

@nicael OP đề cập đến việc sử dụng một đối số chuỗi, vì vậy, với ví dụ về JS của tôi, tôi chỉ tạo một hàm lấy một đối số và cho rằng đối số đó là chuỗi các từ tương tự như STDIN
Eric Lagergren

1
Tôi tự hỏi nếu có esolang tên là "[ngôn ngữ của bạn ở đây]"
Akangka

Câu trả lời:


4

JavaScript: 653 611 547 514 487 byte

Ôi trời ơi. Brendan Eich tôi rất xin lỗi vì điều này.

PS: Tôi đã thêm khoảng trắng để dễ đọc, nhưng tước tất cả các kết quả khoảng trắng cho phép trong số byte được liệt kê.

Về mặt lý thuyết tôi có thể rút ngắn một số phần như -e-một cái gì đó giống như -ehoặc -e, nhưng điều đó có thể gây ra vấn đề nếu từ trước đó kết thúc hoặc từ sau bắt đầu bằng chữ 'e' (hoặc bất kỳ từ nào tôi quyết định sử dụng). Tôi cho rằng tôi có thể sử dụng một ký tự ASCII. Tôi sẽ xem xét điều đó.

487 FF22 + Chỉ

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 + Chỉ

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 + Chỉ

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+ Chỉ

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 trình duyệt chéo

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

Làm thế nào nó hoạt động:

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

JSFiddle (đối với giải pháp trình duyệt chéo 653 byte)

JSFiddle (đối với 595 FF 22 + chỉ giải pháp)

JSFiddle (đối với 547 FF 22 + chỉ giải pháp)

JSFiddle (đối với 514 FF 22 + chỉ giải pháp)

JSFiddle (đối với 487 FF 22 + chỉ giải pháp)

Đây là lần đầu tiên tôi phải viết JS sử dụng nhiều hơn một regex và thông thường regex của tôi được xác định trước.

Tôi sẽ tiếp tục cạo byte nhiều nhất có thể.


Bạn có thể rút ngắn những thay thế đầu tiên của mình như thế này: c.replace(/\^((COMMA)|(SEMICOLON)|(COLON)|(PERIOD)|(BANG))/g,(m,_,a,b,c,d,e)=>a?',':b?';':c?':':d?'.':'!'))... vân vân. Mũi tên sintax ngắn, nhưng ngay cả 'chức năng' cũng nên lưu cùng một ký tự
edc65

Bạn đúng. Tôi đã thử nghiệm regrec của mình với Chrome và nó không hỗ trợ mũi tên béo. Tôi đang làm việc để làm cho nó thẳng ra với FF ngay bây giờ, nhưng tôi ghét cách regexps không thực sự có toán tử "và" như họ làm "hoặc". @ edc65
Eric Lagergren

@ edc65 vì vậy tôi cho rằng tôi sẽ phải sử dụng hai =>giây để làm cho nó hoạt động, nhưng sử dụng các mũi tên đã tiết kiệm cho tôi 40 byte!
Eric Lagergren

Thay thế thay thế bằng R = 'thay thế' ... [R] ;-)
edc65

Chỉ cần làm điều đó :) Giảm xuống 563 @ edc65
Eric Lagergren

1

PHP, 412 byte

(Ungolfed ở đây cho rõ ràng; xem ideone cho phiên bản golf .)

Hàm preg numplace () của PHP sẽ chấp nhận các đối số mảng, điều này khá hữu ích ở đây. Tôi nghĩ đoạn mã sau thực hiện mọi thứ cần thiết. Nó vượt qua tất cả các trường hợp thử nghiệm ít nhất.

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;
}

Hoạt động hoàn hảo! ideone.com/AYtTiI Mặc dù điều tôi bối rối là chúng ta có nên có dấu phẩy trước khi trích dẫn mở không? Bởi vì, về mặt ngữ pháp, dấu ngoặc kép là nhiều hơn lời nói, nhưng chỉ có lời nói có dấu phẩy trước dấu ngoặc kép. Tôi đã giả sử vì có một ^ COMMA, chúng tôi sẽ cho phép người dùng nhập dấu phẩy
Eric Lagergren
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.