영어 문장 부호 규칙 적용


11

구술 용 앱의 코드를 작성하기 위해 고용되었습니다.이 앱은 음성 소스에서 음성 입력을 받아 단어로 구문 분석 한 후 화면에 작성합니다.

경영진은 불행히도 작업을 수행하는 대신 하루 종일 앉아서 골프 코드를 작성하는 것으로 알려진 프로젝트의 모든 힘을 실제로 신뢰하지는 않습니다. 문장 부호가 적절하게 형식화 된 문장으로 산재 된 문장은 아래에서 '올바른 형식'으로 정의됩니다.

  1. 문장은 입력 문자열입니다. 단어는 공백이 아닌 문자 그룹입니다. 문장 부호는 첫 문자가 인 단어입니다 ^.

  2. 단어의 첫 글자가 소문자가 아닌 경우 단어가 대문자로 표시됩니다 (대문자는 정규식과 일치 /[^a-z].*/).

  3. 문장의 첫 단어는 대문자 여야합니다.

  4. A ^COMMA는 쉼표 문자 ,이며 뒤에 공백은 없습니다. aaa ^COMMA bbb됩니다 aaa, bbb.

  5. A ^COLON는 다음과 같은 쉼표입니다 :.

  6. A ^SEMICOLON는 다음과 같은 쉼표입니다 ;.

  7. A ^PERIOD는 다음과 같은 쉼표입니다 .. 뒤에 나오는 단어 ^PERIOD는 대문자 여야합니다.

  8. A ^BANG는 다음과 같은 기간입니다 !.

  9. A ^DASH는 대시 문자 -이며 앞뒤에 공백이 있습니다.

  10. A ^HYPHEN도 대시 문자 -이지만 뒤에 또는 앞에 공백이 없습니다.

  11. ^EMDASH철자가 하이픈 (안 대시!)입니다 --.

  12. ^OPENQUOTE인용 문자입니다 "공간 이전하지만 다음하지 있습니다. 뒤에 나오는 단어 ^OPENQUOTE는 대문자 여야합니다. ^OPENQUOTE앞에 문장 부호가 아닌 단어가 앞에 있으면 ^COMMA해당 단어와 사이에를 추가 하십시오 ^OPENQUOTE. ^OPENQUOTE다음에 다음 단어를 대문자로 만드는 구두점이 앞에 오는 경우 다음 단어로 건너 뜁니다 ^OPENQUOTE.

  13. A ^CLOSEQUOTE,"뒤에 공백이 있지만 앞에는 없는 공백입니다. A는 경우 ^CLOSEQUOTE앞에는한다 ^COMMA, ^PERIOD또는 ^BANG, 구두점이 사라지고는 것을 ^CLOSEQUOTE철자 ,", ."또는 !"각각. 사라지는 문장 부호가 대문자를 지정한 경우 해당 대문자는 다음 사용 가능한 단어에서 계속 발생해야합니다.

  14. 전체 최종 결과에서 초기 또는 후행 공백을 제거해야하며 행에서 두 개 이상의 공백 문자열을 모두 단일 공백 ​​문자로 축소해야합니다.

  15. 위에서 다루지 않은 모든 사례 (예 : ^COMMA ^COMMA또는 ^SEMICOLON ^CLOSEQUOTE또는 ^UNDEFINEDPUNCTUATION)는 올바른 형식의 입력에서 발생하지 않으므로 정의되지 않은 동작입니다.

개발 팀은 다음을 알려줍니다.

  • 프로젝트가 [귀하의 언어] 언어로 작성되었으며 Android / iPhone 용 앱인 경우 가능한 한 적은 공간을 차지하도록 가능한 한 짧아야합니다. 그것이 앱 개발이 작동하는 방식이 아니라는 말이 아니라고 설명하려고 노력합니다. 그러나 이봐, 우연의 일치! 당신은 [여러 언어] 의 놀라운 골퍼입니다 !

  • 응용 프로그램에는 웹 액세스 권한이 없으며이 형식을 수행하는 라이브러리가 설치되어 있지 않습니다. 당신은 아마 당신이 필요하다고 생각한다면, 팀이 당신의 언어에 대한 정규 라이브러리를 허용하도록 팀을 납득시킬 수 있습니다.

  • 큰 따옴표 나 작은 따옴표를 올바르게 사용하는 중첩 된 따옴표에 대한 지원은 이후 버전의 앱에 대해 계획되어 있지만 현재 작업중인 버전은 아니므로 걱정하지 마십시오.

  • 경영진은 테스트 중심 개발의 열렬한 팬이므로 개발자 팀은 이미 프로그램의 일부에 대한 몇 가지 테스트를 작성하는 불쾌한 키보드 원숭이를 가지고 있습니다.

    입력:

    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 영업 이익은 나의 JS의 예를 들어 그냥 하나 개의 인자를받는 함수를 만들어 그 인수가 STDIN과 비슷한 단어의 문자열이었다 가정, 하나의 문자열 인수를 사용하여 언급
에릭 Lagergren

1
"[여러분의 언어]"라는 이름의
esolang

답변:


4

자바 스크립트 : 653611547514 487 바이트

이런. Brendan Eich 죄송합니다.

추신 : 가독성을 위해 공백을 추가했지만 허용 가능한 모든 공백을 제거하면 나열된 바이트 수가 생성됩니다.

이론적으로 나는 등 일부 지역을 단축 할 수 -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 크로스 브라우저

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를 작성해야하는 것은 이번이 처음이며 일반적으로 정규 표현식이 미리 정의되어 있습니다.

가능한 한 많이 바이트를 계속 줄입니다.


다음과 같이 첫 번째 교체를 단축 할 수 있습니다. c.replace(/\^((COMMA)|(SEMICOLON)|(COLON)|(PERIOD)|(BANG))/g,(m,_,a,b,c,d,e)=>a?',':b?';':c?':':d?'.':'!'))... 등. 화살표 구문은 짧지 만 '기능'조차도 동일한 문자를 저장해야합니다.
edc65

네가 옳아. Chrome으로 정규 표현식을 테스트했지만 지방 화살표를 지원하지 않습니다. 나는 지금 FF로 정리하려고 노력하고 있지만 정규 표현식에 실제로 "또는"처럼 "및"연산자가없는 방법은 싫어. @ edc65
Eric Lagergren

@ edc65 그래서 =>작동 하려면 두 s 를 사용해야 한다고 생각하지만 화살표를 사용하면 40 바이트가 절약되었습니다!
Eric Lagergren

대체를 R = 'replace'로 대체하십시오 ... [R] ;-)
edc65

그냥 한 그 아래로 563 @ edc65에 :)있어 그것을
에릭 Lagergren

1

PHP, 412 바이트

(명확성을 위해 여기에서 ungolfed; 골프 버전에 대한 아이디어 참조 )

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 우리가 쉼표 사용자 입력을시키는 거라고이 때부터 가정
에릭 Lagergren
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.