Título Palabras clave en contexto

10

Este desafío se basa en un problema descrito en D. Parnas, sobre los criterios que se utilizarán en los sistemas de descomposición en módulos , y elaborado en J. Morris, Programación real en lenguajes funcionales .

Escriba un programa o función que tome una lista de títulos de libros de stdino como argumento, en un formato razonable y conveniente para su idioma. Por ejemplo,

Green Sleeves
Time Was Lost

o

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

Regrese o imprima en stdoutuna lista alfabética de las palabras clave, mostrando su contexto dentro de los títulos originales encerrando cada palabra clave entre llaves ( <y >). Al igual que con la entrada, la salida puede estar en un formato razonable que sea conveniente para su idioma: líneas separadas por una nueva línea, una lista de cadenas, etc.

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

Los títulos consistirán en una serie de palabras clave separadas por un solo espacio. Las palabras clave contendrán solo caracteres alfabéticos. Las palabras clave deben clasificarse lexicográficamente . Los títulos serán únicos y las palabras clave serán únicas dentro de cada título, pero la misma palabra clave puede existir en varios títulos. Si existe una palabra clave en más de un título, la salida debe enumerar cada aspecto en un orden arbitrario . Por ejemplo, dada esta entrada:

A Dugong
A Proboscis

Una salida válida sería:

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

O:

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

Este es el : el ganador es la solución más corta en bytes. Las lagunas estándar no están permitidas.

JohnE
fuente
¿Qué pasa si la misma palabra clave aparece más de una vez en un título? ¿Deben los hechos estar en orden de aparición, o se permite un orden arbitrario?
Peter Taylor
1
@PeterTaylor: según la especificación, "Los títulos serán únicos y las palabras clave serán únicas dentro de cada título ..."
JohnE

Respuestas:

4

Pyth, 25 24 22 bytes

VSsm,Rdcd\ QAN:HGjG"<>

Pruébalo en línea.

Toma la entrada como una matriz de líneas, como ["Green Sleeves","Time Was Lost"].

Explicación

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
fuente
Parece defectuoso : compruebe el manejo del título Time Was Time.
Peter Taylor
3
Citando @PeterTaylor del Programa Operativo, keywords will be unique within each title.
PurkkaKoodari
2

Japt , 55 bytes

Tal vez esto podría hacerse más corto, pero no estoy seguro de cómo ...

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

Cómo funciona

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
fuente
1

Haskell, 113 bytes

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

Ejemplo de uso: f ["Green Sleeves","Time Was Lost"]-> ["<Green> Sleeves","Time Was <Lost>","Green <Sleeves>","<Time> Was Lost","Time <Was> Lost"].

nimi
fuente