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.
Der Satz ist die Eingabezeichenfolge. Ein Wort ist eine Gruppe von zusammenhängenden Nicht-Leerzeichen. Eine Interpunktion ist ein Wort, dessen erstes Zeichen ist
^
.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].*/
).Das erste Wort des Satzes muss groß geschrieben werden.
A
^COMMA
ist das Kommazeichen,
und hat ein Leerzeichen nach, aber nicht vor.aaa ^COMMA bbb
wirdaaa, bbb
.A
^COLON
ist ein Komma, das aussieht:
.A
^SEMICOLON
ist ein Komma, das aussieht;
.A
^PERIOD
ist ein Komma, das aussieht.
. Das Wort nach a^PERIOD
muss groß geschrieben werden.A
^BANG
ist eine Periode, die aussieht wie!
.A
^DASH
ist das Bindestrichzeichen-
und hat ein vorangestelltes und ein nachfolgendes Leerzeichen.A
^HYPHEN
ist auch das Bindestrichzeichen-
, hat jedoch kein Leerzeichen nach oder vor.An
^EMDASH
ist ein Bindestrich (kein Bindestrich!), Der geschrieben wird--
.An
^OPENQUOTE
ist ein Anführungszeichen"
mit einem Leerzeichen vor, aber nicht nach. Das Wort nach einem^OPENQUOTE
muss groß geschrieben werden. Wenn vor einem^OPENQUOTE
ein Wort steht, das keine Interpunktion ist, fügen Sie ein^COMMA
zwischen diesem Wort und dem^OPENQUOTE
. Wenn^OPENQUOTE
vor a eine Interpunktion steht, bei der das nächste Wort groß geschrieben wird, wird das nächste Wort übersprungen^OPENQUOTE
.A
^CLOSEQUOTE
ist der Digraph,"
, dem ein Leerzeichen folgt, aber nicht vorausgeht. Wenn ein^CLOSEQUOTE
durch ein vorgeschaltet ist^COMMA
,^PERIOD
oder^BANG
, dass Interpunktion verschwindet und das^CLOSEQUOTE
geschrieben ist,"
,."
oder!"
sind. Wenn die verschwindende Interpunktion eine Großschreibung angibt, muss diese Großschreibung immer noch beim nächsten verfügbaren Wort erfolgen.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.
Jeder Fall, der oben nicht behandelt wurde (z. B.
^COMMA ^COMMA
oder^SEMICOLON ^CLOSEQUOTE
oder^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.
quelle
prompt()
?Antworten:
JavaScript:
653 611 547 514487 BytesOh 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-e
oder 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 +
Nur 514 FF22 +
547 FF22 + Nur
Nur 611 FF 22+
653 Cross-Browser
Wie es funktioniert:
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.
quelle
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=>
s verwenden, um es zum Laufen zu bringen, aber mit den Pfeilen habe ich 40 Bytes gespart!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.
quelle