Textverarbeitung 1: Silbentrennung

14

Hintergrund

Dies ist der erste Teil eines 3-Loch-Golfplatzes zur Textverarbeitung. Die übergreifende Idee ist, dass, wenn Sie einen Eingabetext nehmen und ihn durch die Lösungen für alle drei Herausforderungen leiten (mit einer kleinen Menge Klebercode), ein schön formatierter Absatz ausgegeben wird. In dieser ersten Herausforderung besteht Ihre Aufgabe darin, einen Textabschnitt unter Verwendung vorgegebener Trennmuster zu trennen.

Eingang

Ihr Programm muss zwei Zeichenfolgen-Eingaben annehmen: eine Textzeile und eine Liste der Silbentrennungsmuster. Die erste Eingabe ist einfach eine nicht leere Zeichenfolge aus druckbaren ASCII-Zeichen und Leerzeichen. Es enthält keine Zeilenumbrüche oder Tildes ~. Die zweite Eingabe ist eine durch Kommas getrennte Liste von Wörtern, die aus durch Tilden getrennten Silben von ASCII-Kleinbuchstaben bestehen. Ein Beispiel ist ex~cel~lent,pro~gram~ming,abil~i~ties.

Ausgabe

Ihr Programm ändert die erste Eingabe folgendermaßen. Jedes Wort (maximaler Teilstring aus alphabetischen ASCII-Zeichen), dessen mit Bindestrich versehene Kleinbuchstaben in der zweiten Eingabe enthalten sind, ist durch diese mit Bindestrich versehene Version zu ersetzen, wobei die Groß- und Kleinschreibung beizubehalten ist. Mit der obigen Beispielliste, wenn der Text das Wort enthält Excellent, wird es ersetzt durch Ex~cel~lent; jedoch Excellentlysoll nicht verändert werden. Ihre Ausgabe soll diese modifizierte Zeichenfolge sein.

Detaillierte Regeln und Wertung

Zu den Eingaben können Sie folgendes annehmen:

  • Die erste Eingabe enthält keine Tilden und keine führenden, nachfolgenden oder wiederholten Leerzeichen. Es ist nicht leer.
  • Die zweite Eingabe enthält mindestens ein Wort und jedes Wort darin enthält mindestens zwei Silben. Jede Silbe ist nicht leer.
  • Die zweite Eingabe enthält kein Wort, das als Silbe in einem anderen Wort vorkommt.

Bei Bedarf können Sie die Reihenfolge der beiden Eingaben ändern und der Ausgabe optional eine abschließende Newline hinzufügen.

Sie können eine Funktion oder ein vollständiges Programm schreiben. Die niedrigste Byteanzahl gewinnt, und Standardlücken sind nicht zulässig.

Testfälle

Diese sind im Format aufgelistet 1st input [newline] 2nd input [newline] output.

Excellent programming abilities, you work excellently!
ex~cel~lent,pro~gram~ming,abil~i~ties
Ex~cel~lent pro~gram~ming abil~i~ties, you work excellently!

Superman (sometimes incorrectly spelled "Super-man") is super #&%@ing strong.
su~per,some~times,in~cor~rectly,spell~ing
Superman (some~times in~cor~rectly spelled "Su~per-man") is su~per #&%@ing strong.

IncONsISTent caPItalizATIon!
in~con~sis~tent,cap~i~tal~iza~tion
In~cON~sIS~Tent caP~I~tal~izA~TIon!

Such short words.
awk~ward
Such short words.

Digits123 are456cool789.
dig~its,dig~i~tal,are~cool
Dig~its123 are456cool789.

magic magic
ma~gic
ma~gic ma~gic

Jeder mögliche Silbentrennungsfehler bei dieser Abfrage ist auf dieses Silbentrennungswerkzeug zurückzuführen .

