10
votes

Code golf: "couleur de la couleur" du texte répété

(Merci à Greg0ire ci-dessous pour aider avec les concepts clés)

Le défi: Construire un programme qui trouve toutes les substrings et les "balises" avec des attributs de couleur (en les surlignant efficacement dans XML). p>

Les règles: p>

  1. Cela ne devrait être fait que pour les sous-chaînes de longueur 2 ou plus. li> Les substrings
  2. ne sont que des chaînes de caractères consécutifs, qui peuvent inclure des caractères non alphabétiques. Notez que les espaces et autres ponctutures ne délimitent pas de sous-chaînes. LI>
  3. Le boîtier de caractère ne peut pas être ignoré. LI>
  4. Le "surbrillance" doit être fait en marquant la sous-chaîne de XML. Votre marquage doit être de la forme thesubstring tag #> code> où # code> est un nombre positif unique à cette sous-chaîne et de substrings identiques. LI>
  5. La priorité de l'algorithme est de trouver la plus longue sous-chaîne, pas combien de fois il correspond dans le texte. Li> ol>

    Remarque: l'ordre du marquage indiqué dans l'exemple ci-dessous n'est pas important. Sa juste utilisée par l'OP pour la clarté. P>


    Un exemple d'entrée: p> xxx pré>


    une sortie partiellement correcte (OP peut ne pas avoir Complètement remplacé parfaitement dans cet exemple) P>

    <TAG1>hello</TAG1>!<TAG2>TAG</TAG2>!<TAG3></</TAG3><TAG1>hello</TAG1>.<TAG2>TAG</TAG2>.<TAG3></</TAG3>
    


4 commentaires

+1 question très intéressante. Allez-vous chercher les plus grandes pièces de texte répétées ou pour les morceaux de texte les plus répétés? Comment allez-vous nommer un "morceau de texte" (pour moi, c'est un groupe de mots consécutifs)? Une expression"?


Bonjour Greg - merci de demander ... J'en ai en fait besoin pour toute chaîne d'octets en fait et la "plus grande" chaîne ... :)


Salut rubicon10. Si vous acceptez des réponses dans toutes les langues, vous voudrez peut-être ajouter les balises langue-agnostic et Rosetta-pierre. Aussi: la solution la plus élégante n'est pas vraiment du code de golf dans ma définition ;-) -


Les tests d'éloquence sont 1. pas [Code-golf] 2. Très subjectif et 3. Non couvert par le Remise spéciale qui a été faite pour Code-Golf . En général, et malgré l'exception pour [Code-Golf], le débordement de la pile n'est pas un lieu de concours.


7 Réponses :


0
votes

Je pense que vous pouvez utiliser Retour Références Pour faire cela. Voir ce message: Expression régulière pour détecter la répétition dans une chaîne J'ai fait de nombreuses tentatives et pour le moment où j'ai cette expression: # (a-za-z] +). * \ 1 #, mais je pense qu'il trouve la première chaîne répétée, pas la plus grande ... C'était avant que je sache que vous vous souciez de mots ... Ce que vous devriez faire est:


3 commentaires

Pensez-vous que c'est de la peine de poster cela comme un défi de golf de code ??


Tomit avait posté une réponse intervérante concernant la recherche et remplacer la fonction pour coloriser la chaîne, mais semble-t-elle l'avoir retirée, probablement parce qu'il pensait que c'était hors-pied. Peu importe, ce n'est pas très difficile à faire avec Str_replace. Pour le golf du code, vous pourriez essayer ou vous pouvez même offrir une prime pour cette question ...


^ Str_replace donne une sortie incorrecte pour certaines entrées (au moins si elle est faite naïvement).



4
votes

Perl 206 , 189 , 188 , 199 , 157 caractères < P> En excluant la chaîne d'origine et la dernière impression. xxx


2 commentaires

Cela ne couvre pas les cordes de longueur 2, seulement 3 et plus


Tagged "OK" au lieu de "Ook" à Loremipsum (voir le dernier mot)



1
votes

HASKELLL: 343/344 403 420 445 485 Les caractères

Le nombre de caractères est 343 en utilisant Un algorithme exponentiel, alors qu'il est 344 lors de l'utilisation d'un algorithme quadratique.

Le code posté est le quadratique. Pour l'algorithme exponentiel, changez l'occurrence de init = << queues à des sous-séquences dans le code. xxx

Entrée 1: xxx

sortie 1: xxx

entrée 2: xxx

sortie 2: xxx


2 commentaires

Vous devriez être capable de resserrer votre algorithme de manière à ce qu'il puisse courir contre l'exemple de problème à un délai raisonnable - voir qu'il y a au moins une autre solution qui ne s'appuie pas sur Regex Magic


Venez penser à cela, en utilisant inits = << queues x est un seul caractère de plus que des sous-séquences x , encore une fois de temps polynomial. La peine ou pas? (Think Code-Golf!)



2
votes

Python, 236 206 caractères xxx

