Słowa kluczowe tytułu w kontekście

10

Wyzwanie to opiera się na problemie opisanym w D. Parnas, O kryteriach, które należy zastosować przy rozkładaniu systemów na moduły , i rozwiniętych w J. Morris, Real Programming in Functional Languages .

Napisz program lub funkcję, która pobiera listę tytułów książek z stdinlub jako argument, w rozsądnym, wygodnym formacie dla twojego języka. Na przykład,

Green Sleeves
Time Was Lost

lub

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

Wróć lub wydrukuj na stdoutalfabetycznej liście słów kluczowych, pokazując ich kontekst w oryginalnych tytułach, umieszczając każde słowo kluczowe w nawiasach klamrowych ( <i >). Podobnie jak w przypadku danych wejściowych, dane wyjściowe mogą być w rozsądnym formacie, który jest wygodny dla linii oddzielonych językiem, wierszy itp.:

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

Tytuły będą się składały z szeregu słów kluczowych oddzielonych pojedynczym odstępem. Słowa kluczowe będą zawierać tylko znaki alfabetyczne. Słowa kluczowe należy posortować leksykograficznie . Tytuły będą unikalne, a słowa kluczowe będą unikalne w obrębie każdego tytułu, ale to samo słowo kluczowe może istnieć w kilku tytułach. Jeśli słowo kluczowe istnieje w więcej niż jednym tytule, dane wyjściowe powinny zawierać listę każdego wystąpienia w dowolnej kolejności . Na przykład, biorąc pod uwagę te dane wejściowe:

A Dugong
A Proboscis

Prawidłowy wynik to:

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

Lub:

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

To jest - zwycięzca jest najkrótszym rozwiązaniem w bajtach. Standardowe luki są niedozwolone.

JohnE
źródło
Co jeśli to samo słowo kluczowe występuje w tytule więcej niż raz? Czy zdarzenia powinny być uporządkowane według kolejności występowania, czy też dozwolony jest dowolny porządek?
Peter Taylor
1
@PeterTaylor: ze specyfikacji „Tytuły będą unikalne, a słowa kluczowe będą unikalne w ramach każdego tytułu…”
JohnE

Odpowiedzi:

4

Pyth, 25 24 22 bajtów

VSsm,Rdcd\ QAN:HGjG"<>

Wypróbuj online.

Pobiera dane wejściowe jako tablicę wierszy, takich jak ["Green Sleeves","Time Was Lost"].

Wyjaśnienie

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
źródło
Wygląda na błędny - sprawdź obsługę tytułu Time Was Time.
Peter Taylor
3
@PeterTaylor Cytowanie z OP keywords will be unique within each title.
PurkkaKoodari
2

Japt , 55 bajtów

Być może można to skrócić, ale nie jestem pewien, jak ...

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

Jak to działa

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
ETHprodukcje
źródło
1

Haskell, 113 bajtów

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

Przykład użycia: f ["Green Sleeves","Time Was Lost"]-> ["<Green> Sleeves","Time Was <Lost>","Green <Sleeves>","<Time> Was Lost","Time <Was> Lost"].

nimi
źródło