Zgarb
quelle
Ich nehme an, die Eingabe ist Standard-7-Bit-ASCII und keine erweiterte 8-Bit-Version.
Orlp
Ist es in Ordnung anzunehmen, dass nicht-alphanumerische Zeichen nicht als Änderung eines Wortes gelten (z. B. wird eine erste Eingabe wie #programming!noch von einer zweiten Eingabe von beeinflusst pro~gram~ming)? Zählen auch Zahlen nicht (dh sind nur alphabetische Zeichen erlaubt)?
Cole
@orlp Ja, die Eingabe besteht aus den hier aufgeführten druckbaren Standard-ASCII-Zeichen .
Zgarb,
@Cole Nicht-alphabetische Zeichen sind kein Teil von Wörtern (siehe den zweiten Testfall). Ziffern gelten als nicht alphabetisch, ich werde einen Testfall hinzufügen.
Zgarb
Kann ich eine maximale Anzahl von Silben in einem Wort annehmen?
Qwertiy

Antworten:

5

Pip, 60 54 Bytes

Fwa^`([A-Za-z]+)`O{aQ'~?'~w@++y}M(LCwQ_RM'~FIb^',Yv)|w

GitHub-Repository für Pip

Übernimmt Eingaben als Befehlszeilenargumente (was Anführungszeichen um Eingabe 1 erfordert, vorausgesetzt, sie enthalten Leerzeichen). Es wird kein abschließender Zeilenumbruch gedruckt (fügen Sie xam Ende des Programms einen hinzu, um einen hinzuzufügen).

Etwas ungolfed, mit Kommentaren:

 ; Split 1st input on runs of letters, including the separators in the results
a^:`([A-Za-z]+)`
 ; Split 2nd input on commas
b^:',
 ; Iterate over the words w in that list
Fwa {
  ; Filter b for entries that match the current word (lowercase, with tildes removed)
 m:(LCw EQ _RM'~)FIb
  ; We expect this to be a list of 0 or 1 elements
  ; If it has one, m gets that element (the hyphenation pattern); if it's empty, m gets nil
 i:-1
 m:m@i
  ; Map this function to each character of pattern m: if it's tilde, return tilde;
  ; otherwise, return corresponding character of w
 m:{aEQ'~ ? '~ w@++i}Mm
  ; Output the result, unless it was nil (falsey), in which case output the original word
 Om|w
}

Probelauf:

C:\Users\dlosc> pip.py hyphens.pip "IncONsISTent caPItalizATIon!" in~con~sis~tent,cap~i~tal~iza~tion
In~cON~sIS~Tent caP~I~tal~izA~TIon!
DLosc
quelle
8

Netzhaut , 88 Bytes

+is`(?<![a-z~])([a-z~]+)(?=([a-z]+)+[^a-z~].*(?<=[\n,]\1(?(2)!)(?<-2>~\2)+[\n,]))
$1~
\n.*
<empty>

Zu \nZählzwecken wird jede Zeile in eine separate Datei verschoben , durch aktuelle Zeilenumbrüche ersetzt und <empty>ist eine leere Datei. Der Einfachheit halber können Sie den obigen Code aus einer einzelnen Datei (wobei <empty>es sich um eine leere Zeile handelt) ausführen, wenn Sie das -sInterpreter-Flag verwenden.

Martin Ender
quelle
2

Javascript ES6, 117 141 Zeichen

f=(t,p)=>p.split`,`.map(p=>t=t.replace(RegExp("((?:^|[^a-z])"+p.replace(/~/g,")(")+")(?=$|[^a-z])","ig"),(...x)=>x.slice(1,-2).join("~")))&&t

Prüfung:

document.querySelector(".question pre").textContent.split("\n\n").map(t=>(t=t.split("\n"))&&f(t[0],t[1])==t[2])
// Array [ true, true, true, true, true ]
Qwertiy
quelle
Sie können eval anstelle des RegExp-Konstruktors verwenden. String-Vorlagen können auch ein paar Bytes sparen
Downgoat
1

Javascript (ES6), 173 169

Grundlegende reguläre Ausdrücke suchen und ersetzen

(a,b)=>(b.split`,`.map(s=>a=a.replace(eval(`/(^|[^a-z])(${s.replace(/~/g,"")})(?=[^a-z]|$)/gi`),(_,n,o)=>(x=0,n+s.split``.map((q,i)=>(q=='~'&&++x?q:o[i-x])).join``))),a)

Geige

Bearbeiten: Fehler für Testfall behoben magic magic,ma~gic

DankMemes
quelle
Falsch: f("magic magic", "ma~gic")kehrt zurück"ma~gic magic"
Qwertiy
@Qwertiy behoben. Irgendwie hat es mir 4 Bytes gespart!
DankMemes
0

Perl, 146

$a=<>;$d=$_=~s/~//rg,$a=~s/(?<!\pL)$d(?!\pL)/h($&,$_)/gie for(split/,|\n/,<>);
print$a;
sub h{($g,$h)=@_;while($h=~/~/g){substr($g,"@-",0)='~'}$g}

Schon beim ersten Versuch lässt sich vieles verkürzen - geht morgen weiter!

Jarmex
quelle