Wenden Sie englische Interpunktionsregeln an

11

Sie wurden beauftragt, Code für eine Diktier-App zu schreiben, die Spracheingaben von einer gesprochenen Quelle übernimmt, sie als Wörter analysiert und auf einen Bildschirm schreibt.

Das Management vertraut Ihnen nicht wirklich so viel Kraft im Projekt - Sie sind dafür bekannt, den ganzen Tag herumzusitzen und Golf zu spielen, anstatt Ihre Arbeit zu erledigen -, also geben sie Ihnen nur eine wirklich einfache Aufgabe: Drehen Sie a Satz mit eingestreuter Interpunktion in einen richtig formatierten Satz, in dem unten 'richtig formatiert' definiert ist.

  1. Der Satz ist die Eingabezeichenfolge. Ein Wort ist eine Gruppe von zusammenhängenden Nicht-Leerzeichen. Eine Interpunktion ist ein Wort, dessen erstes Zeichen ist ^.

  2. Ein Wort wird groß geschrieben, wenn der erste Buchstabe des Wortes kein Kleinbuchstabe ist (großgeschriebene Wörter stimmen mit dem regulären Ausdruck überein /[^a-z].*/).

  3. Das erste Wort des Satzes muss groß geschrieben werden.

  4. A ^COMMAist das Kommazeichen ,und hat ein Leerzeichen nach, aber nicht vor. aaa ^COMMA bbbwird aaa, bbb.

  5. A ^COLONist ein Komma, das aussieht :.

  6. A ^SEMICOLONist ein Komma, das aussieht ;.

  7. A ^PERIODist ein Komma, das aussieht .. Das Wort nach a ^PERIODmuss groß geschrieben werden.

  8. A ^BANGist eine Periode, die aussieht wie !.

  9. A ^DASHist das Bindestrichzeichen -und hat ein vorangestelltes und ein nachfolgendes Leerzeichen.

  10. A ^HYPHENist auch das Bindestrichzeichen -, hat jedoch kein Leerzeichen nach oder vor.

  11. An ^EMDASHist ein Bindestrich (kein Bindestrich!), Der geschrieben wird --.

  12. An ^OPENQUOTEist ein Anführungszeichen "mit einem Leerzeichen vor, aber nicht nach. Das Wort nach einem ^OPENQUOTEmuss groß geschrieben werden. Wenn vor einem ^OPENQUOTEein Wort steht, das keine Interpunktion ist, fügen Sie ein ^COMMAzwischen diesem Wort und dem ^OPENQUOTE. Wenn ^OPENQUOTEvor a eine Interpunktion steht, bei der das nächste Wort groß geschrieben wird, wird das nächste Wort übersprungen ^OPENQUOTE.

  13. A ^CLOSEQUOTEist der Digraph ,", dem ein Leerzeichen folgt, aber nicht vorausgeht. Wenn ein ^CLOSEQUOTEdurch ein vorgeschaltet ist ^COMMA, ^PERIODoder ^BANG, dass Interpunktion verschwindet und das ^CLOSEQUOTEgeschrieben ist ,", ."oder !"sind. Wenn die verschwindende Interpunktion eine Großschreibung angibt, muss diese Großschreibung immer noch beim nächsten verfügbaren Wort erfolgen.

  14. Anfängliche oder nachfolgende Leerzeichen im vollständigen Endergebnis müssen entfernt werden, und jede Zeichenfolge aus zwei oder mehr Leerzeichen in einer Zeile muss zu einem einzelnen Leerzeichen zusammengefasst werden.

  15. Jeder Fall, der oben nicht behandelt wurde (z. B. ^COMMA ^COMMAoder ^SEMICOLON ^CLOSEQUOTEoder ^UNDEFINEDPUNCTUATION), tritt bei wohlgeformten Eingaben nicht auf und ist daher ein undefiniertes Verhalten.

Das Entwicklungsteam informiert Sie über Folgendes:

  • Das Projekt wird in der Sprache [Ihrer Sprache hier] geschrieben und sollte so kurz wie möglich sein, damit es als App für Android / iPhone so wenig Platz wie möglich beansprucht. Sie versuchen zu erklären, dass die App-Entwicklung nicht so funktioniert, aber sie hören nicht zu. Aber was für ein Zufall! Du bist ein großartiger Golfer in [deiner Sprache hier] !

  • Die App verfügt über keine Webzugriffsberechtigungen und es sind keine Bibliotheken installiert, die diese Formatierung für Sie durchführen. Sie können den Teamleiter wahrscheinlich davon überzeugen, Ihnen eine Regex-Bibliothek zu ermöglichen, falls eine für Ihre Sprache vorhanden ist, wenn Sie glauben, dass Sie eine benötigen.

  • Die Unterstützung für verschachtelte Anführungszeichen, bei denen doppelte / einfache Anführungszeichen ordnungsgemäß verwendet werden, ist für eine spätere Version der App geplant, jedoch nicht für die Version, an der Sie gerade arbeiten. Machen Sie sich also keine Sorgen.

  • Das Management ist ein großer Fan von testgetriebener Entwicklung, und so hat das Entwicklerteam bereits einige unglückliche Tastaturaffen einige Tests für Ihren Teil des Programms aufschreiben lassen: (Zeilenumbrüche zur besseren Lesbarkeit hinzugefügt, als Leerzeichen behandeln)

    Eingang:

    hello ^COMMA   world ^BANG
    

    Ausgabe:

    Hello, world!
    

    Eingang:

    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
    

    Ausgabe:

    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
    

    Eingang:

    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
    

    Ausgabe:

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

