Ключевые слова в контексте

10

Эта задача основана на проблеме, описанной в D. Parnas, «О критериях, которые будут использоваться при разложении систем на модули» и разработанной в J. Morris, «Реальное программирование на функциональных языках» .

Напишите программу или функцию, которая берет список названий книг из stdinили в качестве аргумента в разумном и удобном формате для вашего языка. Например,

Green Sleeves
Time Was Lost

или

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

Вернуть или распечатать в stdoutалфавитном порядке список ключевых слов, отображая их контекст в исходных заголовках, заключив каждое ключевое слово в угловые скобки ( <и >). Как и при вводе, вывод может быть в приемлемом формате, который удобен для вашего языка - строки, разделенные новой строкой, список строк и т. Д .:

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

Заголовки будут состоять из ряда ключевых слов, разделенных одним пробелом. Ключевые слова будут содержать только буквенные символы. Ключевые слова должны быть отсортированы лексикографически . Названия будут уникальными, а ключевые слова будут уникальными в каждом заголовке, но одно и то же ключевое слово может существовать в нескольких заголовках. Если ключевое слово существует в более чем одном заголовке, выходные данные должны перечислять каждое появление в произвольном порядке . Например, учитывая этот вход:

A Dugong
A Proboscis

Действительный вывод будет либо:

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

Или:

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

Это - победителем является самое короткое решение в байтах. Стандартные лазейки запрещены.

Johne
источник
А что если одно и то же ключевое слово встречается в заголовке более одного раза? Должны ли случаи быть в порядке появления, или разрешен произвольный порядок?
Питер Тейлор
1
@PeterTaylor: из спецификации «Заголовки будут уникальными, а ключевые слова будут уникальными в каждом заголовке…»
JohnE

Ответы:

4

Pyth, 25 24 22 байта

VSsm,Rdcd\ QAN:HGjG"<>

Попробуйте онлайн.

Принимает ввод в виде массива строк, например ["Green Sleeves","Time Was Lost"].

объяснение

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
источник
Выглядит глючно - проверьте обработку заголовка Time Was Time.
Питер Тейлор
3
@PeterTaylor Цитирование из ОП keywords will be unique within each title.
PurkkaKoodari
2

Japt , 55 байт

Возможно, это можно сделать короче, но я не уверен, как ...

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

Как это работает

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
источник
1

Haskell, 113 байт

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

Пример использования: f ["Green Sleeves","Time Was Lost"]-> ["<Green> Sleeves","Time Was <Lost>","Green <Sleeves>","<Time> Was Lost","Time <Was> Lost"].

Ними
источник