Mots-clés du titre dans le contexte

10

Ce défi est basé sur un problème décrit dans D. Parnas, Sur les critères à utiliser dans la décomposition des systèmes en modules , et développé dans J. Morris, Real Programming in Functional Languages .

Écrivez un programme ou une fonction qui prend une liste de titres de livres de stdinou comme argument, dans un format raisonnable et pratique pour votre langue. Par exemple,

Green Sleeves
Time Was Lost

ou

("Green Sleeves";"Time Was Lost")

Retournez ou imprimez dans stdoutune liste alphabétique des mots-clés, montrant leur contexte dans les titres originaux en mettant chaque mot-clé entre accolades ( <et >). Comme pour l'entrée, la sortie peut être dans un format raisonnable qui convient à vos lignes séparées par une nouvelle ligne de langue, une liste de chaînes, etc.:

<Green> Sleeves
Time Was <Lost>
Green <Sleeves>
<Time> Was Lost
Time <Was> Lost

Les titres seront constitués d'une série de mots clés séparés par un seul espace. Les mots clés ne contiendront que des caractères alphabétiques. Les mots clés doivent être triés lexicographiquement . Les titres seront uniques et les mots clés seront uniques dans chaque titre, mais le même mot clé peut exister dans plusieurs titres. Si un mot clé existe dans plusieurs titres, la sortie doit répertorier chaque apparence dans un ordre arbitraire . Par exemple, étant donné cette entrée:

A Dugong
A Proboscis

Une sortie valide serait soit:

<A> Proboscis
<A> Dugong
A <Dugong>
A <Proboscis>

Ou:

<A> Dugong
<A> Proboscis
A <Dugong>
A <Proboscis>

C'est le - le gagnant est la solution la plus courte en octets. Les failles standard ne sont pas autorisées.

JohnE
la source
Et si le même mot clé apparaît plus d'une fois dans un titre? Les événements devraient-ils être classés par ordre d'apparition, ou un ordre arbitraire est-il autorisé?
Peter Taylor
1
@PeterTaylor: d'après la spécification, "Les titres seront uniques et les mots-clés seront uniques dans chaque titre…"
JohnE

Réponses:

4

Pyth, 25 24 22 octets

VSsm,Rdcd\ QAN:HGjG"<>

Essayez-le en ligne.

Prend l'entrée comme un tableau de lignes, comme ["Green Sleeves","Time Was Lost"].

Explication

VSsm,Rdcd\ QAN:HGjG"<>   implicit: Q = evaluated input

   m       Q                   map input lines:
       cd\                         split input line to words
    ,Rd                          replace each word by pair [word, entire line]
  s                          concatenate results for all input lines
 S                         sort the array of pairs lexicographically
V                        loop over the array
            AN             assign the word to G and the corresponding line to H
                 jG"<>       put the word between <>
              :HG          replace the word by the above in the line and print
PurkkaKoodari
la source
Looks buggy - vérifiez la gestion du titre Time Was Time.
Peter Taylor
3
@PeterTaylor Je cite l'OP, keywords will be unique within each title.
PurkkaKoodari
2

Japt , 55 octets

Peut-être que cela pourrait être raccourci, mais je ne sais pas comment ...

P+UqR £XqS m_+S+X) q', n £Xs1+XbS)rXs0,XbS),@"<{X}>")qR

Comment ça fonctionne

P+UqR m@XqS m_+S+X) q', n m@Xs1+XbS)rXs0,XbS),@"<{X}>")qR
          // Implicit: U = input string, S = a space, P = empty string
UqR m@    // Split input at newlines, then map each item X to:
XqS m_    //  X split at spaces, with each item Z mapped to:
+S+X)     //   Z + a space + X.
P+   q',  // Parse the result as a string, and split at commas. Due to JS's default
          // array-to-string conversion (joining with commas), this flattens the array.
n         // Sort the result lexicographically.
m@Xs1+XbS // Map each item X to everything after the first space,
rXs0,XbS  // replacing the original keyword with
@"<{X}>"  // "<" + keyword + ">".
qR        // Join the result with newlines.
          // Implicit: output last expression
ETHproductions
la source
1

Haskell, 113 octets

import Data.List
g l=[(m,h++('<':m++['>']):t)|(h,m:t)<-zip(inits l)$tails l]
f=map(unwords.snd).sort.(>>=g.words)

Exemple d'utilisation: f ["Green Sleeves","Time Was Lost"]-> ["<Green> Sleeves","Time Was <Lost>","Green <Sleeves>","<Time> Was Lost","Time <Was> Lost"].

nimi
la source