Dies ist ein Code-Golf: Die niedrigste Punktzahl gewinnt. Sie können eine Funktion eines String-Arguments oder ein Programm schreiben, das aus STDIN liest und in STDOUT schreibt.

Algorithmushai
quelle
Was ist, wenn ich Javascript verwenden möchte? Es gibt keine Standardeingabe. Kann ich verwenden prompt()?
Nicael
@nicael OP erwähnt die Verwendung eines String-Arguments, daher habe ich für mein JS-Beispiel nur eine Funktion erstellt, die ein Argument verwendet, und angenommen, dass das Argument die Wortfolge ist, die STDIN
Eric Lagergren am
1
Ich frage mich, ob es Esolang mit dem Namen "[deine Sprache hier]" gibt
Akangka

Antworten:

4

JavaScript: 653 611 547 514 487 Bytes

Oh mein Gott. Brendan Eich Das tut mir so leid.

PS: Ich habe aus Gründen der Lesbarkeit Leerzeichen hinzugefügt, aber das Entfernen aller zulässigen Leerzeichen führt zu der aufgelisteten Byteanzahl.

Theoretisch könnte ich einige Teile wie das -e-zu etwas wie -eoder kürzen -e, aber das könnte ein Problem verursachen, wenn das vorherige Wort mit endet oder das folgende Wort mit dem Buchstaben 'e' beginnt (oder mit welchem ​​Wort ich mich auch immer entscheide). Ich könnte wohl ein ASCII-Zeichen verwenden. Ich werde das untersuchen.

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

Nur 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 + Nur

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

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

Wie es funktioniert:

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

JSFiddle (für die browserübergreifende 653-Byte-Lösung)

JSFiddle (für die 595 FF 22+ nur Lösung)

JSFiddle (für die 547 FF 22+ nur Lösung)

JSFiddle (für die 514 FF 22+ nur Lösung)

JSFiddle (für die 487 FF 22+ nur Lösung)

Dies ist das erste Mal, dass ich JS schreiben musste, das mehr als einen regulären Ausdruck verwendet, und normalerweise ist mein regulärer Ausdruck vordefiniert.

Ich werde weiterhin so viel Bytes wie möglich rasieren.

Eric Lagergren
quelle
Sie können Ihre ersten Ersetzungen wie folgt verkürzen: c.replace(/\^((COMMA)|(SEMICOLON)|(COLON)|(PERIOD)|(BANG))/g,(m,_,a,b,c,d,e)=>a?',':b?';':c?':':d?'.':'!'))... und so weiter. Arrow Sintax ist kurz, aber selbst 'Funktion' sollte die gleichen Zeichen speichern
edc65
Du hast recht. Ich habe meinen regulären Ausdruck mit Chrome getestet und er unterstützt keine fetten Pfeile. Ich arbeite gerade daran, es mit FF zu verbessern, aber ich hasse es, dass reguläre Ausdrücke nicht wirklich ein "und" Operator haben, wie sie ein "oder" tun. @ edc65
Eric Lagergren
@ edc65 Ich denke, ich muss zwei =>s verwenden, um es zum Laufen zu bringen, aber mit den Pfeilen habe ich 40 Bytes gespart!
Eric Lagergren
Ersetzen Ersetzen durch R = 'Ersetzen' ... [R] ;-)
edc65
Hab das gerade gemacht :) Habe es auf 563 @ edc65 gebracht
Eric Lagergren
1

PHP, 412 Bytes

(Zur Verdeutlichung hier ungolfed; siehe ideone für die Golfversion .)

Die Funktion preg_replace () von PHP akzeptiert Array-Argumente, was hier sehr nützlich ist. Ich denke, der folgende Code macht alles, was benötigt wird. Es besteht mindestens alle Testfälle.

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;
}
r3mainer
quelle
Funktioniert perfekt! ideone.com/AYtTiI Obwohl ich verwirrt bin, sollen wir vor offenen Anführungszeichen Kommas haben? Weil Anführungszeichen grammatikalisch gesehen mehr als nur Sprache sind, aber nur Sprache das Komma vor den Anführungszeichen hat. Ich nahm an, da es ein ^ COMMA gab, ließen wir den Benutzer das Komma eingeben
Eric Lagergren