문자열을 고유하게 유지하면서 글자 제거


15

겸손한 견해로는 너무 적은 답을 가지고있는 멋진 도전과 견해 (투표 수와 투표 수에 기초한)에 영감을 받았습니다 .

주어진 문자열 목록을 (어떻게 든) 제공하고 주어진 문자열에서 제거 할 때 문자열의 총 길이 (남은 내용)를 가능한 한 작게 유지하는 문자 세트를 반환합니다 (각각의 방법으로). 고유 한 문자열이며 하나 이상의 문자 길이입니다.

예 :

"날"과 "날"이 주어짐; "ay"문자를 제거하면 지정된 문자열이 "D"및 "d"가되므로 "ay"를 반환합니다.

"Hello World!", "Hello world."및 "Hello world"가 제공됩니다. "Helo Wrd"문자 (공백 포함)를 제거하면 문자열이 "!", "w."및 "w"가되므로 "Helo Wrd"를 반환합니다.

"century", "decade", "year", "month", "week", "day", "hour", "minute"및 "second"가 주어집니다. 주어진 단어가 "centurdowi"일 때 "y", "a", "ya", "mh", "k", "ay", "h", "m", "s"이므로 "centurdowi"를 반환합니다. "이 (가) 제거되었습니다.

반환 된 집합의 순서와 형식은 중요하지 않습니다.


1
두 번째 경우가 잘못되었습니다. "Helo Wrd"는 "!", "w"로 총 길이가 4입니다. 그리고 "w".
Luke

1
@Luke 감사합니다. 내가 고칠 게 손으로 직접 수행하는 것은 오류가 발생하기 때문에 알고리즘이 필요하다는 것을 보여줍니다.
Adám

세 번째는 'centurdowi'가 'y', 'a', 'ya', 'mh', 'k', 'ay', 'h', 'm', 's'를 12.
누가


다른 도전에 도움이되는 도전을 사용하여 +1!
Luke

답변:


4

하스켈, 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

피스, 34

형식으로 입력을 ["century", "decade", "year", "month", "week", "day", "hour", "minute", "second"]받습니다. 언제나 그렇듯이 골프 팁을 부탁드립니다.

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.