文字列を一意に保ちながら文字を削除する


15

私の謙虚な意見では、答えが少なすぎるというこの素晴らしい(意見と投票数に基づく)チャレンジに触発されました。

文字列のリストを(何らかの方法で)与えられ、与えられた文字列から削除されたときに、文字列の合計の長さ(残っているもの)を可能な限り小さくしながら、文字列のセットを(何らかの方法で)返します一意の文字列と少なくとも1文字の長さ。

例:

「日」と「日」を指定します。文字「ay」が削除されると、指定された文字列は「D」と「d」になるため、「ay」を返します。

「Hello World!」、「Hello world。」、および「Hello world」を指定します。文字 "Helo Wrd"(スペースを含む)が削除されると、文字列が "!"、 "w。"、および "w"になるため、 "Helo Wrd"が返されます。

「世紀」、「10年」、「年」、「月」、「週」、「日」、「時間」、「分」、および「秒」を指定します。文字「centurdowi」の場合、指定された単語は「y」、「a」、「ya」、「mh」、「k」、「ay」、「h」、「m」、「s」になるため、「centurdowi」 」が削除されます。

返されるセットの順序と形式は重要ではありません。


1
2番目のケースは間違っています:「Helo Wrd」は「!」、「w」で合計4を示します。および「w」。
ルーク

1
@ルークありがとう。それを修正します。これは、手作業で行うとエラーが発生しやすいため、アルゴリズムが必要であることを示しています。
アダム

3番目の場合、「centurdowi」は「y」、「a」、「ya」、「mh」、「k」、「ay」、「h」、「m」、「s」を合計の長さで生成します12.
ルーク


チャレンジを使用して別のチャレンジに役立つ場合は+1!
ルーク

回答:


4

Haskell、138130バイト

import Data.List
c=concat
f i=snd$minimum[(length$c q,s)|s<-subsequences$nub$c i,q<-[map(filter(`notElem`s))i],nub q==q,all(>"")q]

使用例:f ["century", "decade", "year", "month", "week", "day", "hour", "minute", "second"]-> "centurdoki"

これはブルートフォースアプローチです。

     s<-subsequences$nub$c i  -- concatenate input i to a single string, remove
                              -- duplicates and make a list of all subsequences
       q<-[map(filter(...))i] -- remove chars appearing in subsequence s from all
                              -- input words, call result q
          nub q==q            -- keep those s where q has no duplicates (i.e. each
                              -- resulting string is unique) and
            all(>"")q         -- contains no empty strings
  (length$c q,s)              -- make pairs from all kept s, where the first element
                              -- is the combines length of all strings in q,
                              -- second element is s itself
snd$minimum                   -- find minimum of those pairs and discard length

編集:@Seeqは8バイトの節約に役立ちました。ありがとう!


どうかmap(#s)、ひっくり返す必要はないのnotElem?編集:または、それをインラインにできませんでしたか?
seequ

@Seeq:経由map(#s)で呼び出す場合は、(#)として定義する必要がありますflip (filter . flip notElem)。しかし、もちろんインライン化ははるかに短くなります。ありがとう!
nimi

2

Pyth、34

形式で入力を取ります["century", "decade", "year", "month", "week", "day", "hour", "minute", "second"]。いつものように、ゴルフのヒントは大歓迎です。

hh.mlsebfqlQl{eTf!}keTm,dm-kdQy{sQ

2

Pyth、24バイト

hols-RNQf<}kJ-RTQ{IJy{sQ

オンラインでお試しください。 テストスイート。

最後のテストケースの実行には少し時間がかかることに注意してください。

のような配列形式で入力を受け取ります["Day", "day"]

私が見つけた別の興味深いものとisaacgが 改善されました(24バイトも)

-J{sQhlDsM.A#f{ITm-RdQyJ

私は24バイトに第二のアプローチを減らすことができました。-J{sQhlDsM.A#f{ITm-RdQyJ ここに
isaacg
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.