et le résultat de l'exécution de celui-ci sur l'exemple d'entrée, il choisit les mots suivants ('loremipsum', "Dummytext", "industrie", "print", "types", "oft", "ing", "et", ",", "Ook '," SS "," IM "," ',' fr ',' er ',' le ',' pe ') et le résultat est: xxx

qui est plus lisible sur ce wiki en surbrillance Comme ceci:

loremipsum i ss im pli mannequin OFT il impression ing et types e tt ing industrie . loremipsum hasibe fr industrie ' ss t et ard mannequintext ev er depuis le 1500S, w < KBD> HE Nanunknown Imprimer ER T OOK Agal LE Y OFT Y pe et scrabam le di tt omakea types pe < / KBD> C IM EN B OO k .

ps. Quelqu'un s'est plaint, alors j'ai ajouté des déclarations d'entrée et de sortie. À la confusion, je m'excuse - cela me semblait évident. Apparemment pas, j'ai ajouté des instructions de préfixes / remorques, qui ne sont pas requises par la spécification de problème et ne doivent pas être comptées sur la longueur du code.


7 commentaires

Que signifie la gamme (32) ici? Cela signifie-t-il que cela ne peut gérer que jusqu'à une longueur de 32 caractères (désolé ne peut pas lire Python ... encore!)


-1: Ne suit pas les spécifications, s est indéfini et aucune sortie, même si S est défini.


@Trinithis: La spécification ne demande pas d'E / S d'être effectuée, d'où mon code prend une chaîne s comme entrée et la sortie est renvoyée dans s . Vous pouvez appeler ces coins coupants si vous le souhaitez, mais vous ne pouvez pas dire que cela ne suit pas les spécifications! Voir la solution Perl, il ne compte pas non plus l'entrée / la sortie.


Ce que je voulais dire sur des spécifications est que vous utilisez sur


@TRINITHIS: J'ai compris que "le marquage doit être de la forme " Pour dire que cela devrait être "quelque chose du genre", "A-la" - et j'ai choisi des étiquettes plus courtes. Quoi qu'il en soit, changa les tags maintenant pour vous apaiser.


Vous n'avez pas ta tagué "im" dans simplement et spécimen


@ M42: Vous aviez raison, merci d'avoir souligné - il y avait un bug. Je l'ai réparé, ainsi que les résultats.



0
votes

Python, 236 del> 281 caractères em>, pas de regex :)

fait un ensemble M code> de toutes les 2 chaînes de caractères est alors itérate à travers leur de les assigner dans l'ordre gourmand de longueur p> xxx pré>

sorties, comme prévu: p>

<TAG1>LoremIpsum</TAG1>i<TAG11>ss</TAG11><TAG15>im</TAG15>ply<TAG2>dummytext</TAG2><TAG13>of</TAG13><TAG6>the</TAG6><TAG5>print</TAG5><TAG8>ing</TAG8><TAG9>and</TAG9><TAG4>types</TAG4>e<TAG10>tt</TAG10><TAG8>ing</TAG8><TAG3>industry</TAG3>.<TAG1>LoremIpsum</TAG1>hasbe<TAG17>en</TAG17><TAG6>the</TAG6><TAG3>industry</TAG3>'<TAG11>ss</TAG11>t<TAG9>and</TAG9>ard<TAG2>dummytext</TAG2>ev<TAG16>er</TAG16>since<TAG6>the</TAG6>1500s,wh<TAG17>en</TAG17>anunknown<TAG5>print</TAG5><TAG16>er</TAG16>t<TAG7>ook</TAG7>agal<TAG14>le</TAG14>y<TAG13>of</TAG13>ty<TAG12>pe</TAG12><TAG9>and</TAG9>scramb<TAG14>le</TAG14>di<TAG10>tt</TAG10>omakea<TAG4>types</TAG4><TAG12>pe</TAG12>c<TAG15>im</TAG15><TAG17>en</TAG17>b<TAG7>ook</TAG7>.


2 commentaires

Code pause avec abcd1tagabcd2tag


ERRR, problème: voir comment dans TY PE S Tags chevauchent?



0
votes

Mathematica - 262 caractères

Pas pur fonctionnel / pas court / pas beau / beaucoup d'effets secondaires / xxx


0 commentaires

0
votes

Merci beaucoup à Dennis Williamson qui m'a aidé à arriver à cette approche en répondant à quelques questions connexes que j'avais sur Script de shell - ici et ici .

problèmes connus avec ci-dessous: p>

  1. Cela ne fonctionne que pour les fichiers ASCII et non binaires li>
  2. Cela ne fonctionne que s'il n'y a pas de nouvelles lignes dans le fichier li>
  3. Il faut exponentiellement plus longtemps que le fichier devient plus long li>
  4. Il se casse facilement sur des fichiers plus de quelques ko long (fonctionne de l'espace disque TMP) LI> ol>

    Comme vous pouvez le constater, c'est une énorme méthode de force brute - pas un algorithme intelligent du tout. J'ai enregistré le temps pris pour quelques exemples de fichiers. P>

    sh tagwords4 sample2.txt
    


0 commentaires