Titel Schlüsselwörter im Kontext

10

Diese Herausforderung basiert auf einem Problem, das in D. Parnas, Über die Kriterien für die Zerlegung von Systemen in Module , beschrieben und in J. Morris, Real Programming in Functional Languages , erläutert wurde .

Schreiben Sie ein Programm oder eine Funktion, die eine Liste von Buchtiteln aus stdinoder als Argument in einem für Ihre Sprache angemessenen, praktischen Format verwendet. Zum Beispiel,

Green Sleeves
Time Was Lost

oder

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

Kehren Sie zu stdouteiner alphabetischen Liste der Schlüsselwörter zurück oder drucken Sie sie aus. Zeigen Sie deren Kontext innerhalb der Originaltitel an, indem Sie jedes Schlüsselwort in spitze Klammern ( <und >) setzen. Wie bei der Eingabe kann die Ausgabe in einem angemessenen Format erfolgen, das für Ihre durch Zeilenumbrüche getrennten Zeilen, eine Liste von Zeichenfolgen usw. geeignet ist:

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

Titel bestehen aus einer Reihe von Schlüsselwörtern, die durch ein einzelnes Leerzeichen getrennt sind. Schlüsselwörter enthalten nur alphabetische Zeichen. Schlüsselwörter sind lexikographisch zu sortieren . Titel sind eindeutig und Schlüsselwörter sind in jedem Titel eindeutig, aber dasselbe Schlüsselwort kann in mehreren Titeln vorhanden sein. Wenn ein Schlüsselwort in mehr als einem Titel vorhanden ist, sollte die Ausgabe jedes Erscheinungsbild in einer beliebigen Reihenfolge auflisten . Zum Beispiel bei dieser Eingabe:

A Dugong
A Proboscis

Eine gültige Ausgabe wäre entweder:

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

Oder:

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

Dies ist - der Gewinner ist die kürzeste Lösung in Bytes. Standardlücken sind nicht zulässig.

JohnE
quelle
Was ist, wenn dasselbe Schlüsselwort in einem Titel mehrmals vorkommt? Sollten die Ereignisse in der Reihenfolge ihres Auftretens sein oder ist eine willkürliche Reihenfolge zulässig?
Peter Taylor
1
@ PeterTaylor: Aus der Spezifikation: "Titel werden eindeutig sein und Schlüsselwörter werden in jedem Titel eindeutig sein ..."
JohnE

Antworten:

4

Pyth, 25 24 22 Bytes

VSsm,Rdcd\ QAN:HGjG"<>

Probieren Sie es online aus.

Nimmt die Eingabe als Array von Zeilen wie ["Green Sleeves","Time Was Lost"].

Erläuterung

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
quelle
Sieht fehlerhaft aus - überprüfen Sie den Umgang mit dem Titel Time Was Time.
Peter Taylor
3
@PeterTaylor Zitat aus dem OP , keywords will be unique within each title.
PurkkaKoodari
2

Japt , 55 Bytes

Vielleicht könnte dies kürzer gemacht werden, aber ich bin nicht sicher, wie ...

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

Wie es funktioniert

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
ETH-Produktionen
quelle
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)

Anwendungsbeispiel: f ["Green Sleeves","Time Was Lost"]-> ["<Green> Sleeves","Time Was <Lost>","Green <Sleeves>","<Time> Was Lost","Time <Was> Lost"].

Nimi
quelle