Palavras-chave do título no contexto

10

Esse desafio é baseado em um problema descrito em D. Parnas, Sobre os critérios a serem usados ​​na decomposição de sistemas em módulos e elaborado em J. Morris, Programação Real em Linguagens Funcionais .

Escreva um programa ou função que tenha uma lista de títulos de livros stdinou como argumento, em um formato razoável e conveniente para o seu idioma. Por exemplo,

Green Sleeves
Time Was Lost

ou

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

Retorne ou imprima para stdoutuma lista alfabética das palavras-chave, mostrando seu contexto nos títulos originais, colocando cada palavra-chave entre colchetes ( <e >). Como na entrada, a saída pode estar em um formato razoável, conveniente para o seu idioma - linhas separadas por nova linha, uma lista de cadeias, etc:

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

Os títulos consistirão em uma série de palavras-chave separadas por um único espaço. As palavras-chave conterão apenas caracteres alfabéticos. As palavras-chave devem ser classificadas lexicograficamente . Os títulos serão únicos e as palavras-chave serão únicas em cada título, mas a mesma palavra-chave poderá existir em vários títulos. Se uma palavra-chave existir em mais de um título, a saída deverá listar cada aparência em uma ordem arbitrária . Por exemplo, dada esta entrada:

A Dugong
A Proboscis

Uma saída válida seria:

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

Ou:

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

Este é o - o vencedor é a solução mais curta em bytes. As brechas padrão não são permitidas.

JohnE
fonte
E se a mesma palavra-chave ocorrer mais de uma vez em um título? As ocorrências devem estar em ordem de aparência ou é permitida uma ordem arbitrária?
Peter Taylor
11
@ PeterTaylor: a partir da especificação, "Os títulos serão únicos e as palavras-chave serão únicas em cada título ..."
JohnE 27/11/2015

Respostas:

4

Pitão, 25 24 22 bytes

VSsm,Rdcd\ QAN:HGjG"<>

Experimente online.

Recebe entrada como uma matriz de linhas, como ["Green Sleeves","Time Was Lost"].

Explicação

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
fonte
Parece buggy - verifique o manuseio do título Time Was Time.
Peter Taylor
3
@PeterTaylor Citação do OP keywords will be unique within each title,.
PurkkaKoodari
2

Japonês , 55 bytes

Talvez isso possa ser mais curto, mas não sei como ...

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

Como 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
fonte
1

CJam, 41 36 32 bytes

q~{:AS/{A1$/"<>"@**}/}%{'</1=}$p

Teste aqui.

Martin Ender
fonte
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)

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

nimi
fonte