İngilizce noktalama kurallarını uygulama


11

Sözlü bir kaynaktan ses girdisini alan, sözcük olarak ayrıştıran ve bir ekrana yazan bir dikte alma uygulaması için bir kod yazmanız için işe alındınız.

Yönetim, projeye bu kadar güç kattığında size gerçekten güvenmiyor - maalesef, işinizi yapmak yerine bütün gün oturup golf kodunu biliyorsunuz - bu yüzden size gerçekleştirmeniz için gerçekten basit bir görev veriyorlar: Noktalanmış noktalama işareti, 'uygun şekilde biçimlendirilmiş' aşağıda tanımlandığı şekilde düzgün biçimlendirilmiş bir cümle ile cümle.

  1. Cümle girdi dizesidir. Bir Word, koşulsuz boşluklu karakterler grubudur. Noktalama işaretleri, ilk karakteri olan bir Word'dür ^.

  2. Sözcüğün ilk harfi küçük harf değilse (büyük harfle yazılmış kelimeler normal ifadeyle eşleşirse /[^a-z].*/) büyük harf kullanılır .

  3. Cümlenin ilk Sözü büyük yazılmalıdır.

  4. A ^COMMAvirgül karakteridir ,ve arkasından gelen ancak önünde olmayan bir boşluğa sahiptir. aaa ^COMMA bbbolur aaa, bbb.

  5. A ^COLON, virgül gibi görünüyor :.

  6. A ^SEMICOLON, virgül gibi görünüyor ;.

  7. A ^PERIOD, virgül gibi görünüyor .. A kelimesinin ^PERIODbaş harfleri büyük olmalıdır.

  8. A ^BANG, benzeyen bir dönemdir !.

  9. A ^DASH, çizgi karakteridir -ve hem önceki hem de sonraki bir boşluğa sahiptir.

  10. A ^HYPHENaynı zamanda çizgi karakteridir, -ancak takip eden veya öncesinde boşluk yoktur.

  11. bir ^EMDASH , hecelenmiş bir kısa çizgi (tire değil!) --.

  12. Bir ^OPENQUOTE, "önünde boşluk bulunan ancak takip etmeyen bir tırnak karakteri . A kelimesini ^OPENQUOTEbüyük harfle yazmanız gerekir. ^OPENQUOTEA'nın başına Noktalama işareti olmayan bir Word gelirse , ^COMMAbu kelime ile ^OPENQUOTE. Eğer bir^OPENQUOTE harfle sonraki kelimeyi, üzerinden bu atlama yapan bir Noktalamasız öncesinde ^OPENQUOTEsonraki kelimeye.

  13. A ^CLOSEQUOTE, ,"takip eden bir boşluk olan ancak daha önce olmayan bir digrafidir. Bir Eğer ^CLOSEQUOTEbir öncesinde ^COMMA, ^PERIODya da ^BANG, Noktalama kaybolur ve o ^CLOSEQUOTEyazıldığından ,",." ya !"sırasıyla. Kaybolan Noktalama İşaretleri büyük / küçük harf belirttiyse, bu büyük / küçük harf halen kullanılabilir olan bir sonraki kelime üzerinde gerçekleşmelidir.

  14. Tam nihai sonuçtaki ilk veya sondaki boşluklar kaldırılmalı ve bir satırdaki iki veya daha fazla boşluktan oluşan dizelerin tümü tek bir boşluk karakterine daraltılmalıdır.

  15. Yukarıda ele alınmayan herhangi bir dava (ör. ^COMMA ^COMMAVeya ^SEMICOLON ^CLOSEQUOTEveya^UNDEFINEDPUNCTUATION ) iyi biçimlendirilmiş girdilerde meydana gelmeyecektir ve bu nedenle tanımlanmamış bir davranıştır.

Geliştirme ekibi sizi aşağıdakiler hakkında bilgilendirir:

  • Proje [burada diliniz] dilinde yazılmaktadır ve Android / iPhone için bir uygulama olduğunda mümkün olduğunca az yer kaplaması için mümkün olduğunca kısa olmalıdır. Uygulama geliştirmenin böyle çalışmadığını açıklamaya çalışıyorsunuz ama dinlemiyorlar. Ama hey, ne tesadüf! [Burada kendi dilinizde] inanılmaz bir golfçüsünüz !

  • Uygulamanın herhangi bir web erişim izni olmayacak ve sizin için bu biçimlendirmeyi yapan herhangi bir kitaplık yüklenmeyecek. Ekibinizi, diliniz için varsa regex kütüphanesine izin vermeye ikna edebilirsiniz, ancak buna ihtiyacınız olduğunu düşünüyorsanız.

  • Çift / tek tırnak kullanan düzgün iç içe alıntılar için destek, uygulamanın sonraki bir sürümü için planlanmıştır, ancak şu anda üzerinde çalıştığınız sürüm için planlanmadığından endişelenmeyin.

  • Yönetim, test odaklı geliştirmenin büyük bir hayranıdır ve bu nedenle geliştirici ekibinin, programınızın bir kısmı için bazı testler yazmak için zaten şanssız bir klavye maymunu vardı: (okunabilirlik için eklenen yeni satırlar, boşluk olarak davranın)

    Giriş:

    hello ^COMMA   world ^BANG
    

    Çıktı:

    Hello, world!
    

    Giriş:

    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
    

    Çıktı:

    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
    

    Giriş:

    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
    

    Çıktı:

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

