Dizeleri benzersiz tutarken harfleri kaldırma


15

Benim düşünceme göre, çok az cevap veren bu harika (görüş ve oy sayısına dayanarak) mücadeleden esinlenilmiştir .

(Herhangi bir yolla) bir dizeler listesi verildiğinde, verilen dizelerden kaldırıldığında dizelerin toplam uzunluğunu (geriye kalan) mümkün olduğunca küçük bırakan (herhangi bir yolla) bir dizi harf döndürün. dize benzersiz ve en az bir karakter uzunluğunda.

Örnekler:

"Gün" ve "gün" verildiğinde; "ay" ifadesini döndürür, çünkü "ay" karakterleri kaldırıldığında belirtilen dizeler "D" ve "d" olur.

"Merhaba Dünya!", "Merhaba dünya." Ve "Merhaba dünya" verildi; return "Helo Wrd", "Helo Wrd" (boşluklu) karakterler kaldırıldığında dizelerin "!", "w." ve "w" olacağı için verir.

"Yüzyıl", "on yıl", "yıl", "ay", "hafta", "gün", "saat", "dakika" ve "ikinci" verilir; "centurdowi" ifadesini döndürür çünkü verilen kelimeler "y", "a", "ya", "mh", "k", "ay", "h", "m", "s" olur. " Kaldırıldı.

Döndürülen setin sırası ve biçimi önemli değildir.


1
İkinci durumunuz yanlış: "Helo Wrd", "!", "W" ile toplam 4 uzunluk verir. ve "w".
Luke

1
@ Teşekkürler teşekkürler. Bunu düzeltirim. Bu, el ile yapmak hataya eğilimli olduğu için bir algoritmaya ihtiyacımız olduğunu gösterir.
Adam

Üçüncüsü için, 'centurdowi' toplam uzunluğu için 'y', 'a', 'ya', 'mh', 'k', 'ay', 'h', 'm', 's' verir 12.
Luke


Başka bir meydan okumada size yardımcı olacak bir meydan okuma için +1!
Luke

Yanıtlar:


4

Haskell, 138130 bayt

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]

Kullanım örneği: f ["century", "decade", "year", "month", "week", "day", "hour", "minute", "second"]-> "centurdoki".

Bu kaba kuvvet yaklaşımıdır.

     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

Düzenleme: @Seeq 8 bayt kaydetmeme yardımcı oldu. Teşekkürler!


Peki ya map(#s)sen çevirmeye gerek yok notElem? EDIT: Yoksa sadece satır içi?
seequ

@Seeq: üzerinden arama yaparken map(#s), (#)olarak tanımlanmalıdır flip (filter . flip notElem). Ama tabii ki satır içi çizgi çok daha kısadır. Teşekkürler!
nimi

2

Pyth, 34

Biçimi girdi alır ["century", "decade", "year", "month", "week", "day", "hour", "minute", "second"]. Golf ipuçları her zaman olduğu gibi takdir edilmektedir.

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

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.