Traitement de texte n ° 1: césure

14

Contexte

Il s'agit de la première partie d'un parcours de golf à 3 trous sur le traitement de texte. L'idée générale est que si vous prenez un texte d'entrée et le dirigez à travers les solutions aux trois défis (avec une petite quantité de code de colle), il crachera un paragraphe magnifiquement formaté. Dans ce premier défi, votre tâche consiste à césurer un morceau de texte en utilisant des modèles de césure donnés.

Contribution

Votre programme doit prendre deux entrées de chaîne: un morceau de texte et une liste de modèles de césure. La première entrée est simplement une chaîne non vide de caractères et d'espaces ASCII imprimables; il ne contiendra pas de sauts de ligne ou de tildes ~. La deuxième entrée est une liste de mots séparés par des virgules, qui se composent de syllabes délimitées par des tilde de caractères ASCII minuscules. Un exemple est ex~cel~lent,pro~gram~ming,abil~i~ties.

Production

Votre programme doit modifier la première entrée de la manière suivante. Tout mot (sous-chaîne maximale de caractères ASCII alphabétiques) dont la version en minuscule avec trait d'union se trouve dans la deuxième entrée doit être remplacé par cette version avec trait d'union, mais sa casse doit être préservée. Avec l'exemple de liste ci-dessus, si le texte contient le mot Excellent, il doit être remplacé par Ex~cel~lent; cependant, neExcellently doit pas être modifié. Votre sortie doit être cette chaîne modifiée.

Règles détaillées et notation

Vous pouvez supposer ce qui suit sur les entrées:

  • La première entrée ne contient ni tildes, ni espaces de début, de fin ou répétés. Ce n'est pas vide.
  • La deuxième entrée contient au moins un mot et chaque mot contient au moins deux syllabes. Chaque syllabe n'est pas vide.
  • La deuxième entrée ne contient pas de mot apparaissant comme syllabe dans un autre mot.

Vous pouvez modifier l'ordre des deux entrées, si vous le souhaitez, et éventuellement ajouter une nouvelle ligne de fin à la sortie.

Vous pouvez écrire une fonction ou un programme complet. Le nombre d'octets le plus bas gagne et les failles standard sont interdites.

Cas de test

Ceux-ci sont répertoriés dans le format 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

Toute erreur de césure possible dans ce défi est due à cet outil de césure .

Zgarb
la source
Je suppose que l'entrée est ASCII 7 bits standard, et non une version 8 bits étendue?
orlp
Est-il acceptable de supposer que tout caractère non alphanumérique ne comptera pas comme une modification d'un mot (par exemple, une première entrée comme #programming!sera toujours affectée par une deuxième entrée de pro~gram~ming)? Les nombres ne comptent-ils pas non plus (c'est-à-dire que seuls les caractères alphabétiques sont autorisés)?
cole
@orlp Oui, l'entrée se compose de caractères ASCII imprimables standard répertoriés ici .
Zgarb
@Cole Les caractères non alphabétiques ne font pas partie des mots (voir le deuxième cas de test). Les chiffres comptent comme non alphabétiques, je vais ajouter un cas de test à ce sujet.
Zgarb
Puis-je supposer un nombre maximum de syllabes en un mot?
Qwertiy du

Réponses:

5

Pip, 60 54 octets

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

Dépôt GitHub pour Pip

Prend les entrées comme arguments de ligne de commande (ce qui nécessite des guillemets autour de l'entrée 1, en supposant qu'elle contient des espaces). Aucune nouvelle ligne de fin n'est imprimée (ajoutez un xà la fin du programme pour en ajouter un).

Assez peu golfé, avec des commentaires:

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

Exemple d'exécution:

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
la source
8

Rétine , 88 octets

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

À des fins de comptage, chaque ligne va dans un fichier séparé, \nest remplacée par des caractères de nouvelle ligne réels et <empty>est un fichier vide. Pour plus de commodité, vous pouvez exécuter le code ci-dessus à partir d'un seul fichier (où se <empty>trouve une ligne vide) si vous utilisez l' -sindicateur d'interpréteur.

Martin Ender
la source
2

Javascript ES6, 117 141 caractères

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

Tester:

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
la source
Vous pouvez utiliser eval au lieu du constructeur RegExp. Les modèles de chaîne peuvent également économiser quelques octets
Downgoat
1

Javascript (ES6), 173 169

Recherche et remplacement de regex de base

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

Violon

Edit: correction d'un bug pour le cas de test magic magic,ma~gic

DankMemes
la source
Mauvais: f("magic magic", "ma~gic")retours"ma~gic magic"
Qwertiy
@Qwertiy fixe. D'une manière ou d'une autre, le réparer m'a également sauvé 4 octets!
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}

Juste une première tentative, beaucoup de choses peuvent être raccourcies - continueront demain!

Jarmex
la source