Ключові слова заголовка в контексті


10

Цей виклик ґрунтується на проблемі, описаній в Д. Парнас, на критеріях, які слід використовувати при декомпозиції систем на модулі , та детально розроблених в 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>

Це - переможець - найкоротше рішення в байтах. Стандартні лазівки заборонені.


А як бути, якщо одне ключове слово зустрічається в заголовку більше одного разу? Чи мають бути події в порядку появи чи дозволений довільний порядок?
Пітер Тейлор

1
@PeterTaylor: із специфікації "Заголовки будуть унікальними, а ключові слова будуть унікальними у кожному заголовку ..."
Джон

Відповіді:


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

Виглядає баггі - перевірте обробку заголовка 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


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"].

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.