Bağlamda Başlık Anahtar Kelimeleri


10

Bu zorluk, D. Parnas, sistemlerin modüllere ayrıştırılmasında kullanılacak ölçütler üzerinde ve J. Morris, İşlevsel Dilde Gerçek Programlama bölümünde açıklanan bir soruna dayanmaktadır .

stdinDiliniz için makul ve uygun bir biçimde kitap başlıklarının bir listesini bağımsız değişken olarak veya bağımsız değişken olarak alan bir program veya işlev yazın . Örneğin,

Green Sleeves
Time Was Lost

veya

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

stdoutHer bir anahtar kelimeyi açılı ayraçlar ( <ve >) içine alarak bağlamlarını orijinal başlıklar içinde gösteren, alfabetikleştirilmiş anahtar kelime listesine dönün veya yazdırın . Girişte olduğu gibi, çıktı dil-satır-satırla ayrılmış satırlarınız, bir dize listesi vb. İçin uygun olan makul bir biçimde olabilir:

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

Başlıklar, tek bir boşlukla ayrılmış bir dizi anahtar kelimeden oluşacaktır. Anahtar kelimeler yalnızca alfabetik karakterler içerecektir. Anahtar kelimeler sözlükbilimsel olarak sıralanacaktır . Başlıklar benzersiz olacak ve anahtar kelimeler her başlıkta benzersiz olacak, ancak aynı anahtar kelime birkaç başlıkta bulunabilir. Bir anahtar kelime birden fazla başlıkta mevcutsa, çıktının her görünümü rastgele bir sırada listelemesi gerekir . Örneğin, bu girdi göz önüne alındığında:

A Dugong
A Proboscis

Geçerli bir çıktı:

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

Veya:

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

Bu - kazanan bayt cinsinden en kısa çözümdür. Standart boşluklara izin verilmez.


Aynı anahtar kelimenin bir başlıkta birden çok kez gerçekleşmesi durumunda ne olur? Oluşumlar görünüm sırayla olmalı mı yoksa keyfi düzene izin veriliyor mu?
Peter Taylor

1
@PeterTaylor: spec'ten, "Başlıklar benzersiz olacak ve anahtar kelimeler her başlıkta benzersiz olacak ..."
JohnE

Yanıtlar:


4

Pyth, 25 24 22 bayt

VSsm,Rdcd\ QAN:HGjG"<>

Çevrimiçi deneyin.

Girdiyi bir satır dizisi gibi alır ["Green Sleeves","Time Was Lost"].

açıklama

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

Buggy görünüyor - başlığın kullanımını kontrol edin Time Was Time.
Peter Taylor

3
@PeterTaylor OP'den alıntı keywords will be unique within each title,.
PurkkaKoodari

2

Japt , 55 bayt

Belki bu daha kısa yapılabilir, ama nasıl olduğundan emin değilim ...

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

Nasıl çalışır

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 bayt

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

Kullanım örneği: f ["Green Sleeves","Time Was Lost"]-> ["<Green> Sleeves","Time Was <Lost>","Green <Sleeves>","<Time> Was Lost","Time <Was> Lost"].

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.