Bu bir kod golf: en düşük puan kazanır. Bir dize bağımsız değişkeninin bir işlevini veya STDIN'den okuyarak STDOUT'a yazarak bir program yazabilirsiniz.


Javascript kullanmak istersem ne olur? İçinde standart girdi yok. Kullanabilir miyim prompt()?
nicael

@nicael OP bir dize argümanı kullanarak bahsediyor, bu yüzden JS örneğim için sadece bir argüman alan bir fonksiyon yaptım ve argümanın STDIN'e benzer kelimeler dizisi olduğunu varsaydım
Eric Lagergren

1
Acaba "[burada diliniz]" adlı esolang var mı
Akangka

Yanıtlar:


4

JavaScript: 653 611547 514 bayt

Aman Tanrım. Brendan Eich Bunun için çok üzgünüm.

Not: Okunabilirlik için beyaz alan ekledim, ancak izin verilen tüm beyaz alanların çıkarılması listelenen bayt sayısıyla sonuçlanıyor.

Teorik olarak ben gibi bazı kısımlarını kısaltabilir -e-gibi bir şey -eya-e , ancak önceki kelime uçları veya aşağıdaki sözcük harfi 'e' (veya hangisi kelime ben kullanımına karar) ile başlıyorsa bu sorunu neden olabilir. Sanırım bir ASCII karakteri kullanabilirim. Buna bakacağım.

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

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

Yalnızca 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))

Sadece 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 çapraz tarayıcı

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

Nasıl çalışır:

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

JSFiddle (653 bayt çapraz tarayıcı çözümü için)

JSFiddle ( yalnızca 595 FF 22+ için çözümü için)

JSFiddle ( yalnızca 547 FF 22+ çözümü için)

JSFiddle ( sadece 514 FF 22+ çözümü için)

JSFiddle ( yalnızca 487 FF 22+ çözümü için)

Bu ilk defa birden fazla normal ifade kullanan JS yazmak zorunda kaldım ve genellikle normal ifadem önceden tanımlandı.

Baytları elimden geldiğince tıraş etmeye devam edeceğim.


İlk yer değiştirmelerinizi şu şekilde kısaltabilirsiniz: c.replace(/\^((COMMA)|(SEMICOLON)|(COLON)|(PERIOD)|(BANG))/g,(m,_,a,b,c,d,e)=>a?',':b?';':c?':':d?'.':'!'))... vb. Ok sintaks kısa, ama 'işlev' bile aynı karakterleri kaydetmeli
edc65

Haklısın. Normal ifademi Chrome ile test ettim ve şişman okları desteklemiyor. Şu anda FF ile düzeltmek için çalışıyorum, ama normal ifadelerin gerçekten bir "ve" yaptıkları gibi "veya" gibi bir operatöre sahip olmamasından nefret ediyorum. @ edc65
Eric Lagergren

@ edc65 bu yüzden =>işe almak için iki s kullanmak zorunda kalacağım , ama okları kullanarak bana 40 bayt kurtardı!
Eric Lagergren


Just did that :) Anladı bunu 563 @ edc65
Eric Lagergren

1

PHP, 412 bayt

(Açıklık için burada golf oynadı; golf edilmiş versiyon için ideone'ye bakın .)

PHP'nin preg_replace () işlevi, burada oldukça yararlı olan dizi bağımsız değişkenlerini kabul eder. Ben düşünüyorum Aşağıdaki kodu gereklidir herşeyi yapar. En azından tüm test senaryolarını geçer.

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

Mükemmel çalışıyor! ideone.com/AYtTiI Şaşkınlığım olmasına rağmen, açık tekliflerden önce virgül bulundurmamız mı gerekiyor? Çünkü, dilbilgisel olarak konuşursak, tırnak işaretleri konuşmadan daha fazlası içindir, ancak tırnaklardan önce yalnızca konuşma virgül içerir. Bir ^ COMMA olduğu için kullanıcının virgül girmesine izin vereceğimi varsaydım
Eric Lagergren
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.